使用数值方法和 matlab 求解微分方程

计算科学 matlab 时间积分
2021-12-18 06:12:50

(a) 考虑以下微分方程

Y(t)=11+t22[Y(t)]2
Y(0)=0

确切的解决方案是

Y(t)=t1+t2

使用欧拉法在matlab的帮助下求解以下微分方程(代码如下),运行程序为t=10h=0.1计算错误。然后运行它h=0.05计算误差并注意它是如何变化的。然后使用理查森外推法来提高准确性。计算误差。

function y=Euler(t,h,y0,t0)

  n=floor((t-t0)/h);
  y=y0;
  for i=1:n
      y=y+h*f(t0+h*(i-1),y);
  end;


function f=f(t,y)

f=1/(1+t^2)-2*y^2;
return;

(b) 现在使用 Runge-Kutta 方法求解 (a) 部分中的微分方程,运行程序t=10h=0.1与(a)部分相比,该误差应减少。解释区别。再次运行它h=0.05并注意错误是如何改变的。使用 Richardson 外推法来提高准确性并计算误差。

function y=Runge_Kutta(t,h,y0,t0)

  n=floor((t-t0)/h);
  y=y0;
  for i=1:n
          t=t0+h*(i-1);
          y=y+(h/2)*(f(t,y)+f(t+h,y+h*f(t,y)));
  end;


function f=f(t,y)

f=1/(1+t^2)-2*y^2;
return;

我试过的

(a) 当我以步长运行程序时0.1我有一个错误0.0986但是当我以步长运行它时0.05,我有一个错误0.0988这对我来说很有意义,因为较小的步长应该会产生较小的错误,但在这种情况下它不会出现。(代码没有任何问题,因为它是由我的教授给出的)。谁能给我解释一下。谢谢

(b) 当我再次运行这部分的程序时,我得到了一个错误0.0990对于两个步长0.10.05这比部分(a)的大,这对我来说是有意义的,因为龙格-库塔方法应该比欧拉方法更准确,因此误差更小,但在这种情况下似乎如此。谁能向我解释这里出了什么问题。谢谢

1个回答

当您使用指定的参数运行程序时,您不会收到错误,但会及时解决t=10.

要计算误差,您需要将数值解与解析解进行比较,这就是解析解的原因Ya给出了您的 EDO。您需要计算:

||YYa||L1
例如,绘制或写出结果h. 我建议您阅读有关规范和时间收敛的课程。您将能够在 MATLAB 中使用该norm命令执行此操作。

只有这样你才能得出结论并注意到,当你划分h除以 2,如果您的方案是 1 阶(欧拉),则误差除以 2,如果您的方案是 2 阶(Runge-Kutta),则除以 4。