Harjoitus 6 -- Ratkaisut

1

Ei kommenttia.

2

Haetaan data tiedostosta.

SetDirectory["/home/ofys/jmattas/" ]
(*SetDirectory["c:/documents and settings/mattas/desktop/teaching/atk2/harjoitukset/h06"]*)

Clear[t,x,y]
t=Import["h06_data.txt","Table"];
n=Length[t];
g=ListPlot[t,ImageSize->Small]

Sovitetaan tähän datapisteistöön suora pienimmän neliösumman menetelmällä (ks. luennot). Lasketaan sovituksessa tarvittavat summat muuttujiin sx, sy, sxy ja sxx.

For[i=1;sx=0;sy=0;sxy=0;sxx=0,i≤n,i++,
x=t[[i,1]];y=t[[i,2]];
sx+=x;
sy+=y;
sxy+=x*y;
sxx+=x*x;]

Lasketaan suoran kulmakerroin ja vakiotermi:

a=((n sxy-sx sy)/(n sxx-(sx^2)));b=((sy sxx-sx sxy)/(n sxx-(sx^2)));
s[x_]:=a x+b;

Last[t] antaa taulukon t viimeisen lukuparin. Sen 1. alkio saadaan tietysti Last[t][[1]].

Show[g,Plot[s[x],{x,0,Last[t][[1]]}],ImageSize->Small]

Sovitus saadaan laskettua hyödyntämällä enemmän Mathematican valmiita funktioita. Merkintä t[[All,i]] antaa t:n i:nnen pystyrivin, ts. t[[All,1]] antaa kaikkien lukuparien 1. alkiot.

sx=Total[t[[All,1]]];
sy=Total[t[[All,2]]];
sxx=Total[((t[[All,1]])^2)];
sxy=Total[t[[All,1]]*t[[All,2]]];

s[x_]:=((n sxy-sx sy)/(n sxx-(sx^2)))x+((sy sxx-sx sxy)/(n sxx-(sx^2)));
Show[g,Plot[s[x],{x,0,Last[t][[1]]}],ImageSize->Small]

Sovitussuoran kulmakerroin on siis komponentin konduktanssi, resistanssin käänteisarvo:

Print["Konduktanssi: ",a," Siemens"]
Print["Resistanssi: ",(a^(-1))," Ohm"]

Yo. sovitus ei kulje origon kautta. Origon kautta kulkevalle suoralle pitää laskea sovitusparametrit uudestaan. Minimoitavaksi tulee summa
	(∑_(i=1)^n)(((a (Subscript[x, i])-(Subscript[y, i])))^2),
josta saadaan derivoimalla a:n suhteen ja asettamalla derivaatta nollaksi:
	a=((∑(Subscript[x, i])(Subscript[y, i]))/(∑((Subscript[x, i])^2))).

a=(sxy/sxx);

Show[g,Plot[a x,{x,0,Last[t][[1]]}],ImageSize->Small]

Saadaan hieman korkeampi konduktanssi.

Print["Konduktanssi: ",a," Siemens"]
Print["Resistanssi: ",(a^(-1))," Ohm"]

Tehdään sovitus vielä Mathematican valmiilla funktiolla Fit. Se ottaa argumenteikseen datapisteistön, listan funktioista joiden lineaarikombinaationa sovitusta etsitään, ja kolmantena mitä symbolia käytetään muuttujana sovituksen tuloksessa.

y=Fit[t,{x},x]

Tai ei-origon-kautta-kulkeva suora:

y=Fit[t,{1,x},x]

Tarkistetaan tulos:

Show[Plot[y,{x,0,t[[n,1]]}],Plot[s[x],{x,0,t[[n,1]]}],ImageSize->Small]

3

Regress-funktio antaa paljon statistiikkaa sovituksen hyvyydestä. Ainut meidän kannaltamme olennainen tilastollinen parametri lienee SE, eli Standard Error. Regress-funktion argumentit ovat samat kuin Fit-funktiolle, mutta se ei palauta suoraan sovitusfunktiota. Regress-funktio löytyy seuraavasta paketista:

<<LinearRegression`

Regress[t,{x},x]

Huomataan, että Regress lisää automaattisesti vakiotermin sovitukseen. Se voidaan pakottaa pois asetuksella IncludeConstant->False

Regress[t,{x},x,IncludeConstant->False]

Jos et halua lukea virheilmoituksia, käytä Quiet-funktiota.

Regress[t,{x},x,IncludeConstant->False]//Quiet

Regress palauttaa listan sääntöjä, joiden avulla päästään käsiksi itse lukuihin:

p=ParameterTable/.Regress[t,{x},x]

Arviot kulmakertoimelle ja vakiotermille:

Part[p,1,1,1]
Part[p,1,2,1]

Virhearviot:

Part[p,1,1,2]
Part[p,1,2,2]

Lasketaan taulukosta (Subscript[R, i]):

Clear[r]
For[i=1,i≤n,i++,
r[i]=t[[i,1]]/t[[i,2]]]

Keskiarvo:

For[i=1;R=0,i≤n,i++,
R+=r[i]]
R/=n

Keskihajonta:

For[i=1;Σ=0,i≤n,i++,
Σ+=(R-r[i])^2]
Σ/=n;Σ=Sqrt[Σ]

Tai kätevämmin, valmiilla funktioilla:

ρ=t[[All,1]]/t[[All,2]];
(Subscript[ρ, av])=Mean[ρ](*keskiarvo*)
σ=StandardDeviation[ρ](*keskihajonta*)

Valmis funktio käyttää keskihajonnan kaavassa nimittäjää n-1.

4

Haetaan toinen datapisteistö, jossa on siis riippumattomia resistanssin mittauksia suurinpiirtein samalla jännitteen ja virran arvoilla. Muodostetaan erikseen taulukot virralle ja jännitteelle:

t=Import["h06_data2.txt","Table"];
va=t[[All,1]];ia=t[[All,2]];

Resistanssin keskiarvo:

rav=Mean[va/ia]

Lasketaan jännitteen ja virran suurimmat poikkeamat keskiarvosta:

Print["ΔV = ",η=Max[va-Mean[va]]]
Print["ΔI = ",φ=Max[ia-Mean[ia]]]

Leikitään hieman kokonaisdifferentiaalilla:

Clear[v,i,r]
r[v_,i_]:=(v/i);
dr=Dt[r[v,i]]

Virherajan laskemiseksi tämän lausekkeen molemmista termeistä on otettava itseisarvot, ja nämä itseisarvot lasketaan yhteen. Huom. Part-funktiolla saa vaikka summan termin tai tulon tekijän (minkä tahansa lausekkeen osan).

adr=Abs[Part[dr,1]]+Abs[Part[dr,2]]

Korvataan Dt[i] ja Dt[v] ΔI:llä ja ΔV:llä, ja i ja v keskiarvoilla:

Δr=adr/.{i->Mean[ia],v->Mean[va],Dt[i]->φ,Dt[v]->η}

Sovelletaan 15 yksikön sääntöä: Virheeksi saadaan 12 Ω, ja keskiarvo pyöristetään samaan tarkkuuteen:

Print["Resistanssi: R = ",Round[rav,1]," Ω ± ",Round[Δr,1]," Ω"]