从系列中:用MATLAB求解ode
ODE2实现了一个中点方法,每个步骤有两个函数求值。这种方法比欧拉方法准确两倍。定义正弦函数的非线性方程提供了一个例子。练习包括实现一个相关的梯形方法。
用数值方法求解常微分方程的代价是用它每步求函数f的次数来衡量的。欧拉方法每步求一次f。这里有一个新方法,每一步计算两次。如果f在步骤的开始求一次,得到斜率s1,然后s1在间隔的一半处取欧拉步,则在间隔的中间求函数值,得到斜率s2。然后用s2来完成这一步。出于显而易见的原因,这被称为中点法。
这是ode2。它实现了中点方法,每一步计算函数两次。结构与ode1相同。同样的参数,同样的for循环,但是现在我们在步骤的开始有s1,在步骤中间有s2,然后这一步实际上是用s2完成的。
这是一个关于三角函数的例子。Dy / dt等于√(1 - y²)从原点开始,区间为0到/ 2。现在,因为我把它叫做三角函数的例子,你可能只是——这是一个可分离变量方程——做积分,或者你可以猜测——猜测答案是sint,因为sint的导数是cos t,它是根号下(1 - y²)
我们来做一下。F是匿名函数√(1 - y²)T0等于0。令h = / 32。tfinal是/ 2。y0 = 0。这是我对ode2的调用,有这五个参数,它产生了这个输出。
现在我要画出来。加上t。这是t的值作为一列向量,我们画出来。在图上做一些注释。这是我们的图。这是sint的图像,由ode2生成的点。
现在我忍不住去看看这些答案。这应该是sint的值,这应该是在/ 2处得到1。得到0.997。这给了你们一个大概的概念我们从这个粗糙的数值方法中得到了多少精度。
让我们看一下中点方法的动画。微分方程是y ' = 2y,从t0 = 0开始,步长为1,一直到3,从y0 = 10开始,使用ode2。这是动画。这是t0和y0。求函数在y0处的值。2 * y0 = 20,沿着这个斜率在区间上走一半,得到20。求函数值,斜率是40,所以我们在区间内一直取40的斜率直到50。
这是第一步。现在我们将重新缩放图窗口。现在是50。求函数的值。斜率是100,取斜率的一半,到区间的中间,求函数值。斜率是200,所以我们取斜率200到250。这是第二步。重新缩放图窗口。求函数的值。斜率是500。 Take that step halfway across the interval, evaluate the slope there. The slope is 1,000, so we take a step with slope of 1,000 to get up to 1,250 as our final value.
由于这是一个关于y的快速递增函数,我们用中点法生成的值远远大于用欧拉法生成的值,我们用ode1看到的。
这里有一个练习。修改ode2,创建ode2t,它实现了伴生方法梯形方法。求函数在区间开始处的值,得到s1。用s1贯穿整个区间。求区间右端点的函数值,得到s2。然后用s1和s2的平均值来做这一步。这就是梯形法。
您也可以从以下列表中选择一个网站:
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。