[CvL] C. van Loan: Chapter 9, ODE jaossa 25.2.,
Kirjan ODE-koodit
[Moler] Moler: Numerical Computing with Matlab
Matlab-koodit, myös pdf-tiedostot luvuittain
[Ch-Kin] Cheney-Kincaid: Numerical Mathematics
[B-F] Burden-Faires: Numerical Analysis
Diffyhtälön (alkuarvotehtävän) määritelmä:
(AA) y'=f(t,y), y(t_0)=y_0Ratkaisulla tarkoitetaan funktiota t->y(t), jolle pätee:
y'(t)=f(t,y(t)) kaikilla t jollain välillä, ja joka
toteuttaa alkuehdon: y(t_0)=y(0)
Muodollisesti diffyhtälösysteemi on aivan sama. Tällöin ajatellaan
y vektoriksi, y' on derivaattavektori ja f on t:n ja y-vektorin (siis
n+1:n muuttujan) vektoriarvoinen (n-komponenttinen) funktio.
Käsittelimme luennolla heiluriyhtälön muuntamista 1. kertaluvun systeemiksi ja sen kirjoittamista Matlab-funktioksi ODE-ratkaisijaa varten tässä näin. Tiedosto hei.m
function z=hei(t,y)
z=[y(2);-sin(y(1))];
Yhtä hyvin inline-funktiona:
heisys=inline('[y(2);-sin(y(1))]','t','y')
Kutsu voisi olla:
ya=[1 0]; [T,Y]=ode45(@hei,[0 10],ya); % tai: [T,Y]=ode45(heisys,[0 10],ya);Molerin ode-prujussa luvuss 7.2 on esimerkki "twobody", joka kuvaa kahden kappaleen probleemaa. (Tähän liittyen voidaan ottaa jokunen tehtävä.)
function [T,Y]=eulerskalaari(fnimi,Tspan,ya,n) % Tämä vain kehittely- ja opettelutarkoituksessa. % Funktio eulerV hoitaa niin skalaari- kuin vektoriversion. % (24.2.04) a=Tspan(1);b=Tspan(2); h=(b-a)/n; Y=zeros(1,n+1);T=a:h:b; Y(1)=ya; for j=1:n Y(j+1)=Y(j)+h*feval(fnimi,T(j),Y(j)); end;
function [T,Y]=eulerV(fnimi,Tspan,ya,n)
% fnimi : funktiomääritys, inline tai m-tiedosto, määritellään kuten
% ode45:lle ym. (help ode45)
% Tspan on muotoa [a b] ya:alkuarvovektori (y(a)=ya)
% n: välin (a,b) jakovälien lukumäärä
% Tulos: T: sarake, aikapisteet.
% Y: Matriisi, jonka j:s sarake ilmaisee ratkaisufunktion
% y_j arvot T-aikapisteissä.
% i:s rivi: T(i) Y(i,1), Y(i,2), ..., Y(i,N)
% Siis jos on 2x2-systeemi, niin Y:ssä on 2 saraketta.
%
% Esim: Fsys=inline('[y(1)-y(1)*y(2)/2;-2*y(2)+y(1)*y(2)]','t','y');
% y0=[20;10];
% [T,Y]=eulerV(Fsys,[0,1],y0,20); plot(T,Y)
% Huom! Jos Fsys määritellään m-funktioksi, on kutsussa oltava
% 'Fsys' tai @Fsys.
%
a=Tspan(1);b=Tspan(2);
h=(b-a)/n;
N=length(ya);
Y=zeros(n+1,N); % i:s rivi: Y(i,1), Y(i,2), ..., Y(i,N)
T=a:h:b;
Y(1,:)=ya';
for i=1:n
Y(i+1,:)=Y(i,:)+h*(feval(fnimi,T(i),Y(i,:)))';
% Ffunktio 'fnimi' palauttaa pystyvektorin, siksi pitää transponoida.
end;
Olkoon t->y(t) AA-tehtävän ratkaisufunktio, ts. y'(t)=f(t,y(t)).
Taylorin kaavan mukaan:
y(t+h)=y(t)+h y'(t) + h2/2 y''(xi) = y(t) + h f(t,y(t))+O(h2).
Olkoon yn-1 Eulerin tuottama arvo hetkellä tn-1, ja olkoon t->u(t)
ratkaisu, joka toteuttaa alkuehdon u(tn-1)=yn-1
ln = u(tn)-yn = h2/2 u''(xi).Tämä on lokaali katkaisuvirhe, "Local truncation error", LTE. Siis virhe, joka syntyy yhdellä askeleella. (Tässä tarkastelussa ei käsitellä pyöristysvirheitä, vaan keskitytään pelkkään "menetelmävirheeseen",)
[CvL]-kirjassa merkitään LTEn.
Globaali katkaisuvirhe, gn=y(tn)-yn , missä t->y(t) on AA-tehtävän y'=f(t,y), y(t0)=y0 tarkka ratkaisu.
CvL-tiedostot:
ODE-luvun 9 m-fileet.
Ovat myös hakemistossa: /p/edu/mat-1.192/
Tässä Euleriin liittyvät.
-rw-r--r-- 1 apiola a-matlai 690 Feb 6 12:59 EulerRoundoff.m -rw-r--r-- 1 apiola a-matlai 710 Feb 6 12:59 FixedEuler.m -rw-r--r-- 1 apiola a-matlai 510 Feb 6 12:59 ShowEuler.m -rw-r--r-- 1 apiola a-matlai 626 Feb 6 12:59 ShowEulerRoundoff.m -rw-r--r-- 1 apiola a-matlai 326 Feb 6 12:59 ShowFixedEuler.m
..