使用延续解决BVP
这个例子展示了如何使用延拓来解决一个数值上困难的边值问题,它有效地将问题分解成一系列更简单的问题。
为
,考虑微分方程
.
问题是在区间上提出的
并且受边界条件的约束
,
.
当
时,方程的解在附近经历了一个快速的转变
,因此数值求解较为困难。相反,本例使用continuation来遍历的几个值
直到
.每个中间解都被用作下一个问题的初始万博 尤文图斯猜测。
要在MATLAB中求解这个方程组,您需要在调用边值问题求解器之前对方程、边界条件和初始猜测进行编码bvp4c.您可以将所需的函数作为本地函数包含在文件的末尾(如这里所做的),也可以将它们保存为单独的命名文件,保存在MATLAB路径的目录中。
代码方程
使用替换
而且
你可以把这个方程重写成一阶方程组
,
.
编写一个函数来编码带有签名的方程Dydx =冲击波(x,y),地点:
x是自变量。
y是因变量。
它们(1)给出了方程
,它们(2)给出了方程
.
使函数向量化,这样震波([x1 x2…,[y1 y2…])返回[shockode(x1,y) shockode(x2,y2)…].这种方法提高了求解器的性能。
对应的函数是
函数Dydx = shockode(x,y) pix = *x;就要= [y (2:) - x / e。* y(2:) -π^ 2 * cos(沥青)-沥青/ e。*罪(沥青)];结束
注意:所有函数都作为局部函数包含在示例的末尾。
代码边界条件
BVP求解器要求边界条件为这样的形式
.在这种形式下,边界条件为:
,
.
编写一个函数来编码带有签名的边界条件Res = shockbc(ya,yb),地点:
丫边界条件的值是在区间的开始吗
.
yb边界条件的值在区间的末尾吗
.
对应的函数是
函数Res = shockbc(ya,yb)%边界条件Res = [ya(1)+2 yb(1)];结束
代码雅克比
在该问题中,ODE函数和边界条件的解析雅可比矩阵易于计算。提供雅可比矩阵使求解器更有效,因为求解器不再需要用有限差分来近似它们。
对于ODE函数,雅可比矩阵是
.
对应的函数是
函数Jac = (x,y,e) Jac = [0 1 0 -x/e];结束
类似地,对于边界条件,雅可比矩阵为
,
.
对应的函数是
函数[dBCdya,dBCdyb] = shockbcjac(ya,yb) dBCdya = [10 0;0 0];dBCdyb = [0 0;1 0];结束
初步猜测
在5个点的网格上使用一个恒定的猜想
.
Sol = bvpinit([-1 -0.5 0 0.5 1],[1 0]);
解决方程
如果你想直接解这个方程
,则解算器是无法克服条件差的问题接近的
过渡点。而是求的解
,这个例子通过解决一系列的问题来使用延拓
,
,
.求解器在每次迭代中的输出充当下一次迭代中的解的猜测(这就是为什么初始猜测的变量来自bvpinit是索尔,求解器的输出也被命名索尔).
因为雅可比矩阵的值取决于
,设置循环中的选项,指定shockjac而且shockbcjac雅可比矩阵的函数。另外,打开向量化shockode编码来处理值的向量。
E = 0.1;为I = 2:4 e = e/10;选项= bvpset(“FJacobian”@ (x, y) shockjac (x, y, e),“BCJacobian”@shockbcjac,矢量化的,“上”);Sol = bvp4c(@(x,y) shockode(x,y,e),@shockbc, Sol, options);结束
策划解决方案
绘制结果bvp4c对于网格
和解决方案
.使用延拓,求解器能够处理点的不连续
.
情节(sol.x sol.y (1:)“o”);轴([-1 1 -2.2 2.2]);标题([“当e = x = 0时,有一个冲击”sprintf (“%即”, e)“。”]);包含(“x”);ylabel (“解决方案y”);
本地函数
这里列出的是BVP求解器的局部函数bvp4c调用来计算解决方案。或者,您可以将这些函数保存为它们自己的文件,保存在MATLAB路径的目录中。
函数Dydx =冲击波(x,y,e)%待解方程Pix = pi*x;就要= [y (2:) - x / e。* y(2:) -π^ 2 * cos(沥青)-沥青/ e。*罪(沥青)];结束%-------------------------------------------函数Res = shockbc(ya,yb)%边界条件Res = [ya(1)+2 yb(1)];结束%-------------------------------------------函数Jac =震荡(x,y,e)%激波雅可比矩阵Jac = [0 1 0 -x/e];结束%-------------------------------------------函数[dBCdya,dBCdyb] = shockbcjac(ya,yb)% shockbc的雅可比矩阵dBCdya = [10 0;0 0];dBCdyb = [0 0;1 0];结束%-------------------------------------------
另请参阅
相关的话题
这个例子展示了如何使用延拓来解决一个数值上困难的边值问题,它有效地将问题分解成一系列更简单的问题。 为
. 问题是在区间上提出的
,
. 当 要在MATLAB中求解这个方程组,您需要在调用边值问题求解器之前对方程、边界条件和初始猜测进行编码 使用替换
,
. 编写一个函数来编码带有签名的方程 使函数向量化,这样 对应的函数是 注意:所有函数都作为局部函数包含在示例的末尾。 BVP求解器要求边界条件为这样的形式
,
. 编写一个函数来编码带有签名的边界条件 对应的函数是 在该问题中,ODE函数和边界条件的解析雅可比矩阵易于计算。提供雅可比矩阵使求解器更有效,因为求解器不再需要用有限差分来近似它们。 对于ODE函数,雅可比矩阵是
. 对应的函数是 类似地,对于边界条件,雅可比矩阵为
, 对应的函数是 在5个点的网格上使用一个恒定的猜想 如果你想直接解这个方程 因为雅可比矩阵的值取决于 绘制结果 这里列出的是BVP求解器的局部函数代码方程
x
y
它们(1)
函数
代码边界条件
丫
yb
函数
代码雅克比
函数
函数
初步猜测
Sol = bvpinit([-1 -0.5 0 0.5 1],[1 0]);
解决方程
E = 0.1;
策划解决方案
情节(sol.x sol.y (1:)
本地函数
函数
另请参阅
相关的话题