Numsym L/ODE.html, Diffyhtälöitä, erityisesti numeriikkaa

("ODE-portaali") 25.2.04

Kirjallisuutta

[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

Linkit aikaisempiin

1. Perusteet

Molerin odes.pdf Lukaise 7.1: "Integrating diff. equ".

Diffyhtälön (alkuarvotehtävän) määritelmä:

 (AA)   y'=f(t,y), y(t_0)=y_0 
Ratkaisulla 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ä.)

2. Yksiaskelmenetelmät

2.1. Eulerin menetelmä

Kts. vaikka {CvL] s. 328 (jaetaan prujuina) Matlab-koodi Otetaan tähän:
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;

Eulerin menetelmä Matlabin ODE-tyylillä

Tehdään vektoriversio, joka toimii yleiselle 1. kertaluvun systeemille (ja tekee erillisen skalaariversionkin tarpeettomaksi). ..matlab/eulerV.m (otetaan taas)
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;

2.2 Lokaali ja globaali virhe

[CvL] 9.1.2 s. 329-...

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
..

Heikki K Apiola
Last modified: Tue Sep 9 14:30:47 EEST 2003