Seznámení se systémem Mathematica 7

Zpracování fyzikálního měření

© Jaroslav Reichl, SPŠST Panská, Praha
reichl@panska.cz

Obsah

Prezentace obsahuje tato témata:

Důležité funkce
23. úkol
Proložení křivky naměřenými daty
24. úkol

Jaroslav Reichl, SPŠST Panská, Praha, © 2011

Důležité funkce (ListPlot, operace se soubory, ...)

ListPlot[{(Subscript[y, 1]),(Subscript[y, 1]),...}] - vykreslí jednotlivé body o souřadnicích [1; (Subscript[y, 1])], [2; (Subscript[y, 2])], ... . Parametry této funkce jsou velmi podobné jako u funkce Plot[].
ListPlot[{(Subscript[x, 1]),(Subscript[y, 1])},{(Subscript[x, 2]),(Subscript[y, 2])},...}] - vykreslí jednotlivé body o souřadnicích [(Subscript[x, 1]); (Subscript[y, 1])], [(Subscript[x, 2]); (Subscript[y, 2])], ... . Parametry této funkce jsou velmi podobné jako u funkce Plot[].

ListPlot[Table[RandomInteger[{0,20}],{i,10}],AxesOrigin->{0,0},PlotStyle->Directive[PointSize[0.02],Red]]

data=Table[{x,(x^2)-6x+5},{x,1,10,1}];
ListPlot[data,AxesOrigin->{0,0},PlotStyle->Directive[PointSize[0.025],Green]]

NotebookDirectory[] - vrací cestu do složky, v níž uložen notebook, ve kterém je tato funkce použita. Pozor!!! Notebook musí být v okamžiku volání této funkce uložen, jinak funkce generuje chybu.

cestaktomutonotebooku=NotebookDirectory[]

SystemDialogInput["typ"] - zobrazí standardní dialogové okno systému v závislosti na typu typ tohoto okna.

SystemDialogInput["Color"]

SystemDialogInput["FileOpen"]

cesta=StringJoin[NotebookDirectory[],".txt"];
SystemDialogInput["FileOpen",cesta,WindowTitle->"Vyberte textový soubor ..."]

cesta=StringJoin[NotebookDirectory[],".xls"];
soubor=ToString[SystemDialogInput["FileOpen",cesta,WindowTitle->"Vyberte soubor ..."]];
If[soubor=="$Canceled",
Print["Nebyl vybrán žádný soubor!"],
Print["Byl vybrán soubor: ",soubor,"."]]

Import[nazevsouboru] - importuje do aktuálního notebooku soubor, jehož plná cesta je uložena v proměnné nazevsouboru. Pomocí dalších parametrů lze vypsat další vlastnosti importovaného souboru.

cesta=StringJoin[NotebookDirectory[],".xls"];
soubor=ToString[SystemDialogInput["FileOpen",cesta,WindowTitle->"Vyberte soubor ..."]];
If[soubor=="$Canceled",
Print["Soubor nelze importovat!"],
nactenadata=Import[soubor]]

ToExpression[vstupnidata] - převede vstupnidata na typ výraz (tj. na tvar, který lze dále matematicky upravovat a počítat s ním).

ToExpression["2+2"]

ToExpression["sin(x)",TraditionalForm]

ToExpression["sin(Pi/3)",TraditionalForm]

Export[nazevsouboru,prikaz] - exportuje provedený příkaz prikaz do souboru, jehož jméno je uloženo v proměnné nazevsouboru. Je-li zadáno pouze jméno souboru bez celé cesty, je soubor uložen do systémové složky Dokumenty.
Pomocí dalších parametrů lze ukládaný soubor blíže specifikovat.

Export["graf_sinus.jpg",Plot[Sin[10x],{x,-π,3π}]]

nazevsouboru=StringJoin[NotebookDirectory[],"graf_sinus.jpg"];
Export[nazevsouboru,Plot[Sin[10x],{x,-π,3π}]]

Jaroslav Reichl, SPŠST Panská, Praha, © 2011

23. úkol: Důležité funkce

