matlab编程,求教如何编程,急求?

matlab编程,求教如何编程,急求?,第1张

用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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12348082.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存