MATLABissa on tavallisten kattava valikoima
1. kertaluvun differentiaaliyhtälöryhmien alkuarvotehtävien
ratkaisufunktioita. Tässä muutama: ode45
,
ode23
ja ode15s
.
Korkeampaa kertalukua olevat
tavalliset dy:t on muutettavan 1. kl:n muotoon ennen
ratkaisua
Kaikkien kutsusyntaksi on sama.
Ensin vähän numeerisen ratkaisemisen teoriaa ja Matlab-esimerkkejä.
function [T,Y]=eulerS(f,Tspan,ya,n) % Tämä vain kehittely- ja opettelu- ja havainnollistustarkoituksessa. % Funktio eulerV hoitaa niin skalaari- kuin vektoriversion. % HA 21.8.2010 % Esim: y'=t+y, y(0)=1 % f=@(t,y)t+y % [T,Y]=eulerS(f,[0 4],1,6), plot(T,Y,T,Y,'.r');shg a=Tspan(1);b=Tspan(2); h=(b-a)/n; Y=zeros(n+1,1);T=(a:h:b)'; %Pystyvektorit yhdenmukaisesti ode45:n Y(1)=ya; % kanssa for j=1:n Y(j+1)=Y(j)+h*f(T(j),Y(j)); end;Funktion argumenttilista ja tulosten muoto on järjestetty juuri samaksi kuin Matlabin omien ratkaisijoiden. (Paitsi tässä tuo havainnollistukseen käytettävä viimeinen argumentti n.)
Menetelmän toimintaan voit omakohtaisesti tutustua tämän skriptin avulla. Huomaa, että sitä ei ajeta kokonaisena skriptinä, vaan leikataan/liimataan osissa ja nn-iteroidaan. (nn=nuolinäppäin)
% lyhyt/euleresim1.m % Eulerin menetelmä: alkuarvothtävälle y'=t+y, y(0)=1 % Nuolinäppäinversio, havainnollistus % Lineaarinen epähomogeeninen, tarkka ratkaisu: % y(t)=2exp(t) - t -1 clear; close all % y'=t+y, y(0)=1, ratk. välillä [0,1.2] f=@(t,y)t+y YL=[] % Talletetaan lasketut arvot välin loppupisteessä n=3; [T,Y]=eulerS(f,[0 4],1,n); [T Y],plot(T,Y,T,Y,'.r');shg;YL=[YL Y(end)] grid on; hold on %% Suorita tätä riviä nuolinäppäiniteroiden (tai editorissa: CTR-ENTER): n=2*n,[T,Y]=eulerS(f,[0 4],1,n); [T Y];plot(T,Y,T,Y,'.r');shg;YL=[YL Y(end)] %% Iteroinnin jälkeen: ytarkka=@(t) 2*exp(t)-t-1; t=linspace(0,4); plot(t,ytarkka(t),'k','LineWidth',3);shg %fplot(ytarkka,[0 4]) %plot-optiot eivät kaikki toimi fplot:lla format compact ['Loppupiste Tarkka ratk. Euler-approksimaatio'] [T(end) ytarkka(T(end)) YL(end)] virheetloppupisteesa=ytarkka(T(end))-YLTehtävä
Eulerskriptin ajo html-kauniiksi
euleresim1.m html-julkaisuksi ajettuna
("publish").
Yllä oleva tehtävä voitaisiin ratkaista näin:
close all; clear f=@(t,y)t+y tspan=[0 4]; y0=1; [T,Y]=ode45(f,tspan,y0); plot(T,Y,'*--') xlabel t, ylabel y(t)Jatketaan katsomalla tarkemmin tulosvektoreita T ja Y sekä virhettä.
size(T) diff(T) % Vektori (T(k+1) - T(k)), nähdään, että askeleet alussa ja lopussa % n. puolet keskivaiheen askelista. ytarkka=@(t) 2*exp(t)-t-1; subplot(2,1,1) plot(T,Y) title('Runge-Kutta 45-ratkaisu: y''=t+y, y(0)=1') % (Merkkijonossa y' hipsukan kahdennus.) subplot(2,1,2) plot(T,ytarkka(T)-Y) title('Virhe: ytarkka(t)-y_{RK}(t)') shgKomento
diff(T)
ilmaisee, että ratkaisija ode45 valitsee
diskretointipisteet omin päin. Tässä alku- ja loppupään askelpituudet ovat
n. puolet keskiosan askelpituudesta. Kyseessä on ns. adaptiivinen askelpituuden valinta, joka tehdään lokaalien virhearvioiden perusteella. (Kts.
[Moler], [CvL]) Tämä näkyy niin, että askeleet ovat yleensä pienempiä alueella,
jolla ratkaisufunktio kasvaa voimakkaammin.
Entä, jos halutaan laskea arvoja muissa kuin ode45:n valitsemissa pisteissä.
tpisteet=linspace(0,4); [Y,T]=ode45(f,tpisteet,y0);Tarkista, että ode45 palauttaa todella samat, syötteenä annetut tpisteet.
all(T==tpisteet') sum(T~=tpisteet') % vaihtoehtoisestiTämä ei merkitse, että annettuja
tpisteet
-arvoja
käytettäisiin laskennan jakopisteinä.
y''' = F(t,y,y',y''),merkitään: y=y1, y'=y2, y''=y3, jolloin yhtälö muuntuu systeemiksi:
y1' = y2 y2' = y3 y3' = F(t,y1,y2,y3) y=y1
Luentokalvolla no 14 käsitellään heiluriyhtälöä
y'' = -k sin(y)Tässä y(t) on heilahduskulma, y'(t) kulmanopeus ja y''(t) kulmakiihtyvyys.