Byla naměřena tato data: proměnná A s hodnotami 2,0; 3,8; 6,2; 7,9; 11,2 a proměnná B s odpovídajícími hodnotami 20,2; 5,1; 1,3; 0,4; 0,1. Zobrazte tato data do grafu závislosti proměnné B na proměnné A a zobrazený graf uložte do aktuální složky do souboru s názvem "testovaci.jpg".

Řešení

ClearAll["Global`*"];
dataA={2.0,3.8,6.2,7.9,11.2};
dataB={20.2,5.1,1.3,0.4,0.1};
barva=Red;
velikostbodu=0.025;
nazevsouboru=StringJoin[NotebookDirectory[],"testovaci.jpg"];
pocetdat=Length[dataA];
dataprograf=Table[{dataA[[i]],dataB[[i]]},{i,1,pocetdat,1}];
grafdata=ListPlot[dataprograf,PlotStyle->Directive[PointSize[velikostbodu],barva],AxesOrigin->{0,0}]
Export[nazevsouboru,grafdata]

Na prvním listu souboru lekce_08_data.xls jsou ve dvou sloupcích umístěná data. Načtěte tato data a zobrazte je do grafu.

Řešení

ClearAll["Global`*"];
barva=Red;
velikostbodu=0.015;
cesta=StringJoin[NotebookDirectory[],".xls"];
soubor=ToString[SystemDialogInput["FileOpen",cesta,WindowTitle->"Vyberte soubor ..."]];
If[soubor=="$Canceled",
Print["Soubor nelze importovat!"],
{data=Import[soubor],
pocetdat=Length[data[[1]]],
datax=Table[ToExpression[data[[1,i,1]]],{i,1,pocetdat,1}],
datay=Table[ToExpression[data[[1,i,2]]],{i,1,pocetdat,1}],
dataprograf=Table[{datax[[i]],datay[[i]]},{i,1,pocetdat,1}],
grafdata=ListPlot[dataprograf,PlotStyle->Directive[PointSize[velikostbodu],barva],AxesOrigin->{0,0}]}];
If[soubor≠"$Canceled",
Show[grafdata]]

Jaroslav Reichl, SPŠST Panská, Praha, © 2011

Proložení křivky naměřenými daty

Fit[data,funkce,promenna] - proloží zadanými daty data funkci, která je lineární kombinací funkcí zadaných v parametru funkce, v proměnné promenna. Výstupem funkce Fit[] je funkce a proto jí lze použít k definici nové (matematické) funkce, s níž lze dále pracovat standardním způsobem (vykreslovat jí, počítat derivaci, primitivní funkci, ...).
Metoda hledání této funkce je založena na metodě nejmenších čtverců.

data={{1,2},{2,5},{3,6},{4,7},{5,11},{6,12}};
Fit[data,{1,x},x]
Fit[data,{1,x,(x^2)},x]

FindFit[data,vyraz,parametry,promenna] - vrací číselné hodnoty proměnných parametry, které definují funkci zadanou v proměnné vyraz v závislosti na proměnné promenna. Funkce funkce přitom nejlépe aproximuje data data.

data={{1,2},{2,5},{3,6},{4,7},{5,11},{6,12}};
FindFit[data,a x+(b/x)+c,{a,b,c},x]

LeastSquare[data,promenna] - vrací takovou hodnotu proměnné x, která řeší maticovou rovnici data.x=promenna. Tato funkce je ekvivalentní funkci LinearSolve[]. Pro zpracování měření se většinou příliš nepoužívá.

data={{1,2},{2,5},{3,6}};
LeastSquares[data,{1,1,1}]

Correlation[data1,data2] - vrací korelaci (shodu) mezi dvěma subory dat data1 a data2.

data1={2,4,6,8,10,12,14};
data2={2,5,6,8,10,12,13};
Correlation[data1,data2]//N

data1={{1,2},{2,5},{3,6},{4,7},{5,11},{6,12}};
data2={{1,2},{2,4},{3,6},{4,8},{5,10},{6,12}};
Correlation[data1,data2]//N

Jaroslav Reichl, SPŠST Panská, Praha, © 2011

