ODE45 和 Runge-Kutta 方法与解析解相比的绝对误差 [英] Absolute error of ODE45 and Runge-Kutta methods compared with analytical solution

查看:51
本文介绍了ODE45 和 Runge-Kutta 方法与解析解相比的绝对误差的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果有人可以帮助解决以下问题,我将不胜感激.我有以下 ODE:

dr/dt = 4*exp(0.8*t) - 0.5*r ,r(0)=2, t[0,1] (1)

我以两种不同的方式解决了 (1).通过Runge-Kutta 方法(四阶)和ode45 在Matlab 中.我将这两个结果与解析解进行了比较,解析解为:

r(t) = 4/1.3 (exp(0.8*t) - exp(-0.5*t)) + 2*exp(-0.5*t)

当我绘制每种方法相对于精确解的绝对误差时,我得到以下结果:

对于 RK 方法,我的代码是:

h=1/50;x = 0:h:1;y = 零(1,长度(x));y(1) = 2;F_xy = @(t,r) 4.*exp(0.8*t) - 0.5*r;对于 i=1:(长度(x)-1)k_1 = F_xy(x(i),y(i));k_2 = F_xy(x(i)+0.5*h,y(i)+0.5*h*k_1);k_3 = F_xy((x(i)+0.5*h),(y(i)+0.5*h*k_2));k_4 = F_xy((x(i)+h),(y(i)+k_3*h));y(i+1) = y(i) + (1/6)*(k_1+2*k_2+2*k_3+k_4)*h;% 主要方程结尾

对于ode45:

tspan = 0:1/50:1;x0 = 2;f = @(t,r) 4.*exp(0.8*t) - 0.5*r;[tid, y_ode45] = ode45(f,tspan,x0);

我的问题是,为什么我在使用 ode45 时会出现振荡?(我指的是绝对误差).两种解决方案都是准确的 (1e-9),但是在这种情况下 ode45 会发生什么?

当我计算 RK 方法的绝对误差时,为什么它看起来更好?

解决方案

您的 RK4 函数采取的固定步骤比 ode45 采取的步骤要小得多.您真正看到的是由 .

如果您想强制 ode45 使用 1/50 的步骤,您可以这样做(因为您的 ODE 很简单):

opts = odeset('MaxStep',1/50,'InitialStep',1/50);溶胶 = ode45(f,tspan,x0,opts);差异(sol.x)y_ode45 = deval(sol,tspan);

对于另一个实验,尝试扩大积分区间以积分到 t = 10 也许.您会在错误中看到许多有趣的行为(绘制相对错误在这里很有用).你能解释一下吗?您可以使用 ode45odeset 来产生表现良好的结果吗?将大区间的指数函数与自适应步长方法集成是具有挑战性的,ode45 不一定是完成这项工作的最佳工具.有替代方案,但它们可能需要一些编程.

I would appreciate if someone can help with the following issue. I have the following ODE:

dr/dt = 4*exp(0.8*t) - 0.5*r   ,r(0)=2, t[0,1]       (1)

I have solved (1) in two different ways. By means of the Runge-Kutta method (4th order) and by means of ode45 in Matlab. I have compared the both results with the analytic solution, which is given by:

r(t) = 4/1.3 (exp(0.8*t) - exp(-0.5*t)) + 2*exp(-0.5*t)

When I plot the absolute error of each method with respect to the exact solution, I get the following:

For RK-method, my code is:

h=1/50;                                            
x = 0:h:1;                                        
y = zeros(1,length(x)); 
y(1) = 2;    
F_xy = @(t,r) 4.*exp(0.8*t) - 0.5*r;                   
for i=1:(length(x)-1)                              
    k_1 = F_xy(x(i),y(i));
    k_2 = F_xy(x(i)+0.5*h,y(i)+0.5*h*k_1);
    k_3 = F_xy((x(i)+0.5*h),(y(i)+0.5*h*k_2));
    k_4 = F_xy((x(i)+h),(y(i)+k_3*h));
    y(i+1) = y(i) + (1/6)*(k_1+2*k_2+2*k_3+k_4)*h;  % main equation
end

And for ode45:

tspan = 0:1/50:1;
x0 = 2;
f = @(t,r) 4.*exp(0.8*t) - 0.5*r;
[tid, y_ode45] = ode45(f,tspan,x0);

My question is, why do I have oscillations when I use ode45? (I am referring to the absolute error). Both solutions are accurate (1e-9), but what happens with ode45 in this case?

When I compute the absolute error for the RK-method, why does it looks nicer?

解决方案

Your RK4 function is taking fixed steps that are much smaller than those that ode45 is taking. What you're really seeing is the error due to polynomial interpolation that is used to produce the points in between the true steps that ode45 takes. This is often referred to as "dense output" (see Hairer & Ostermann 1990).

When you specify a TSPAN vector with more than two elements, Matlab's ODE suite solvers produce fixed step size output. This does not mean that they that they actually use a fixed step size or that they use the step sizes specified in your TSPAN however. You can see the actual step sizes used and still get your desired fixed step size output by having ode45 output a structure and using deval:

sol = ode45(f,tspan,x0);
diff(sol.x) % Actual step sizes used
y_ode45 = deval(sol,tspan);

You'll see that after an initial step of 0.02, because your ODE is simple it converges to 0.1 for the subsequent steps. The default tolerances combined with the default maximum step size limit (one tenth the integration interval) determine this. Let's plot the error at the true steps:

exactsol = @(t)(4/1.3)*(exp(0.8*t)-exp(-0.5*t))+2*exp(-0.5*t);
abs_err_ode45 = abs(exactsol(tspan)-y_ode45);
abs_err_ode45_true = abs(exactsol(sol.x)-sol.y);
abs_err_rk4 = abs(exactsol(tspan)-y);
figure;
plot(tspan,abs_err_ode45,'b',sol.x,abs_err_ode45_true,'k.',tspan,abs_err_rk4,'r--')
legend('ODE45','ODE45 (True Steps)','RK4',2)

As you can see, the error at the true steps grows more slowly than the error for RK4 (ode45 is effectively a higher order method than RK4 so you'd expect this). The error grows in between the integration points due to the interpolation. If you want to limit this, then you should adjust the tolerances or other options via odeset.

If you wanted to force ode45 to use a step of 1/50 you can do this (works because your ODE is simple):

opts = odeset('MaxStep',1/50,'InitialStep',1/50);
sol = ode45(f,tspan,x0,opts);
diff(sol.x)
y_ode45 = deval(sol,tspan);

For another experiment, try enlarging the integration interval to integrate out to t = 10 maybe. You'll see lots of interesting behavior in the error (plotting relative error is useful here). Can you explain this? Can you use ode45 and odeset to produce results that behave well? Integrating exponential functions over large intervals with adaptive step methods is challenging and ode45 is not necessarily the best tool for the job. There are alternatives however, but they may require some programming.

这篇关于ODE45 和 Runge-Kutta 方法与解析解相比的绝对误差的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