用matlab求解常微分方程边值问题,可以使用 bvp4c函数、deval函数与bvpinit函数配合枯困解答。
具体使用方法如下:
solinit = bvpinit(xinit,uinit)
sol = bvp4c(@shootfun,@bcfun,solinit)
u= deval(sol,x)
其中:xinit——x的初始条件,uinit——u的初值;
shootfun——自定义常微分方程函数,bcfun——自定义边界条件函数;
bvpinit——计算边界值问题求解器的初始估计值
bvp4c——用四阶方法求解边界值问题
deval——计算微分方程解结构体
实现过程如下:
首先,自定义常微分方程函数shootfun(x,u),自定义边界条件函数 bcfun(ua,ub)
其二,确定x范围(0,1),初没誉念定u的初值(0,0)
其三,使用 bvpinit函数得到solinit粗略解网格结点,使用 bvp4c函数得到sol解的结构体,使用deval得到方程的数值解
然后,用plot函数分别绘出x-u(x)的关于数虚并值解和解析解的图形。
最后,计算出最大误差,即max(u数值解-u解析解)
按上述过程编程,可以得到如下结果。
1、存在问题:微分方程函数和边界条件函数的定义,function后面没有空格,导致两个函数被误作为变量,根本没起到作用。之所以没有报错,是因为twoode和twobc作为系统提供的例子,确实有这两个函数。这也是段裂从系统示例握州闭修改程序时应该尽量避免的做法迹段。
2、不知道你的初始估计solinit是怎么生成的,可以考虑使用下面的做法:
solinit = bvpinit(linspace(0,4,5),[0 0 0 0])
Matlab的 ode**系列解算器,默认将 tspan(1)作为初值条件时的 t,比如你将初值条件换为x(2)=x’(2)=0,那么tspan(1)就必须是 2。
但是工程应用中我们经枝链常遇到边值问题,这些是那些ode**函数无能为力的,当然我们可以自己编写函数求解(比
如shooting),但是那个毕竟不是某些人能力所及的,还好 Matlab中提供了 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 的上下限即认为两个边界),但也支持多边值(具体看帮助)
solinit:由bvpinit生成的初始化网格
options:BVP解算器优化参数,可以通过销搭坦bvpset设置,具体参数查看帮助
输出参数:
大部分同理ode45
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)