MATLAB Language
Rozwiązania równań różniczkowych zwyczajnych (ODE)
Szukaj…
Przykład dla odeset
Najpierw inicjalizujemy nasz problem wartości początkowej, który chcemy rozwiązać.
odefun = @(t,y) cos(y).^2*sin(t);
tspan = [0 16*pi];
y0=1;
Następnie używamy funkcji ode45 bez żadnych określonych opcji, aby rozwiązać ten problem. Aby to później porównać, wykreślamy trajektorię.
[t,y] = ode45(odefun, tspan, y0);
plot(t,y,'-o');
Teraz ustaliliśmy wąski względny i wąski absolutny limit tolerancji dla naszego problemu.
options = odeset('RelTol',1e-2,'AbsTol',1e-2);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');
Ustalamy ścisły względny i wąski absolutny limit tolerancji.
options = odeset('RelTol',1e-7,'AbsTol',1e-2);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');
Ustalamy wąską względną i ścisłą absolutną granicę tolerancji. Podobnie jak w poprzednich przykładach z wąskimi granicami tolerancji, trajektoria całkowicie różni się od pierwszego wykresu bez żadnych konkretnych opcji.
options = odeset('RelTol',1e-2,'AbsTol',1e-7);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');
Ustalamy ścisłą względną i ścisłą granicę tolerancji. Porównanie wyniku z innym wykresem podkreśli błędy popełnione podczas obliczania przy wąskich granicach tolerancji.
options = odeset('RelTol',1e-7,'AbsTol',1e-7);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');
Poniższe informacje powinny wykazać kompromis między precyzją a czasem działania.
tic;
options = odeset('RelTol',1e-7,'AbsTol',1e-7);
[t,y] = ode45(odefun, tspan, y0, options);
time1 = toc;
plot(t,y,'-o');
Dla porównania zaostrzamy granicę tolerancji dla błędu bezwzględnego i względnego. Teraz widzimy, że bez dużego przyrostu precyzji rozwiązanie naszego problemu z wartością początkową potrwa znacznie dłużej.
tic;
options = odeset('RelTol',1e-13,'AbsTol',1e-13);
[t,y] = ode45(odefun, tspan, y0, options);
time2 = toc;
plot(t,y,'-o');