Splajny a metoda nejmenších tverc 1. píklad a) Najdte pirozený kubický splajn pro funkci na intervalu Za uzly zvolte body Na interpolaci pomocí kubického splajnu použijeme píkaz Spline(ydata,, endpts). Do endpts se vkládají okrajové podmínky: Pokud do nich nic nevložíme, je intern nastaveno endpoints=natural, tj. pedpokládáme, že hodnoty druhých derivací v krajních bodech intervalu restart: with(curvefitting): f:=->10*/(+1); data1:=[[0,f(0)],[1,f(1)],[3,f(3)],[,f()]]; (1.1.1) (1.1.) S1:=Spline(data1,); (1.1.3) b) Pro danou funkci a uzlové body najdte úplný kubický splajn s okrajovými podmínkami Pokud vložíme endpoints=, což jsou bu hodnoty prvních derivací v krajních bodech intervalu, nebo njaké jejich pedem dané aproimace, pak získáme úplný kubický splajn. Protože máme funkci f definovanou v závislosti na, použijeme pro výpoet derivace symbol Pokud budeme chtít pímo hodnotu derivace v uzlovém bod, užijeme píkaz D(f); S:=Spline(data1,,endpoints=[D(f)(0),D(f)()]); (1.1.)
(1.1.5) c) Danou funkci, oba splajny i uzlové body zobrazte do jednoho obrázku. plot([f(),s1,s,data1],=0..,style=[line,line,line, point],color=[red,green,blue,red],symbolsize=0,symbol= solidcircle,thickness=); 8 7 5 3 1 0 0 1 3 d) Vypotte první, druhou a tetí derivaci pirozeného kubického splajnu. Pro získání derivací daného splajnu, je z nj poteba udlat funkci, k emuž použijeme píkaz unnaply. S:=unapply(S1,); (1.1.)
D(S)();(D@@)(S)();(D@@3)(S)(); (1.1.7) e) Do jednoho obrázku rznými barvami grafy pirozeného kubického splajnu a grafy jeho první, druhé a tetí derivace Poznámka: Vykreslení grafu tetí derivace funguje pouze tehdy, když poítáme v racionálních íslech, ne v reálných. Jinak Maple není schopen rozhodnout v píkazu pieciwise, kde jsou body nespojitosti, a hlásí chybu. Pokud tedy chceme tetí derivaci nakreslit, musíme všechna vstupní data zadat jako racionální ísla, tedy nap. místo. plot([s(),d(s)(),(d@@)(s)(),(d@@3)(s)()],=0..,color= [cyan,green,blue,red],thickness=,discont=true);
8 0 1 3. píklad Je dána funkce a) Vypotte funkní hodnoty v bodech = -5, -,...,, 5. restart; with(curvefitting): f:=->1/(^+1); (1..1) data:=[seq([i,f(i)], i=-5..5)]; (1..) b) Tmito body proložte Lagrangev interpolaní polynom a pirozený kubický splajn. Poznámka: Pokud zadáme endpoints=notaknot, získáme splajn splující podmínku, že
je spojitá v bodech a. Pokud zadáme endpoints=periodic, získáme periodický kubický splajn, pro který platí, že hodnoty prvních a druhých derivací v poátením a koncovém bod intervalu jsou si rovny, tzn. v našem pípad musí být L:=PolynomialInterpolation(data,,form=Lagrange); (1..3) epand(%); S3:=Spline(data,); (1..) (1..5)
c) Do jednoho obrázku zakreslete hodnoty v bodech = -5, -,...,, 5, funkci a pirozený kubický splajn. plot([f(),l,s3,data],=-5..5,color=[black,blue,green, red],style=[line,line,line,point],symbol=solidcircle, symbolsize=0); (1..5)
1 0 d) Srovnejte náhradu funkce Lagrangeovým polynomem a pirozeným kubickým splajnem. Lagrangev interpolaní polynom kopíruje prbh funkce velmi špatn, zatímco pirozený kubický splajn s ní tém splývá. 3. píklad Funkce f je zadána tabulkou namených hodnot.5 3 3.5 5 5.5.5 7 y 0.7.1 3..3 5.3 5.8.5 5.8. 5. a) Aproimujte ji metodou nejmenších tverc algebraickým polynomem 1.,. a 3. stupn. Použijte píkaz LeastSquares z balíku CurveFitting. restart; with(curvefitting): data3:=[[,0.7],[.5,.1],[3,3.],[3.5,.3],[,5.3],[5, 5.8],[5.5,.5],[,5.8],[.5,.],[7,5.]]; (1.3.1)
L1:=LeastSquares(data3,); L:=LeastSquares(data3,,curve=a*^+b*+c); L3:=LeastSquares(data3,,curve=a*^3+b*^+c*+d); (1.3.) (1.3.3) (1.3.) b) Do jednoho obrázku zakreslete data z tabulky a všechny aproimace. plot([data3,l1,l,l3],=..7,color=[red,blue,black,green], style=[point,line,line,line],symbol=solidcircle,symbolsize= 15,thickness=3); 5 3 1 3 5 7 c) Srovnejte chybu, které se dopouštíme pi aproimaci funkce f metodou nejmenších tverc algebraickým polynomem 1.,. a 3. stupn. Použijte píkaz LeastSquaresPlot z balíku Student[LinearAlgebra]. Balíek Student[LinearAlgebra] obsahuje píkaz LeastSquaresPlot, který umožuje znázornit i odchylky. V pípad, že nastavíme infolevel[student[linearalgebra]] := 1, získáme krom
obrázku s vyznaenými odchylkami i celkovou chybu metodou nejmenších tverc (souet ploch tverek) a maimální chybu (délku strany nejvtšího tvereku). with(student[linearalgebra]): infolevel[student[linearalgebra]] := 1: LeastSquaresPlot(data3,aes=boed); Fitting curve:.955+.955* Least squares error:.9 Maimum error: 1.51 8 The Linear Least Squares Fit of 10 Points 7 5 3 1 3 5 7 8 Informace, které lze vyíst z modrého tetu: 1. kivka, která je daty proložena ve smyslu metody nejmenších tverc,. celková chyba metodou nejmenších tverc (souet ploch tverek), 3. maimální chyba (délka strany nejvtšího tvereku). LeastSquaresPlot(data3,[,y],curve=a*^+b*+c,aes=boed); Fitting curve: -7.013+.70*-.17*^ Least squares error:.39 Maimum error:.3770
The Least Squares Fit of 10 Points of the Curve a*^+b*+c 5 y 3 1 3 5 7 LeastSquaresPlot(data3,[,y],curve=a*^3+b*^+c*+d,aes= boed); Fitting curve: -7.7+5.9*-.535*^+.93e-*^3 Least squares error:.3 Maimum error:.3
The Least Squares Fit of 10 Points of the Curve a*^3+b*^+c*+d 5 y 3 1 3 5 7 Aproimace metodou nejmenších tverc lineárním polynomem s chybou.9 není vhodná, zatímco aproimace polynomem. a 3. stupn jsou vhodné a mají tém stejnou chybu 0.39, resp. 0.3.. píklad Metodou nejmenších tverc vyrovnejte data uložená v souboru data0.tt polynomem. stupn. Pak nakreslete do jednoho obrázku data a polynom. Použijte píkaz LeastSquares z balíku CurveFitting. asto je poteba naíst data z eterního souboru. To lze udlat nkolika zpsoby. Jméno souboru se zadává jako etzec, tj. je uzaveno do dvojitých uvozovek. Je-li soubor v aktuálním adresái, staí zadat jeho jméno, tj. nap. "data1.tt" nebo ".\\data0.tt". Je-li v podadresái data daného adresáe, mžeme použít ".\\data\\data0.tt". Obecn se musí zadat celá cesta, nap. "d:\\uzivatel\\data\\data0.tt". Pedpokládáme, že soubor obsahuje íselné údaje uložené po ádcích. Píkazem readdata zadáváme jméno souboru a poet sloupc. Data jsou uložena do seznamu (je-li sloupec jeden) nebo do seznamu seznam (je-li sloupc víc). data0:=readdata("c:\\users\\potucekr\\desktop\\výuka 013
-15\\VÝUKA 015-1-LS\\M\\LC\\DATA\\data0.tt",); (1..1) with(curvefitting): L:=LeastSquares(data0,,curve=a*^+b*^3+c*^+d*+e); (1..) plot([data0,l],=1...9,color=[red,blue],style=[point, line],symbol=solidcircle,symbolsize=15,thickness=); 1 10 8 0