opgaver:Uge3
Pia Jensen (Talk | contribs) |
Pia Jensen (Talk | contribs) |
||
Line 1: | Line 1: | ||
− | I denne opgave skal I arbejde med fitning som forklaret i Taylor kapitel 8. I skal her selv lave et datasæt, og lærer derfor også hvordan man genererer tilfældige tal i MATLAB. Opgave 2 og 3 er uafhængige, og kan laves i den rækkefølge I har lyst til. | + | I denne opgave skal I arbejde med fitning som forklaret i Barlow kapitel 6<!--Taylor kapitel 8-->. I skal her selv lave et datasæt, og lærer derfor også hvordan man genererer tilfældige tal i MATLAB. Opgave 2 og 3 er uafhængige, og kan laves i den rækkefølge I har lyst til. |
'''Denne side er stadig ikke blevet opdateret til 2013 versionen af kurset, hvor vi ikke længere bruger Taylors! Denne retning bliver lavet i løbet af weekenden!''' | '''Denne side er stadig ikke blevet opdateret til 2013 versionen af kurset, hvor vi ikke længere bruger Taylors! Denne retning bliver lavet i løbet af weekenden!''' | ||
Line 7: | Line 7: | ||
=== Spørgsmål 1 - Lineær model === | === Spørgsmål 1 - Lineær model === | ||
− | Antag at I har en lineær model som i Taylor afsnit 8.2, | + | Antag at I har en lineær model som i Barlow afsnit 6.2<!--Taylor afsnit 8.2-->, |
:$y = A + B x .$ | :$y = A + B x .$ | ||
Line 13: | Line 13: | ||
Vælg passende værdier af <code>A</code> og <code>B</code> og lav en vektor <code>x</code> med målepunkter, f.eks. <code>A = 0</code>, <code>B = 1</code>, <code>x = -2:0.1:2</code>. Lav nu en vektor med den "sande" <code>y</code> ud fra modellen. Vælg en usikkerhed for målingerne, og læg en normalfordelt støj til hver måling - brug MATLAB funktionen <code>randn()</code>. Plot målingerne (med usikkerhederne) og den "sande" model i samme plot. | Vælg passende værdier af <code>A</code> og <code>B</code> og lav en vektor <code>x</code> med målepunkter, f.eks. <code>A = 0</code>, <code>B = 1</code>, <code>x = -2:0.1:2</code>. Lav nu en vektor med den "sande" <code>y</code> ud fra modellen. Vælg en usikkerhed for målingerne, og læg en normalfordelt støj til hver måling - brug MATLAB funktionen <code>randn()</code>. Plot målingerne (med usikkerhederne) og den "sande" model i samme plot. | ||
− | Beregn lineær regression ud fra | + | Beregn lineær regression ud fra Barlow og find de estimerede værdier for <code>A</code> og <code>B</code>, og beregn den fittede modelværdi, <code>y_fit</code>. Plot <code>y_fit</code> oveni det forrige plot og se hvor godt fittet er. Beregn den reducerede $\chi^2$, givet ved |
:$\dfrac{\chi^2}{N-P} ,$ | :$\dfrac{\chi^2}{N-P} ,$ | ||
Line 19: | Line 19: | ||
hvor $N$ er antal datapunkter og $P$ er antal fit-parametre. | hvor $N$ er antal datapunkter og $P$ er antal fit-parametre. | ||
{{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} | {{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
− | Start med at udregne selve den teoretiske linie <code>y_model</code>, ved at definere <code>A</code>, <code>B</code> og din <code>x</code>-akse. Definér derefter en <code>sigma</code> du vil bruge som din usikkerhed. Så kan din y udregnes som <code>y_model</code> plus en vektor der består af Gaussisk fordelte tal med spredning <code>sigma</code> og centrum nul. | + | Start med at udregne selve den teoretiske linie <code>y_model</code>, ved at definere <code>A</code>, <code>B</code> og din <code>x</code>-akse. Definér derefter en <code>sigma</code> du vil bruge som din usikkerhed. Så kan din $y$ udregnes som <code>y_model</code> plus en vektor der består af Gaussisk fordelte tal med spredning <code>sigma</code> og centrum nul. |
{{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}} |
Revision as of 13:36, 3 May 2013
I denne opgave skal I arbejde med fitning som forklaret i Barlow kapitel 6. I skal her selv lave et datasæt, og lærer derfor også hvordan man genererer tilfældige tal i MATLAB. Opgave 2 og 3 er uafhængige, og kan laves i den rækkefølge I har lyst til.
Denne side er stadig ikke blevet opdateret til 2013 versionen af kurset, hvor vi ikke længere bruger Taylors! Denne retning bliver lavet i løbet af weekenden!
Contents |
Opgave 1 - Fitning
Spørgsmål 1 - Lineær model
Antag at I har en lineær model som i Barlow afsnit 6.2,
- $y = A + B x .$
Vælg passende værdier af A
og B
og lav en vektor x
med målepunkter, f.eks. A = 0
, B = 1
, x = -2:0.1:2
. Lav nu en vektor med den "sande" y
ud fra modellen. Vælg en usikkerhed for målingerne, og læg en normalfordelt støj til hver måling - brug MATLAB funktionen randn()
. Plot målingerne (med usikkerhederne) og den "sande" model i samme plot.
Beregn lineær regression ud fra Barlow og find de estimerede værdier for A
og B
, og beregn den fittede modelværdi, y_fit
. Plot y_fit
oveni det forrige plot og se hvor godt fittet er. Beregn den reducerede $\chi^2$, givet ved
- $\dfrac{\chi^2}{N-P} ,$
hvor $N$ er antal datapunkter og $P$ er antal fit-parametre.
Start med at udregne selve den teoretiske linie y_model
, ved at definere A
, B
og din x
-akse. Definér derefter en sigma
du vil bruge som din usikkerhed. Så kan din $y$ udregnes som y_model
plus en vektor der består af Gaussisk fordelte tal med spredning sigma
og centrum nul.
Start med at definere de to konstanter, din x
-akse og den usikkerhed du gerne vil have på punkterne, her f.eks.
A_model = 0;
B_model = 1;
sigma = 0.5;
x = -2:0.1:2;
Nu kan du udregne modellens y
-værdi direkte ved
y_model = A_model + B_model*x;
For at få usikkerheder på punkterne, kan du starte med at lave et array af samme størrelse som dit datasæt, der indeholder usikkerhederne for hvert punkt (her bare den samme usikkerhed for alle punkter)
sigma_y = sigma*ones(size(y_model));
Herefter udregner du dine y
-værdier med støj på ved at bruge randn()
funktionen
y = y_model + sigma_y.*randn(size(y_model));
Nu kan du plotte din model sammen med dine "målepunkter",
figure
errorbar(x,y,sigma_y,'bo','MarkerFaceColor', [0.4 0.4 0.8],...
'MarkerEdgeColor',[0.4 0.4 0.8])
hold on
plot(x,y_model,'r-','LineWidth',2)
xlabel('Datapunkter x')
ylabel('Datapunkter y')
En sådan figur er vist her til højre.
Regressionsparametrene kan udregnes med
N = length(x);
Sy = sum(y);
Sx = sum(x);
Sxx = sum(x.^2);
Sxy = sum(x.*y);
Delta = N*Sxx-Sx^2;
A_fit = ( Sxx*Sy - Sx*Sxy )/Delta;
B_fit = ( N*Sxy - Sx*Sy )/Delta;
og fit-linien er så fundet til at være
y_fit = A_fit + B_fit*x;
Denne linie plottes oven på model-linien og punkterne med
plot(x,y_fit,'g-','LineWidth',2)
og så får man figuren til højre. Den reducerede $\chi^2$ findes til sidst med koden
chi2 = sum((y-y_fit).^2 ./ sigma_y.^2);
chi2red = chi2/(N-2);
Spørgsmål 2 - Gentagelse
Gentag dette "numeriske forsøg" et antal gange (f.eks. 100) og gem for hver gang fittets parametre. Brug hist()
til at finde fordelingen af A
, B
, og reduceret $\chi^2$. Sammenlign med den estimerede usikkerhed på A
og B
, og undersøg evt. korrelationen mellem A
og B
(plot f.eks. A
vs. B
).
Start med at bruge den kode du lavede til spørgsmål a, og lav så et loop uden om det hele. I slutningen af loopet skal du gemme A
, B
og din reducerede $\chi^2$ i et array - så du kan plotte alle værdierne bagefter.
Man kan genbruge al sin kode fra spørgsmål a til at lave sit loop. Definitionen af A_model
, B_model
, sigma
, x
, y_model
og sigma_y
får lov til at blive, og så skal man forberede sit loop med antal gange man vil køre det, og tre lister til at gemme de resultater man får,
N_iter = 100;
A_liste = zeros(1,N_iter);
B_liste = zeros(1,N_iter);
chi2_liste = zeros(1,N_iter);
Herefter starter man sit loop lige før udregningen af y
, således at hvert loop laver en ny række punkter med anderledes støj.
for i = 1:N_iter
y = y_model + sigma_y.*randn(size(y_model));
...
Udregningen af regressionsparametrene er helt som før. Til sidst skal man gemme sine resultater i sine arrays,
...
A_liste(i) = A_fit;
B_liste(i) = B_fit;
chi2_liste(i) = chi2red;
end
Disse arrays kan man nu se lidt på. F.eks. kan man lave histogrammer eller korrelationsplots med hist
eller scatter
.
Spørgsmål 3 - Automatisk fitning i MATLAB
Prøv at anvende MATLABs fittefunktion fit(x,y,'funktion')
og sammenlign med jeres egen lineære regression.
Den automatiske fitning i MATLAB kan bruges med koden
[res good] = fit(x',y','poly1')
her er poly1
den indbyggede lineære funktion, men man kan også selv skrive sin funktion ind (se på MATLAB hjælp siden for fit
). Fittet kan nu plottes sammen med datapunkterne og model-linien med
figure
errorbar(x,y,sigma_y,'ro')
hold on
plot(x,y_model,'b-')
plot(x,res(x),'g-')
xlabel('Datapunkter x')
ylabel('Datapunkter y')
Denne figur kan ses til højre.
Samlede løsninger
- Et samlet dokument med MATLAB kode til at løse alle opgaverne ovenfor kan hentes her: opgaver_uge3_fits.m