MATLAB 5. gyakorlat Polinomok, deriválás, integrálás
Menetrend Kis ZH Polinomok Numerikus deriválás Numerikus integrálás (+ anonim függvények)
pdf Kis ZH
Polinomok Sok függvény és valós folyamat leírható magasabb rendű polinomokkal. MATLAB-ban a polinomokat az együtthatóvektorukkal reprezentáljuk: P 1 ( x)=x 2 +2 x+3 P 2 ( x)=10 x 3 +4 x 2 +5 x 7 P1 = [1 2 3]; P2 = [10 4 5-7]; P 3 (x)=3 x 4 +5 x 2 12 P3 = [3 0 5 0-12]; Ezen a ponton mindegyik egy egyszerű sorvektor!
Polinomok Az általunk megadott vektorokat a MATLAB megfelelő beépített függvényei fogják polinomként értelmezni. gyökök kiszámítása: roots(p); kiértékelés adott pontban: y0 = polyval(p,x0); kiértékelés sok pontban: x = -1:0.01:1; y = polyval(p,x); polinom létrehozása a gyökeiből: r = [-1 1]; P = poly(r); polinom illesztés: P = polyfit(x_vektor,y_vektor,fokszam);
Példa 1. Ábrázoljuk a P( x)=x 3 +2 x 2 2 x 2 polinomot a -3 1.5 intervallumon, 1-es és 0.001-es lépésközzel! A görbék legyenek piros és kék színűek. Ugyanezen az ábrán jelöljük be a polinom gyökeit fekete körökkel és a 0 szintet egy fekete szaggatott vonallal! A megoldáshoz polinom műveleteket használjunk!
Megoldás 1. % polinom létrehozása P = [1 2-2 -2]; % x vektorok definiálása % a megfelelő lépésközzel x1 = -3:1:1.5; x2 = -3:0.001:1.5; % kiértékelés y1 = polyval(p,x1); y2 = polyval(p,x2); % gyökök kiszámítása r = roots(p);
Megoldás 1. % polinom létrehozása P = [1 2-2 -2]; % x vektorok definiálása % a megfelelő lépésközzel x1 = -3:1:1.5; x2 = -3:0.001:1.5; % kiértékelés y1 = polyval(p,x1); y2 = polyval(p,x2); % gyökök kiszámítása r = roots(p); % kirajzolás figure(1); clf hold on; % behelyettesítések plot(x1,y1,'r'); plot(x2,y2,'b'); % gyökök plot(r,zeros(size(r)),'ko'); % 0 szint plot([-3 1.5],[0 0],'k--'); title('polinom'); xlabel('x érték'); ylabel('y érték'); legend('1-es lépésköz',... '0.001-es lépésköz',... 'gyökök');
Megoldás 1.
Példa 2.1. Töltsük be a polinom.mat fájlt! Illesszünk az adatokra másodfokú polinomot! Rajzoljuk ki az eredeti adatokat és az illesztett polinomot egy közös ábrára! Az ábrát megfelelően feliratozzuk!
Megoldás 2.1. load polinom.mat % illesztett polinom P_fit = polyfit(x_poly,y_poly,2); % illesztett polinom értékei y_fit = polyval(p_fit,x_poly); % kirajzolás figure(2); hold on; plot(x_poly,y_poly,'k.'); plot(x_poly,y_fit,'r','linewidth',2); title('polinom illesztés'); xlabel('x érték'); ylabel('y érték'); legend('zajos adatok','2. fokú illesztés');
Megoldás 2.1.
Példa 2.2. Végezzünk predikciót a mérési adatokra a 4 8 tartományon az illesztett polinom kiértékelésével! Illesszünk egy hatodfokú polinomot is az eredeti adatokra, és ezzel is végezzük el a predikciót ugyanezen a tartományon! Mit tapasztalunk?
Megoldás 2.2. % predikált tartomány x_ext = 4:0.1:8; % predikált értékek y_ext = polyval(p_fit,x_ext); % az előző ábrához rajzolás plot(x_ext,y_ext,'g','linewidth',2); legend('zajos adatok',... '2. fokú illesztés',... 'predikció');
Megoldás 2.2.
Megoldás 2.2. % hatodfokú polinom illesztés P_fit_6 = polyfit(x_poly,y_poly,6); % illesztett polinom értékek y_fit_6 = polyval(p_fit_6,x_poly); % predikált értékek y_ext_6 = polyval(p_fit_6,x_ext); % az előző ábrához rajzolás plot(x_poly,y_fit_6,'b--','linewidth',2); plot(x_ext,y_ext_6,'c--','linewidth',2); legend('zajos adatok',... '2. fokú illesztés',... '2. fokú predikció',... '6. fokú illesztés',... '6. fokú predikció');
Megoldás 2.2.
Numerikus deriválás Diszkrét értékeken történik, ezért fontos a jelek felbontása! Alacsony felbontással mintavételezve egy folytonos függvényt nem kapunk kellőképpen folytonos értékeket. A differenciálhatóság feltétele általában a függvény folytonossága (vannak kivételek ld. f(x) = x ). MATLAB-ban teljes folytonosságról nem beszélhetünk (minimális lépésköz, eps), de megfelelö felbontást választva a legtöbb esetben jó közelítéssel numerikusan is kiszámítható a derivált.
Példa 3.1. Rajzoljunk ki egy szinusz jelet a 0 4π intervallumon 1-es felbontással! Az egyes adatpontokat jelöljük összekötött kék körökkel!
Példa 3.1. Rajzoljunk ki egy szinusz jelet a 0 4π intervallumon 1-es felbontással! Az egyes adatpontokat jelöljük összekötött kék körökkel! % idővektor t1 = 0:1:4*pi; % fv. értékek s1 = sin(t1); % kirajzolás figure(3); clf; hold on; plot(t1,s1,'bo-');
Példa 3.1. Rajzoljunk ki egy szinusz jelet a 0 4π intervallumon 1-es felbontással! Az egyes adatpontokat jelöljük összekötött kék körökkel! Ugyanerre az ábrára rajzoljuk ki ugyanezt a jelet 0.05- ös felbontással! Az egyes adatpontokat jelöljük összekötött piros pontokkal! Az ábrát megfelelően feliratozzuk!
Megoldás 3.1. % idővektor t1 = 0:1:4*pi; t2 = 0:0.05:4*pi; % fv. értékek s1 = sin(t1); s2 = sin(t2); % kirajzolás figure(3); clf; hold on; plot(t1,s1,'bo-'); plot(t2,s2,'r.-'); title('szinusz különböző felbontásokkal'); xlabel('t (s)'); ylabel('fv. érték'); legend('1-es felbontás',... '0.05-ös felbontás');
Megoldás 3.1.
Példa 3.2. Számítsuk ki és ábrázoljuk a görbék numerikus deriváltjait! MATLAB-ban a derivált mindig differencia hányados! Vektorok elemenként vett különbségeinek kiszámításához használjuk a diff(vektor) beépített függvényt.
Megoldás 3.2. % kölünbségek kiszámítása % értelmezési tartomány dt1 = diff(t1); % értékkészlet ds1 = diff(s1); % differencia hányados ds1_dt1 = ds1./dt1; % kirajzolás figure(4); clf; hold on; plot(t1(2:end),ds1_dt1,'bo--');
Megoldás 3.2. % kölünbségek kiszámítása % értelmezési tartomány dt1 = diff(t1); dt2 = diff(t2); % értékkészlet ds1 = diff(s1); ds2 = diff(s2); % differencia hányados ds1_dt1 = ds1./dt1; ds2_dt2 = ds2./dt2; % kirajzolás figure(4); clf; hold on; plot(t1(2:end),ds1_dt1,'bo '); plot(t2(2:end),ds2_dt2,'r.--'); % ellenőrzéshez plot(t2,cos(t2),'k--');
Deriválás adott pontban Ha a vizsgált függvény képlettel felírható (pl. polinom, szögfüggvény,...), akkor adott hosszúságú és felbontású mintavétel nélkül is megadható egy adott pontban a derivált. Ehhez a fenti lépéseket a vizsgált pont tetszőlegesen kicsi környezetére kell elvégeznünk. A függvény értékeinek kirajzolásához továbbra is szükség lesz mintavételre és behelyettesítésre!
Példa 4. Legyen P( x)=1.5 x 3 +2 x 2 +0.5 x 2. Rajzoljuk ki P(x) értékeit 0.001-es lépésközzel a -3 3 intervallumon!
Példa 4. Legyen P( x)=1.5 x 3 +2 x 2 +0.5 x 2. Rajzoljuk ki P(x) értékeit 0.001-es lépésközzel a -3 3 intervallumon! % polinom P = [1.5 2 0.5-2]; % x a kirajzoláshoz x = -3:0.001:3; % y a kirajzoláshoz y = polyval(p,x); % kirajzolás figure(5); plot(x,y);
Példa 4. Legyen P( x)=1.5 x 3 +2 x 2 +0.5 x 2. Rajzoljuk ki P(x) értékeit 0.001-es lépésközzel a -3 3 intervallumon! Számítsuk ki a függvény deriváltját a t0 = 1.5 helyen! Az adott helyre rajzoljuk be a megfelelő érintő egyenest is!
Megoldás 4. % polinom P = [1.5 2 0.5-2]; % x a kirajzoláshoz x = -3:0.001:3; % y a kirajzoláshoz y = polyval(p,x); % kirajzolás figure(5); hold on; plot(x,y); % deriválási hely t0 = 1.5; % fv. érték y0 = polyval(p,t0); % a deriválás "felbontása" dt0 = 1E-6; % t0 körüli környezet t_tart = [t0-dt0 t0+dt0]; % a fv. értékei ugyanitt y_tart = polyval(p,t_tart); %különbségek dt_tart = diff(t_tart); dy_tart = diff(y_tart); % derivált dy_dt0 = dy_tart/dt_tart; % kirajzolás plot(t0,y0,'ko'); plot([t0-1 t0+1],[y0-dy_dt0 y0+dy_dt0],'r'); title('deriválás adott pontban'); xlabel('x érték'); ylabel('y érték'); legend('fv. értékek',... 'deriválási hely',... 'érintő egyenes');
Megoldás 4.
Numerikus integrálás A deriváláshoz hasonlóan lehet vektorértékek és megadott függvény alapján is integrálni. (Az integrál a függvényértékek és az x-tengely közötti területrészek előjeles összege.)
Példa 5. Számítsuk ki egy szinusz görbe és az x-tengely közötti területet a 0 π intervallumon! egyszerű összeadással a trapézszabály alkalmazásával megadott függvény alapján
Példa 5. - összeadás % felbontás megadása és a tartomány létrehozása res = 0.01; x = 0:res:pi; % integrálszámítás alap összeadással (nem ajánlott) % a felbontással azért kell beszorozni, mert a sum % alapból csak a fv.értékeket adja össze, nem a % területeket z0 = sum(sin(x))*res;
Példa 5. - trapézszabály % felbontás megadása és a tartomány létrehozása res = 0.01; x = 0:res:pi; % integrálszámítás a trapézszabály alkalmazásával %(ezt ajánlott használni vektorok esetén) z1 = trapz(x,sin(x));
Anonim függvények A MATLAB lehetőséget ad függvények tárolására változókban, ha azok kellőképpen egyszerűek (és pl. emiatt felesleges őket külön fájlba írni). Ez a konstrukció az anonim függvény: fv = @(x) sin(x)-2*x.^2+3*x ahol @(x) adja meg a bemenő paraméter(eke)t, amit a függvény törzse követ Definiálás után fv függvényként meghívható: >> fv = @(x) sin(x)-2*x.^2+3*x fv = @(x)sin(x)-2*x.^2+3*x >> fv(3) ans = -8.8589
Példa 5. - anonim fv. alapján % anonim fv. definíció f1 = @(x) sin(x); % az adott anonim fv. integrálja a 0->pi % intervallumon (a quad komolyabb algoritmust % használ, csak fv.-re müködik) q1 = quad(f1,0,pi); % a függvényt a quadban is meg lehet adni q2 = quad(@(t) sin(t), 0, pi);