opgaver:Uge4
Pia Jensen (Talk | contribs) |
Pia Jensen (Talk | contribs) |
||
Line 89: | Line 89: | ||
=== Spørgsmål 2 - Flere måleserier === | === Spørgsmål 2 - Flere måleserier === | ||
− | Kør 100 måleserier og lav histogrammer over fitværdierne. Brug | + | Kør 100 måleserier og lav histogrammer over fitværdierne. Brug histogrammerne til at bestemme præcisionen af eksperimentet. |
+ | {{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
+ | Du skal bare bruge den samme kode som du brugte til spørgsmål 1, men nu skal du "pakke" den ind i et loop, hvor du yderligere gemmer dine fit-parametre i arrays, så de kan plottes bagefter. | ||
+ | {{hidden end}} | ||
{{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | {{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
+ | For at gøre dette, skal man lave et loop over adskillige data-simulationer og fits. Som det første skal man initialisere arrays der skal gemme fit-parametrene: | ||
+ | :<code>N = 100;</code> | ||
+ | :<code>a_fit = zeros(1,N);</code> | ||
+ | :<code>b_fit = zeros(1,N);</code> | ||
+ | :<code>x0_fit = zeros(1,N);</code> | ||
+ | :<code>sig_fit = zeros(1,N);</code> | ||
+ | |||
+ | Herefter kan man starte sit loop lige før man udregner sine eksperiment-data, altså | ||
+ | |||
+ | :<code>for j = 1:N</code> | ||
+ | ::<code>y_exp = abs(round( y_model + err_model .* randn(size(err_model)) ));</code> | ||
+ | ::<code>...</code> | ||
+ | |||
+ | Fit parametrene gemmes, og så kan loopet stoppes igen, | ||
+ | |||
+ | :<code>...</code> | ||
+ | ::<code>a_fit(j) = f1.a/t; | ||
+ | ::<code>x0_fit(j) = f1.b; | ||
+ | ::<code>sig_fit(j) = f1.c; | ||
+ | ::<code>b_fit(j) = f1.d/t; | ||
+ | :<code>end</code> | ||
+ | |||
+ | Herefter kan man lave histogrammer over parametrene ved hjælp af MATLAB's <code>hist</code> funktion, og se på formen af dem. F.eks. kan man bestemme bredden af distributionerne, for at se hvor nemt det var for fittet at finde den rigtige værdi. | ||
{{hidden end}} | {{hidden end}} | ||
Line 97: | Line 123: | ||
(SVÆRT) Hvis der er 100 sekunder til rådighed, hvordan skal målingen så planlægges for at bestemme liniens midtpunkt bedst? Og hvad med liniens bredde? | (SVÆRT) Hvis der er 100 sekunder til rådighed, hvordan skal målingen så planlægges for at bestemme liniens midtpunkt bedst? Og hvad med liniens bredde? | ||
{{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} | {{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
− | + | Tænk over hvordan du ville gøre hvis du faktisk sad ved et eksperiment og intet vidste på forhånd. Ville du bare gå i gang fra en ende af og måle punkt efter punkt, eller ville du hoppe rundt og håbe på at du var heldig? Tænk over forskellige fordele og ulemper. | |
{{hidden end}} | {{hidden end}} | ||
{{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | {{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
+ | Som en første iteration kan man se hvad der sker med statistikken hvis man måler på en ligelidt opdelt linie, med samme tælletid for hvert punkt. Start med at omdefinere din værdi af <code>t</code> til at blive udregnet med | ||
+ | |||
+ | :<code>t_meas = 100;</code> | ||
+ | :<code>t = t_meas / length(x_exp);</code> | ||
+ | |||
+ | hvor <code>t_meas</code> er den totale tid der skal måles i. Nu kan du køre dit loop, og se på distributionen af dine fitte-parametre. | ||
+ | |||
+ | |||
+ | :<code></code> | ||
{{hidden end}} | {{hidden end}} | ||
Revision as of 10:46, 7 March 2012
I denne opgave skal I, lige som i sidste uge, fabrikere jeres egne data - denne gang en Gaussisk linieprofil med en bestemt bredde og placering, med Poisson statistik på tælletallene.
Contents |
Opgave 1 - Spektrometer
Vi forestiller os et spektrometer, der tæller fotoner som funktion af bølgelængde; én bølgelængde ad gangen. Vi skal måle en enkelt spektrallinie. Liniens amplitude er 100 tællinger per sekund, liniens centrum 5000 Å, og den har bredde ($\sigma$) 50 Å. Der er en baggrund på 10 tællinger per sekund. Usikkerheden på tællinger er givet som $\sqrt{N}$ tællestatistik, og antages gaussisk.
Spørgsmål 1 - Simulation af data
Simulér en måleserie fra 4500 Å til 5500 Å med step af 10 Å, ét sekund per punkt. Brug MATLAB fit
funktionen til at fitte en Gaussisk linieprofil til dataen. Vis de simulerede data og det bedste fit i samme plot.
Ligesom i sidste uge skal vi simulere nogle støjede data ud fra en kendt model. Start med at lave dine model-data, og tilføj så støj ved at lægge et tal til hvert af punkternes tælletal-værdi. Støjen skal være et tal der er Gaussisk fordelt omkring nul, med en bredde der er usikkerheden på punktet (og usikkerheden på punktet er jo givet ved tællestatistik!). Husk at tælletal er positive heltal, så du er nødt til at runde støjen op eller ned til heltal.
Det kan være en god idé at læse lidt i MATLAB hjælpen om funktionerne randn
, round
og abs
.
Det er vigtigt at holde styr på forskellen mellem bredden af spektrogram-peaken som du laver data over, og bredden på den støj du lægger til dine simulerede datapunkter.
Først defineres parametrene for den Gaussiske linieprofil-model. Her defineres signalets amplitude a
, baggrundens amplitude d
, centrum af peaken x0
og bredden af peaken sig
a = 100;
b = 10;
x0 = 5000;
sig = 50;
videre skal akserne for eksperimentet bestemmes; start og slut for hvor der skal måles, x_min
og x_max
, samt step-størrelsen x_step
.
x_min = 4500;
x_max = 5500;
x_step = 10;
Med disse definitioner er det nu muligt automatisk at lave sin x
-akse med
x_exp = x_min : x_step : x_max;
og til sidst kan man også finde hvor lang tid der måles per datapunkt,
t = 1;
Nu kan man udregne sit model-datasæt ved at indsætte alle sine informationer i en Gaussisk funktion,
y_model = t * a * exp( - (( x_exp - x0 ).^2) ./ (2*sig^2) ) + t * b;
Nu er det tid til at lægge støj på punkterne, så man får et simuleret datasæt. Først og fremmest findes en vektor der indeholder usikkerheden på hvert punkt af sin model. Modellen er for tælletal, så denne usikkerhed er bare $\sqrt{N}$, og
err_model = sqrt(y_model);
Det nye datasæt kan så laves ved at lægge en Gaussisk støj med bredden givet element-vist i err_model
, runde af til nærmeste heltal, og til sidst sørge for at tallet er positivt:
y_exp = abs(round( y_model + err_model .* randn(size(err_model)) ));
Usikkerheden på de simulerede datapunkter er dog ikke den usikkerhed man fandt for modellen. Hvis man målte disse punkter i den virkelige verden ville man i stedet bruge
err_exp = sqrt(y_exp);
Man kan nu lave et fit til de simulerede data, ved hjælp af MATLAB's indbyggede fit
funktion. Denne gang skal man fitte til en funktion man selv skriver ind:
f1 = fit(x_exp',y_exp','a*exp(-((x-b).^2)/(2*c^2))+d',...
'Startpoint', [a*t x0 sig b*t]);
Her er Startpoint
option'en de første gæt til de fire parametre, altså amplitude, centrum, bredde og baggrund. Her er de bare givet som modellens værdier - men i den virkelige verden kender man selvfølgelig ikke modellen perfekt, og man må bare give nogle cirka-gæt.
De fundne fit-parametre kan man få fra f1
objektet. Selve fit
funktionen kalder dem for a
, b
, c
og d
- efter hvad der blev skrevet som fit-funktion. De numeriske værdier af de bedste parameter-værdier fås så ved f.eks. f1.a
. De fire interessante fittede parametre er altså
a_fit = f1.a/t;
x0_fit = f1.b;
sig_fit = f1.c;
b_fit = f1.d/t;
og med disse kan man udregne fit-linien
x_fit = x_min:0.05:x_max;
y_fit = t*a_fit(j)*exp(-((x_fit-x0_fit(j)).^2)./(2*sig_fit(j)^2)) + t*b_fit(j);
Til sidst kan man plotte de simulerede datapunkter sammen med fit-linien,
figure
errorbar(x_exp,y_exp,err_exp,'b.','MarkerFaceColor', [0.4 0.4 0.8],...
'MarkerEdgeColor',[0.4 0.4 0.8])
hold on
plot(x_fit,y_fit,'g-')
axis([x_min-50 x_max+50 0 (a+b)*1.2*t])
xlabel('Bølgelængde [Å]')
ylabel('Intensitet [tællinger/s]')
Figuren kan ses her til højre.
Spørgsmål 2 - Flere måleserier
Kør 100 måleserier og lav histogrammer over fitværdierne. Brug histogrammerne til at bestemme præcisionen af eksperimentet.
Du skal bare bruge den samme kode som du brugte til spørgsmål 1, men nu skal du "pakke" den ind i et loop, hvor du yderligere gemmer dine fit-parametre i arrays, så de kan plottes bagefter.
For at gøre dette, skal man lave et loop over adskillige data-simulationer og fits. Som det første skal man initialisere arrays der skal gemme fit-parametrene:
N = 100;
a_fit = zeros(1,N);
b_fit = zeros(1,N);
x0_fit = zeros(1,N);
sig_fit = zeros(1,N);
Herefter kan man starte sit loop lige før man udregner sine eksperiment-data, altså
for j = 1:N
y_exp = abs(round( y_model + err_model .* randn(size(err_model)) ));
...
Fit parametrene gemmes, og så kan loopet stoppes igen,
...
a_fit(j) = f1.a/t;
- <code>x0_fit(j) = f1.b;
- <code>sig_fit(j) = f1.c;
- <code>b_fit(j) = f1.d/t;
- <code>end
Herefter kan man lave histogrammer over parametrene ved hjælp af MATLAB's hist
funktion, og se på formen af dem. F.eks. kan man bestemme bredden af distributionerne, for at se hvor nemt det var for fittet at finde den rigtige værdi.
Spørgsmål 3 - Planlægning af måling
(SVÆRT) Hvis der er 100 sekunder til rådighed, hvordan skal målingen så planlægges for at bestemme liniens midtpunkt bedst? Og hvad med liniens bredde?
Tænk over hvordan du ville gøre hvis du faktisk sad ved et eksperiment og intet vidste på forhånd. Ville du bare gå i gang fra en ende af og måle punkt efter punkt, eller ville du hoppe rundt og håbe på at du var heldig? Tænk over forskellige fordele og ulemper.
Som en første iteration kan man se hvad der sker med statistikken hvis man måler på en ligelidt opdelt linie, med samme tælletid for hvert punkt. Start med at omdefinere din værdi af t
til at blive udregnet med
t_meas = 100;
t = t_meas / length(x_exp);
hvor t_meas
er den totale tid der skal måles i. Nu kan du køre dit loop, og se på distributionen af dine fitte-parametre.
Spørgsmål 4 - Stor baggrund
(SVÆRT) Lad baggrunden være 100 tællinger per sekund og amplituden være 10 tællinger per sekund. Hvor længe skal der tælles for at det kan afgøres, om der er en peak (amplitude signifikant større end nul)?