在MATLAB中求解ode:刚度,ODE23s, ODE15s
从系列:用MATLAB求解ode
如果一个问题的解变化缓慢,但附近有快速变化的解,则该问题称为刚性问题,因此数值方法必须采取小步骤才能得到满意的结果。火焰模型演示了刚度。名称以“s”结尾的ODE求解器,例如ODE23s和ODE15s,采用隐式方法,用于解决复杂问题。这些方法每一步都需要更多的工作,但只需更少的步骤。
我想通过在我们的火焰例子中运行ode45(主要的MATLAB ODE求解器)来说明刚度的重要概念。微分方程是y ' = y²- y³,我要选择一个非常小的初始条件,10 ^ (- 6)t的最终值是2 / y0,我要提出一个适中的精度要求,10的- 5次方。
现在让我们运行带有默认输出的ode45。现在,看,它移动得非常慢。这需要很多步骤。所以我在这里按下停止按钮。它非常努力地工作。让我们放大看看为什么它要走这么多的步骤,非常密集的步骤。
这是刚度。它满足了我们强加的精度要求。所有这些步骤都在10的- 6次方(1的六次方)内,但是步骤非常小。这些步长是如此之小,以至于图像甚至无法辨别步长。
这是刚度。这是一个效率问题。这是我们要求的。它满足了准确性的要求,但它必须采取非常小的步骤来实现它。
让我们尝试另一个ODE求解器——ode23。把它改成23,看看效果如何。出于同样的原因,它也采取了非常小的步骤。如果我们把这里放大,我们会看到同样的行为。但它采取非常小的步骤,以达到所需的准确性。
现在让我介绍一个新的求解器,ode23s。s代表刚度。这是用来解决棘手问题的。砰的一声,它上升了,转了个弯,只需要几步就能得到最后的结果。在那里它很快地转弯了。
稍后我们将看到ode23s是如何工作的,但首先让我们尝试定义刚度。这是一个没有精确数学定义的定性概念。这取决于问题本身,也取决于求解器和精度要求。
但这是一个很重要的概念。如果一个问题的解决方案被寻求得非常缓慢,我们就会说它是僵硬的,但附近却有非常迅速的解决方案。因此,数值方法必须循序渐进才能得到满意的结果。
常微分方程的刚性方法必须是隐式的。它们必须包含从前进的时间步中回顾过去的公式。这些方法的原型是后向欧拉方法,或隐式欧拉方法。
这个公式定义了y (n + 1)但没有告诉我们如何计算它。我们要解出这个方程(y n + 1)我不会详细讲我们是怎么做的。它涉及到类似牛顿法的东西需要知道导数,或者f的导数的近似值,但这让你对僵硬方法有了一个概念。
我喜欢做一个类比,就像在我们西南部的峡谷中远足一样。像ode23和45这样的显式方法在峡谷的壁上迈上台阶,在峡谷的两侧来回移动,沿着峡谷走得很慢。而隐式方法,比如ode15,则是在峡谷中展望前方,展望你想去的地方,在峡谷中快速前进。
刚性求解器ode23s使用隐式二阶公式和相关的三阶误差估计器。它求的是f在每一步关于t和f的偏导数,这是很昂贵的。它在粗糙的容错方面很有效,比如图形精度。而且它的开销相对较低。
通过比较,刚性求解器ode15s可以配置为使用变阶数值微分公式NDF或相关的后向微分公式BDF。这两种情况都不会在前面的步骤中保存函数的多个值。顺序在1和5之间自动变化,它计算偏导数的频率较低,并看到在更高的公差比23s的效率。
您也可以从以下列表中选择网站:
如何获得最佳的网站性能
选择中国网站(中文或英文)以获得最佳的网站表现。其他MathWorks国家网站没有针对从您的位置访问进行优化。