这个可以考虑用bvp解算器做
BVP解算器
solinit = bvpinit(x, yinit, params)
sol = bvpsolver(odefun,bcfun,solinit,options)
由于边值问题可能有多解,为了便于我们确定那个解是我们需要的,所以必须使用bvpinit函数对初值进行估计
解算器(bvpsolver):Matlab中提供了bvp4c和bvp5c,后者误差控制更好些
输入参数:
x:需要计算的网格点,相当于ode**的tspan
yinit:猜测的值,可以是具体值,也可以是函数,类似与 ode**的 x0
params:其它未知参数,也是一个猜测值
odefun:描述边值问题微分方程的函数句柄
bcfun:边值函数,一般是双边值(x 的上下限即认为两个边界),但也支持多边值(具体看帮助)
bc(y(a),y(b))=0
举个例子,y(0)=0,y(4)=-2 ---bcfun可写成 res =@(ya,yb) [ ya(1) ; yb(1) + 2];
y'(0)=y'(pi)=0,y(0)=1-----------bcfun可写成res = @(ya,yb) [ ya(2); yb(2);ya(1)-1 ];
solinit:由bvpinit生成的初始化网格
solinit = bvpinit(linspace(pa,pb,10),[1 0]);
bvpinit的第一个参数表示求解域及中心节点,第二个参数表示猜测初始值,基本都写成[1 0],它的变化一般对解无影响
options:BVP解算器优化参数,可以通过bvpset设置,具体参数查看帮助
降阶法表达二阶的常微分方程,ya(1)表示函数在求解域[a,b]的左边界a上的值,ya(2)表示函数的一阶导数在a上的值,“ya(1)-5”实际上是“ya(1)-5=0”的简写,表示y(x=a)=5,即函数在左边界上的值为5。yb是右边界,其他与ya相同。
用bvp4c求得的解sol是一个结构体,其中的子项y是一个2行多列的矩阵,第一行表示函数值,第二行表示函数的导数。另一个子项yp也是一个2行多列的矩阵,第一行表示函数一阶导数值,第二行表示函数二阶导数值。用deval求出的y与sol.y相同