VÝUKA MOŽNOSTÍ MATLABU Miroslav Olehla Technická univerzita v Liberci, Fakulta strojní, Katedra aplikované kybernetiky V následujícím příspěvku jsou uvedeny některé oblasti MATLABU ve výuce. Vychází se z učebních textů Metody zpracování dat MATLAB a snahou je, provést studenty možnostmi uvedeného programovacího jazyka. Jsou uvedeny možnosti vizualizace, řízení průběhu výpočtu, relační a logické operátory, základní operace s maticemi. Řešení soustavy lineárních rovnic. Řešme soustavu přeurčených lineárních rovnic různými metodami Gausova metoda, metoda Gauss Jordanova eliminace s částečnou pivotací, inverzí a pomocí determinantů. Uvažujme soustavu A.x = b x 4x x x + 7x + x + x + 7x x + x 6x + x = = 5 = = Zadání koeficientů řešené soustavy: >> A=[ 7 -; 4 ; -6; - 7 ] A= 7-4 -6-7 >> b=[;5;-;-]%nebo b=[ 5 - -]' b = 5 - - Kontrola řešitelnosti soustavy určením hodnosti a determinantu matice: >> rank(a) ans = >> rank([a,b]) ans = >>det(a'*a) ans = 8750 Gausova metoda >> x=a\b x =.74-0.00 0.7 Metoda Gauss Jordanova eliminace s částečnou pivotací >> C=rref([A,b]) C =
.0000 0 0.74 0.0000 0-0.00 0 0.0000 0.7 0 0 0 0 Řešení pomocí inverze >>x=inv(a'*a)*(a'*b) x =.74-0.00 0.7 Řešení pomocí determinantů. >> bt=a'*b bt = 5 9 >> At=A'*A At = 0 48-48 8-5 - -5 5 >> A=[bt,At(:,:)] A = 5 48-8 -5 9-5 5 >> A=[At(:,),bt,At(:,)] A = 0 5-48 -5-9 5 >> A=[At(:,:),bt] A = 0 48 5 48 8 - -5 9 >> x=det(a)/det(at) x =.74 >> x=det(a)/det(at) x = -0.00 >> x=det(a)/det(at) x = 0.7 Aproximace periodické funkce V případě, že je nutné aproximovat periodické funkce f(x), získané na základě měření, lze aproximace získat funkcemi ve tvaru trigonometrických polynomů M a0 fm( xi ) = + ( an cos nxi + bn sin nxi ) n= Uvažujme, že aproximovaná funkce f má periodu π a že jsou známy její hodnoty v intervalu <-π,π>. Označme
a n b n π = ( ) cos, π f x nx dx π π = ( )sin, π f x nx dx π n = 0,,,... n = 0,,,... Předpokládejme, že známe N+ hodnot funkce f, která má periodu π. Využitím numerické N π π N integrace obdržíme v bodech x i = π, π,...,,0,,..., π, π N N N N a pro M N, kde M je stupeň trigonometrického polynomu (počet koeficientů a, b) vztahy a N 0 = f ( x i ) N i= N N an = f ( xi )cos mxi, m = 0,,,..., M N i= N N bn = f ( xi )sin mxi, m = 0,,,..., M N i= N %Program v MATLABU: % simulace vstupních dat x=-pi:0.:pi; N=length(x) y=(cos(x)+sin(*x)+cos(*x))+0.9; % výpočet koeficientů N=(N-)/; a0=/n*sum(y) a=/n*(sum(y*cos(x)')) a=/n*( sum(y*cos(*x)')) a=/n*(sum(y*cos(*x)')) b=/n*(sum(y*sin(x)')) b=/n*( sum(y*sin(*x)')) b=/n*(sum(y*sin(*x)')) %výpočet aproximační funkce f=a0/+(a*cos(x) +b*sin(x)); f=a0/+(a*cos(x) +b*sin(x)+ a*cos(*x) +b*sin(*x) ); f=a0/+(a*cos(x) +b*sin(x)+ a*cos(*x) +b*sin(*x) + a*cos(*x) +b*sin(*x)); %grafické zobrazení plot(x,y, '*',x,f, x,f, x,f) grid on legend('body', ' řád', ' řád', ' řád') nebo lépe: % simulace vstupních dat x=-pi:0.:pi; N=length(x) y=(cos(x)+sin(*x)+cos(*x))+0.9; % výpočet koeficientů N=(N-)/; a0=/n*sum(y); M=; % stupeň trigonometrickeho polynomu M for k=:m a(k)=/n*(sum(y*cos(k*x)')); b(k)=/n*(sum(y*sin(k*x)')); end a0 a b
%výpočet aproximační funkce f=a0/+(a()*cos(x) +b()*sin(x)); f=a0/+(a()*cos(x) +b()*sin(x)+ a()*cos(*x) +b()*sin(*x) ); f=a0/+(a()*cos(x) +b()*sin(x)+ a()*cos(*x) +b()*sin(*x) + a()*cos(*x) +b()*sin(*x)); %grafické zobrazení plot(x,y, '*',x,f, x,f, x,f) grid on legend('body', ' řád', ' řád', ' řád') Výsledek: N = 6 a0 =.878 a =.098-0.0064.098 b = -0.000.09-0.0008 obr.- Aproximace periodických funkcí pomocí Fourierovy řady Lineární regrese. Jednoparametrová lineární regrese Obecný tvar lineárního modelu s jednou nezávisle proměnnou je dán vztahem j y = a0 + ag( x), kde g(x) může být nelineární, např. g( x) = x, j =,,..., nebo hyperbola, logaritmická funkce atd. U těchto funkcí můžeme k určení regresních koeficientů použít přímo metodu nejmenších čtverců. r y = a0 + ax pro r<0 musí být x 0 y = a + 0 a log x pro x>0 x y = a + 0 ae
Určeme koeficienty pro aproximační funkci y = a a ln x pro naměřená data 0 + x y 0.0 0.60.0 4.0 5.70 6.79 7.90 8.00 9.0 0.5 x=::0; y=[0. 0.6...7.79.9.0..5]; X=[ ; log(x)]; a=x'\y' xgraf=:0.:0; ygraf=a()+a()*log(xgraf); plot(x,y,'*', xgraf,ygraf) % nebo po dosazení a(), a() % plot(x,y,'*') % hold on %fplot('0.06+0.949*log(x)',[,0]) a = 0.06 0.9490 V některých případech je možno provést následující transformaci Obr. - Lineární regrese x y = a0 a log y = log a0 + x log a a y = a x log = log a + a x y 0 = a + a x 0 y 0 log / = a + a x y 0. Víceparametrová lineární regrese Uvažujme naměřené hodnoty: x 4 4 5 4 x 0 8 5 y 4 4 6 4 5 a určeme koeficienty regresní funkce y=a 0.+a.x + a.x.
Doplněním vektoru jedniček má matice X tvar X=[ ;4 4 5 4;0 8 5 ]; y=[4 4 6 4 5]; a=x'\y' a = -0.74 0.8 0.8 Poznámka: Výsledkem X*X T je matice symetrická X*X' ans = 7 7 87 70 7 70 855 Vytvoření grafu: xp=[0::6]; yp=[0::6]; [XP,YP]=meshgrid(xp,yp); zp=a()+a()*xp+a()*yp; surf(xp,yp,zp) obr. - Víceparametrová lineární regrese. Aproximace pomocí polynomu Pro uvedené výsledky měření uvažujme aproximaci ve tvaru polynomu. stupně, tedy y = a + a x + a x + a. 0 x x=[ 4 5]; X=[ ;x;x.^;x.^]; y=[5.5 4. 00. 90.7 8.4]; a=x'\y' a=
6.5800-0.45 6.6964-6.858 % Vykreslení grafu: xgraf=:0.0:5; graf=a()+a()*xgraf+a()*xgraf.^+a(4)*xgraf.^; plot(x,y,'*',xgraf,ygraf); %nebo po dosazení koeficientů % plot(x,y,'*') % hold on %fplot('6.58-0.45*x+6.696*x.^-6.858*x.^',[,5]) %není povolen zápis fplot('a()+a()*x+a()*x.^',[,5]) Obr. - Regrese polynomem. stupně V případě, že chceme data aproximovat polynomem n-tého stupně, můžeme to provést pomocí funkce p=polyfit(x,y,n). Výsledek je stejný, jako v předchozích případech. x je vektor hodnot nezávisle proměnné, y je vektor hodnot závisle proměnné, n je stupeň polynomu, jímž chceme aproximovat body [x i,y i ], p je vektor koeficientů výsledného polynomu P(x) = a n.x n + a n-.x n- +... + a.x + a 0 x=[0 5 7 50 6 70]; y=[0.5.7.58..6. 4.9]; x=0:0.:70; p=polyfit(x,y,) y=polyval(p,x); plot(x,y,'*',x,y) p = 0.68-0.90 Musíme připravit datové vektory odpovídající jednotlivým grafům. Zkusme nadefinovat několik bodů a proložit jimi polynomy různých stupňů pomocí funkce polyfit. Prokládané body jsou dány vektory x a y. V grafu budou vyznačeny hvězdičkami. Za povšimnutí stojí průběh polynomu y8 aproximace tohoto stupně je interpolací.
x=[ 4 5 6 7 8 9]; y=[ 4 5 4 ]; x=:0.:9; y=polyval(polyfit(x,y,),x); y=polyval(polyfit(x,y,),x); y5=polyval(polyfit(x,y,5),x); y8=polyval(polyfit(x,y,8),x); plot(x,y,'*',x,y,x,y,x,y5,x,y8) Obr. -4 Grafické okno funkce polyfit Dalším příkladem je nalezení koeficientů polynomu zvoleného stupně prokládajícího naměřená data podle kritéria nejmenších čtverců: x=[ 4 5]; y=[5.5 4. 00. 90.7 8.4]; r=polyfit(x,y,) % nalezení koeficientů polynomu. stupně yp=polyval(r,x); plot(x,y,'*',x,yp) Výsledek: r = 0.974 5.54-5.6400 tedy polynom ve tvaru 0.974.x^+5.54.x-5.6400 obr. -5 Polynomická aproximace
S proložením bodů pomocí polynomu úzce souvisí interpolace, respektive proložení polynomem je jeden typ interpolace. MATLAB poskytuje několik standardních funkcí pro různé typy interpolačních funkcí. Popis všech funkcí a jejich použití přesahuje rozsah tohoto textu. Uveďme názornou ukázku použití funkce polyval pro aproximaci, interp, spline pro interpolaci a použijeme příkaz plot pro grafické zobrazení zadaných bodů a bodů získaných proložením polynomem. a 6. stupně, interpolační funkcí a kubickými spline. obr. -6 Nevhodně použitá polynomiální interpolace x = [:7]; y=[5.5 4 50 00. 90.9 8]; % interpolace xp=:0.:7; yi=interp(x,y,xp); %spline yp=spline(x,y,xp); %aproximace yp=polyval(polyfit(x,y,),xp); %aproximace = interpolace yp6=polyval(polyfit(x,y,6),xp); plot(x,y,'*',xp,yi, ':',xp,yp,xp,yp,'--',xp,yp6, '-.') legend('body', 'interp','spline','polynom ','polynom 6') Příklad ukazuje nebezpečí bezmyšlenkového použití polynomiální aproximace. Pokud je aproximujeme polynomem 6. stupně a dopočítáme hodnoty pro dané x dostaneme ideální shodu. Pokud se však podíváme i na hodnoty mimo sledované body už spokojeni nebudeme. Aproximace se sice přesně shoduje v zadaných bodech, ovšem průběh mezi zadanými body se značně odchyluje od očekávaného průběhu. Polynomiální aproximace není rovněž vhodná pro aproximaci průběhů s ostrými zlomy. Literatura: Olehla, M., Dušek, F.: Metody zpracování dat MATLAB. Technická Univerzita Liberec 0, ISBN 978-80-77-95- Aproximace polynomem n- stupně