MATLAB Language
Ordinarie differentiella ekvationer (ODE) -lösare
Sök…
Exempel för odeset
Först initialiserar vi vårt initiala värdeproblem som vi vill lösa.
odefun = @(t,y) cos(y).^2*sin(t);
tspan = [0 16*pi];
y0=1;
Vi använder sedan ode45-funktionen utan några specificerade alternativ för att lösa detta problem. För att jämföra det senare planerar vi banan.
[t,y] = ode45(odefun, tspan, y0);
plot(t,y,'-o');
Vi sätter nu en smal släkting och en smal absolut toleransgräns för vårt problem.
options = odeset('RelTol',1e-2,'AbsTol',1e-2);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');
Vi sätter en snäv relativ och smal absolut toleransgräns.
options = odeset('RelTol',1e-7,'AbsTol',1e-2);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');
Vi sätter en smal relativ och snäv absolut toleransgräns. Som i de tidigare exemplen med smala toleransgränser ser man banan vara helt annorlunda än den första handlingen utan några specifika alternativ.
options = odeset('RelTol',1e-2,'AbsTol',1e-7);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');
Vi sätter en tät relativ och snäv absolut toleransgräns. Att jämföra resultatet med det andra plottet kommer att understryka de fel som gjorts vid beräkningen med smala toleransgränser.
options = odeset('RelTol',1e-7,'AbsTol',1e-7);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');
Följande ska visa avvägningen mellan precision och körtid.
tic;
options = odeset('RelTol',1e-7,'AbsTol',1e-7);
[t,y] = ode45(odefun, tspan, y0, options);
time1 = toc;
plot(t,y,'-o');
Som jämförelse skärper vi toleransgränsen för absolut och relativt fel. Vi kan nu se att utan stor vinst i precision kommer det att ta betydligt längre tid att lösa vårt initiala värdeproblem.
tic;
options = odeset('RelTol',1e-13,'AbsTol',1e-13);
[t,y] = ode45(odefun, tspan, y0, options);
time2 = toc;
plot(t,y,'-o');