24. úkol: Proložení křivky naměřenými daty

Na druhém listu souboru lekce_08_data.xls jsou ve dvou sloupcích umístěná data. V prvním sloupci je čas, ve druhém dráha uražená tělesem, které se pohybovalo po nakloněné rovině z klidu. Načtěte tato data do systému Mathematica, zobrazte je do grafu a proložte jimi vhodnou funkční závislost. Určete velikost zrychlení, se kterým se těleso pohybuje, a velikost počáteční rychlosti tělesa.

Řešení

ClearAll["Global`*"];
barva=Black;
barvabodu=Red;
barvakrivky=Blue;
tloustka=0.005;
velikostbodu=0.015;

cesta=StringJoin[NotebookDirectory[],".xls"];
soubor=ToString[SystemDialogInput["FileOpen",cesta,WindowTitle->"Vyberte soubor ..."]];
If[soubor=="$Canceled",
Print["Soubor nelze importovat!"],
{data=Import[soubor],
pocetdat=Length[data[[2]]],
cas=Table[ToExpression[data[[2,i,1]]],{i,1,pocetdat,1}],
draha=Table[ToExpression[data[[2,i,2]]],{i,1,pocetdat,1}],
dataprograf=Table[{cas[[i]],draha[[i]]},{i,1,pocetdat,1}],
koeficienty=FindFit[dataprograf,a (t^2)+b t+c,{a,b,c},t],
koefa=a/.koeficienty[[1]],
koefb=b/.koeficienty[[2]],
koefc=c/.koeficienty[[3]],
funkcnizavislost[t_]:=koefa (t^2)+koefb t+koefc,
graffce=Plot[funkcnizavislost[t],{t,0,1.1cas[[Length[cas]]]},PlotStyle->{barvakrivky,Thickness[tloustka]}],
grafdata=ListPlot[dataprograf,PlotStyle->Directive[PointSize[velikostbodu],barvabodu]]}];
If[soubor≠"$Canceled",
Show[
graffce,
grafdata,
AxesOrigin->{0,0},AxesLabel->{Style["(t/s)",12,barva,FontFamily->Times],Style["(s/m)",12,barva,FontFamily->Times]}]]
If[soubor≠"$Canceled",
{Print["Závislost popisující naměřená data má tvar: s(t) = ",TraditionalForm[funkcnizavislost[t]],"."],
Print["Velikost zrychlení, s nímž se těleso pohybuje, je ",D[funkcnizavislost[t],{t,2}]," m.(s^(-2))."],
Print["Velikost počáteční rychlosti tělesa je ",koefb," m.(s^(-1))."]}];

Na třetím listu souboru lekce_08_data.xls jsou ve dvou sloupcích umístěná data. V prvním sloupci jsou hodnoty elektrického proudu, který procházel termistorem při dané teplotě, a ve druhém sloupci jsou odpovídající hodnoty napětí měřeného na termistoru. Načtěte tato data do systému Mathematica, zobrazte je do grafu a proložte jimi vhodnou funkční závislost. Určete přesnost nalezené funkční závislosti ve srovnání s měřenými daty a hodnotu odporu termistoru při dané teplotě.

Řešení

ClearAll["Global`*"];
barva=Black;
barvabodu=Red;
barvakrivky=Blue;
tloustka=0.005;
velikostbodu=0.015;

