MATLAB Language
Реальные решатели дифференциальных уравнений (ОДУ)
Поиск…
Пример для odeset
Сначала мы инициализируем нашу начальную задачу, которую хотим решить.
odefun = @(t,y) cos(y).^2*sin(t);
tspan = [0 16*pi];
y0=1;
Затем мы используем функцию ode45 без каких-либо определенных опций для решения этой проблемы. Чтобы сравнить это позже, мы построим траекторию.
[t,y] = ode45(odefun, tspan, y0);
plot(t,y,'-o');
Теперь мы устанавливаем узкий относительный и узкий абсолютный предел терпимости к нашей проблеме.
options = odeset('RelTol',1e-2,'AbsTol',1e-2);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');
Мы установили жесткий относительный и узкий абсолютный предел толерантности.
options = odeset('RelTol',1e-7,'AbsTol',1e-2);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');
Мы устанавливаем узкий относительный и плотный абсолютный предел толерантности. Как и в предыдущих примерах с узкими пределами толерантности, мы видим, что траектория полностью отличается от первого графика без каких-либо конкретных опций.
options = odeset('RelTol',1e-2,'AbsTol',1e-7);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');
Мы установили жесткий относительный и плотный абсолютный предел допуска. Сравнивая результат с другим графиком, мы будем подчеркивать ошибки, сделанные с использованием узких пределов допуска.
options = odeset('RelTol',1e-7,'AbsTol',1e-7);
[t,y] = ode45(odefun, tspan, y0, options);
plot(t,y,'-o');
Следующее должно продемонстрировать компромисс между точностью и временем выполнения.
tic;
options = odeset('RelTol',1e-7,'AbsTol',1e-7);
[t,y] = ode45(odefun, tspan, y0, options);
time1 = toc;
plot(t,y,'-o');
Для сравнения мы затягиваем предел допуска для абсолютной и относительной погрешности. Теперь мы можем видеть, что без большого выигрыша потребуется значительно больше времени для решения нашей начальной задачи.
tic;
options = odeset('RelTol',1e-13,'AbsTol',1e-13);
[t,y] = ode45(odefun, tspan, y0, options);
time2 = toc;
plot(t,y,'-o');