主要内容

解决ODE常见问题

误差公差

问题或问题 回答

如何选择错误阈值RelTolAbsTol

RelTol,相对精度公差,控制计算答案中正确位数的数目。AbsTol,绝对误差公差,控制计算答案与真解之间的差异。每一步都有误差e在组件解满足

| e(我)|≤max (RelTol * abs (y (i)), AbsTol(我))

粗略地说,这意味着你想RelTol解决方案各部件数字正确,小于阈值的部件除外AbsTol(我).即使您对某个组件不感兴趣y(我)当它很小时,您可能必须指定for的值AbsTol(我)这足够小,可以得到一些正确的数字y(我)这样你就可以精确地计算出更多有趣的组件。

我想要精确到计算机水平的答案。为什么我不能简单的设定RelTol每股收益

你可以接近机器的精度,但不是那么接近。求解器不允许RelTol附近每股收益因为它们试图近似一个连续函数。在相当的公差每股收益,机器运算使所有函数看起来不连续。

我如何告诉解算器,我不关心得到一个解决方案组件的准确答案?

你可以增加绝对容错AbsTol对于此解决方案组件。如果公差大于解决方案组件,这表示组件中的数字不需要是正确的。解算器可能必须在这个分量中得到一些正确的数字,才能准确地计算其他分量,但它通常会自动处理这个问题。

问题的规模

问题或问题 回答

使用ODE套件可以解决多大的问题?

主要的限制是内存和时间。在每个时间步,非刚性问题的求解器分配长度向量n,在那里n是方程组的个数。刚性问题的求解器分配长度向量n但也要分配n——- - - - - -n雅可比矩阵。对于这些解算器,使用矩阵来指定雅可比矩阵稀疏模式可能是有利的JPattern选择odeset

如果问题是不僵硬的,或者如果你正在使用JPattern选项,它可能解决一个问题与数千个未知数。然而,在这种情况下,结果的存储可能会有问题。要求求解器仅在特定点评估解决方案,或者不带输出参数调用求解器,并使用输出函数监视解决方案。

我在解一个非常大的系统,但只关心它的几个组成部分y.有没有办法避免存储所有的元素?

是的。的OutputFcn选项是专门为此目的而设计的。当调用不带输出参数的求解器时,求解器不会分配存储空间来保存整个解决方案历史记录。相反,求解器调用OutputFcn (t y标志)在每个时间步骤。要保留特定元素的历史记录,可以编写一个输出函数,只存储或绘制您关心的元素。

集成的启动成本是多少?我如何降低它?

当求解器试图找到与问题规模相适应的步长时,启动成本最大。如果您碰巧知道一个合适的步长,请使用InitialStep选择。例如,如果您在事件定位循环中反复调用积分器,则在事件被正确缩放以适应下一个集成之前执行的最后一步。类型编辑ballode看一个例子。

积分器采取的第一步大小太大,它错过了重要的行为。

属性指定第一步大小InitialStep选择。积分器尝试这个步长,然后在必要时减小它。

解决方案组件

问题或问题 回答

解决方案和我期望的不一样。

如果您的期望是正确的,那么就减少默认值的容错。为了精确地解决“长”时间间隔内集成的问题,以及适度不稳定的问题,需要一个较小的相对误差公差。

检查是否有解决方案组件在一段时间内小于它们的绝对容错性。如果是这样,就不需要在这些组件中使用任何正确的数字。对于这些组件来说,这可能是可以接受的,但不能准确地计算它们可能会降低依赖它们的其他组件的准确性。

我的情节不够流畅。

增加价值完善从其默认值4数值8ode78ode89,1在其他解算器中。值越大完善,则解算器生成的输出点越多。值的增加对执行速度影响不大完善从它的默认值。

我正在绘制它的解,它看起来很好,但代码在某个点卡住了。

首先验证ODE函数在代码卡住的地方是否平滑。如果不是,那么求解器必须采取小步骤来处理这个问题。它可能有助于将积分区间分割成ODE函数平滑的部分。

如果函数是平滑的,而代码所采取的步骤非常小,那么您可能正在尝试用一个不用于此目的的解决器来解决一个棘手的问题。切换到使用一个僵硬的解算器ode15sode23sode23t,或ode23tb

如果是末值而不是初值呢?

ODE套件的所有求解器都允许您在时间上向后或向前求解。解析器的语法是[t,y] = ode45(odefun,[t0 tf],y0);语法接受t0 >特遣部队

我的集成过程非常缓慢,使用了太多的时间步骤。

首先,检查tspan不太长。记住,解算器使用尽可能多的时间点来产生一个平滑的解。如果ODE函数在很短的时间内发生变化tspan,则求解器使用大量的时间步长。长期集成是一个困难的问题。打破tspan成更小的碎片。

如果ODE函数没有明显的变化tspan间隔,可能是你的问题是僵硬的。试着用一个硬解算器ode15sode23sode23t,或ode23tb

最后,确保ODE函数是以一种有效的方式编写的。求解者在ODE函数中求导数很多次。数值积分的代价很大程度上取决于求ODE函数的代价。与其在每次求值时重新计算复杂的常量参数,不如将它们存储在全局变量中,或者只计算一次并将它们传递给嵌套函数。

我知道,解决方案有时会发生根本性的变化t,在那里T0 <= t <= tf,但是集成商没有“看到”它。

如果你知道有一个急剧的变化t试着打破tspan分成两段,(t0 t)[t]特遣部队,调用积分器两次或继续集成使用odextend

如果微分方程有周期系数或解,通过将最大步长限制为周期的长度,确保解算器不会跨越周期。金宝搏官方网站

问题类型

求解器能处理用直线法离散的偏微分方程吗?

是的,因为离散化产生了一个ode系统。取决于离散化,你可能有一个涉及质量矩阵的形式,这是ODE求解器提供的。系统通常是僵硬的。如果偏微分方程是抛物线的,或者在不同的时间尺度上发生一些现象,如流体中的化学反应,这是可以预期的。在这种情况下,使用四个硬解算器之一ode15sode23sode23t,或ode23tb

如果有很多方程,用JPattern选项指定雅可比稀疏模式。这是成功与失败之间的区别,因为它可以防止计算过于昂贵。类型编辑burgersode来看一个例子JPattern

如果系统不僵硬,或者不是很僵硬,那么ode23数值比僵硬的解算器更有效吗ode15sode23sode23t,ode23tb

用MATLAB可以直接求解一维抛物型椭圆型偏微分方程®PDE解算器pdepe

我能整合一组抽样数据吗?

不直接。相反,用插值或其他方法来拟合数据,将数据表示为函数。这个函数的平滑性是至关重要的。分段多项式拟合(如样条)看起来很平滑,但对求解器来说很粗糙;当拟合的导数有跳跃时,求解器会采取小步骤。要么使用平滑函数来表示数据,要么使用低阶求解器(ode23ode23sode23tode23tb),对平滑度不那么敏感。看到带有时间相关项的ODE了一个例子。

另请参阅

|||

相关的话题