cesta=StringJoin[NotebookDirectory[],".xls"];
soubor=ToString[SystemDialogInput["FileOpen",cesta,WindowTitle->"Vyberte soubor ..."]];
If[soubor=="$Canceled",
Print["Soubor nelze importovat!"],
{data=Import[soubor],
pocetdat=Length[data[[3]]],
proud=Table[ToExpression[data[[3,i,1]]],{i,1,pocetdat,1}],
napeti=Table[ToExpression[data[[3,i,2]]],{i,1,pocetdat,1}],
dataprograf=Table[{proud[[i]],napeti[[i]]},{i,1,pocetdat,1}],
koeficienty=FindFit[dataprograf,a i+b,{a,b},i],
koefa=a/.koeficienty[[1]],
koefb=b/.koeficienty[[2]],
napetikrivka[i_]:=koefa i+koefb,
napetiaproximace=Table[napetikrivka[proud[[i]]],{i,1,pocetdat,1}],
presnost=Correlation[napeti,napetiaproximace],
graffce=Plot[napetikrivka[i],{i,0,1.1proud[[pocetdat]]},PlotStyle->{barvakrivky,Thickness[tloustka]}],
grafdata=ListPlot[dataprograf,PlotStyle->Directive[PointSize[velikostbodu],barvabodu]]}];
If[soubor≠"$Canceled",
Show[
graffce,
grafdata,
AxesOrigin->{0,0},AxesLabel->{Style["(I/A)",10,barva,FontFamily->Times],Style["(U/V)",10,barva,FontFamily->Times]}]]
If[soubor≠"$Canceled",
{Print["Závislost popisující naměřená data má tvar: U(I) = ",TraditionalForm[napetikrivka[i]]/.i->"I","."],
Print["Hodnota odporu termistoru je ",D[napetikrivka[i],i]," Ω."],
Print["Přesnost nalezené aproximace je ",100.presnost," %."]}];

Na čtvrtém listu souboru lekce_08_data.xls jsou ve dvou sloupcích umístěná data. V prvním sloupci jsou hodnoty času a ve druhém sloupci jsou odpovídající hodnoty okamžitých výchylek tlumeného oscilátoru. Načtěte tato data do systému Mathematica, zobrazte je do grafu a proložte jimi vhodnou funkční závislost. Určete přesnost nalezené funkční závislosti ve srovnání s měřenými daty a hodnotu maximální amplitudy kmitajícího oscilátoru.

Řešení

ClearAll["Global`*"];
barva=Black;
barvabodu=Blue;
barvakrivky=Red;
tloustka=0.005;
velikostbodu=0.015;

cesta=StringJoin[NotebookDirectory[],".xls"];
soubor=ToString[SystemDialogInput["FileOpen",cesta,WindowTitle->"Vyberte soubor ..."]];
If[soubor=="$Canceled",
Print["Soubor nelze importovat!"],
{data=Import[soubor],
pocetdat=Length[data[[4]]],
cas=Table[ToExpression[data[[4,i,1]]],{i,1,pocetdat,1}],
vychylka=Table[ToExpression[data[[4,i,2]]],{i,1,pocetdat,1}],
dataprograf=Table[{cas[[i]],vychylka[[i]]},{i,1,pocetdat,1}],
koeficienty=FindFit[dataprograf,a (E^(-b t)) Sin[c t+d]+e,{a,b,c,d,e},t],
akoef=a/.koeficienty[[1]],
bkoef=b/.koeficienty[[2]],
ckoef=c/.koeficienty[[3]],
dkoef=d/.koeficienty[[4]],
ekoef=e/.koeficienty[[5]],
krivkavychylky[t_]:=akoef (E^(-bkoef t))Sin[ckoef t+dkoef]+ekoef,
vychylkaaproximace=Table[krivkavychylky[cas[[i]]],{i,1,pocetdat,1}],
presnost=Correlation[vychylka,vychylkaaproximace],
graffce=Plot[krivkavychylky[t],{t,0,1.05cas[[pocetdat]]},PlotStyle->{barvakrivky,Thickness[tloustka]}],
grafdata=ListPlot[dataprograf,PlotStyle->Directive[PointSize[velikostbodu],barvabodu]]}];
If[soubor≠"$Canceled",
Show[
graffce,
grafdata,
AxesOrigin->{0,0},PlotRange->All,AxesLabel->{Style["(t/s)",10,barva,FontFamily->Times],Style["(y/m)",10,barva,FontFamily->Times]}]]
If[soubor≠"$Canceled",
{Print["Závislost popisující naměřená data má tvar: y(t) = ",TraditionalForm[krivkavychylky[t]],"."],
Print["Přesnost nalezené aproximace je ",100.presnost," %."],
Print["Maximální amplituda měla hodnotu ",Max[vychylka]-ekoef," m."]}];

Jaroslav Reichl, SPŠST Panská, Praha, © 2011