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');


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow