Matlab bvp4c:输出数组的长度并不总是与初始猜测相同
Matlab's bvp4c: output arrays not always the same length as the initial guess
Matlab函数bvp4c
求解边值问题。它以微分方程、边界条件和初始猜测作为输入,returns 结构数组包含 x
、y
和 yp
的数组(代表 "y prime", 或 y'
).
输出数组的长度应该与最初猜测的长度相同,但我发现并非总是如此。我检查了输入的维度(初始猜测,x
总是 1x101 double
,y
总是 16x101 double
)和输出(有时 1x101 double
x
和 16x101 double
对于 y
和 yp
应该是,但通常是不同的值,例如 1x91 double
和 16x91 double
或 1x175 double
和 16x175 double
).
查看输出数组x
,当它的长度关闭时,一些额外的值被挤进来,或者一些被取出。例如,初始猜测在x=0
和x=1
之间有100个位置,x
数组应该是[0 0.01 0.02 ... 1]
,但有时会显示0.015
这样的新位置向上。
问题:为什么会出现这种情况,如何解决?
"The length of the output arrays should be the same as that of the initial guess ...." 这是不正确的。
如 bvp4c
documentation, sol.x
contains a "[mesh] selected by bvp4c
" with an "[approximation] to y(x) at the mesh points of sol.x
". In order to evaluate bvp4c
's solution on your mesh, use deval
中所述。
为什么bvp4c
选择网格?如果您有 MathWorks 帐户,请引用 cited paper1, which you can get in full here:
Because BVPs can have more than one solution, BVP codes require users to supply a guess for the solution desired. The guess includes a guess for an initial mesh that reveals the behavior of the desired solution. The codes then adapt the mesh so as to obtain an accurate numerical solution with a modest number of mesh points.
由于稳定的 BVP 通常具有强烈依赖于其边界值的全局行为,因此可能需要细化两个边界之间的空间网格,以便使用该方法的局部选择的基函数正确地近似所需的解.然而,也可能有部分网格不需要细化,在某些情况下甚至可以粗化以保持相当小的残差和准确的近似。因此,为了一般效率,猜测网格根据一些局部选择的度量自适应地细化或粗化(因为 bvp4c
是基于配置的,度量可能是基于点或基于划分积分的)使得网格 return由 bvp4c
编辑,在某种意义上,足以在边界内进行通用插值。
我还会注意到,这与数值求解 IVP 不同,因为它们的状态在整个时间积分轨迹上不是全局的,并且仅取决于当前状态到下一个时间步长,如果可能的话,可能还取决于之前的时间步长使用多步法或求解延迟微分方程,这使得细化本质上是局部的。 IVP 的这种本地行为允许像 ode45
到 return 这样的函数在预选时间值处获得解决方案,因为它可以在执行时间行进时在选定点本地优化解决方案(这被称为密集输出)。
1 香槟,L.F.,M.W。 Reichelt 和 J. Kierzenka,"Solving Boundary Value Problems for Ordinary Differential Equations in MATLAB with bvp4c".
Matlab函数bvp4c
求解边值问题。它以微分方程、边界条件和初始猜测作为输入,returns 结构数组包含 x
、y
和 yp
的数组(代表 "y prime", 或 y'
).
输出数组的长度应该与最初猜测的长度相同,但我发现并非总是如此。我检查了输入的维度(初始猜测,x
总是 1x101 double
,y
总是 16x101 double
)和输出(有时 1x101 double
x
和 16x101 double
对于 y
和 yp
应该是,但通常是不同的值,例如 1x91 double
和 16x91 double
或 1x175 double
和 16x175 double
).
查看输出数组x
,当它的长度关闭时,一些额外的值被挤进来,或者一些被取出。例如,初始猜测在x=0
和x=1
之间有100个位置,x
数组应该是[0 0.01 0.02 ... 1]
,但有时会显示0.015
这样的新位置向上。
问题:为什么会出现这种情况,如何解决?
"The length of the output arrays should be the same as that of the initial guess ...." 这是不正确的。
如 bvp4c
documentation, sol.x
contains a "[mesh] selected by bvp4c
" with an "[approximation] to y(x) at the mesh points of sol.x
". In order to evaluate bvp4c
's solution on your mesh, use deval
中所述。
为什么bvp4c
选择网格?如果您有 MathWorks 帐户,请引用 cited paper1, which you can get in full here:
Because BVPs can have more than one solution, BVP codes require users to supply a guess for the solution desired. The guess includes a guess for an initial mesh that reveals the behavior of the desired solution. The codes then adapt the mesh so as to obtain an accurate numerical solution with a modest number of mesh points.
由于稳定的 BVP 通常具有强烈依赖于其边界值的全局行为,因此可能需要细化两个边界之间的空间网格,以便使用该方法的局部选择的基函数正确地近似所需的解.然而,也可能有部分网格不需要细化,在某些情况下甚至可以粗化以保持相当小的残差和准确的近似。因此,为了一般效率,猜测网格根据一些局部选择的度量自适应地细化或粗化(因为 bvp4c
是基于配置的,度量可能是基于点或基于划分积分的)使得网格 return由 bvp4c
编辑,在某种意义上,足以在边界内进行通用插值。
我还会注意到,这与数值求解 IVP 不同,因为它们的状态在整个时间积分轨迹上不是全局的,并且仅取决于当前状态到下一个时间步长,如果可能的话,可能还取决于之前的时间步长使用多步法或求解延迟微分方程,这使得细化本质上是局部的。 IVP 的这种本地行为允许像 ode45
到 return 这样的函数在预选时间值处获得解决方案,因为它可以在执行时间行进时在选定点本地优化解决方案(这被称为密集输出)。
1 香槟,L.F.,M.W。 Reichelt 和 J. Kierzenka,"Solving Boundary Value Problems for Ordinary Differential Equations in MATLAB with bvp4c".