- 在线时间
- 1084 小时
- 最后登录
- 2015-9-10
- 注册时间
- 2014-4-18
- 听众数
- 162
- 收听数
- 1
- 能力
- 10 分
- 体力
- 43976 点
- 威望
- 6 点
- 阅读权限
- 255
- 积分
- 15250
- 相册
- 0
- 日志
- 0
- 记录
- 1
- 帖子
- 3471
- 主题
- 2620
- 精华
- 1
- 分享
- 0
- 好友
- 513
升级   0% TA的每日心情 | 开心 2015-3-12 15:35 |
---|
签到天数: 207 天 [LV.7]常住居民III
 群组: 第六届国赛赛前冲刺培 群组: 国赛讨论 群组: 2014美赛讨论 群组: 2014研究生数学建模竞 群组: 数学中国试看培训视频 |
注意该算法只能完成二阶常微分方程双边值问题求解,至于其他形式的边值问题必须先转换到二阶形式
对于下面的二阶常微分方程
file:///http://attach.matlabsky.com/data/attachment/forum/month_0903/20090319_ee1f3a88f0e051ac1a7bzlh10ckxnfuy.gif
利用上面方程的线性结果和两个特殊的初值问题,我们可以构造两个等效的常微分初值方程初值问题,对于初值问题我们就可以直接使用ode**计算器或者龙哥库塔算法求解了。构造的两个初值问题为
此时我们可以构造原微分方程的解为
有上面的基础那我们很容编写直接边值问题的线性打靶算法,下面我写了一个供大家参考(参见附件),函数内部调用了自己编写的rk4()函数
%线性方程边值问题的打靶算法
%对微分方程y''=p*y'+q*y+r,a<t<b,u(a)=alpha,u(b)=beta,其中y,p,q和r都是x的函数
%构造成两个等效的初值问题
%u''=p*u'+q*u+r,u(a)=alpha,u'(a)=0
%v''=p*v'+q*v,v(a)=beta,v'(a)=1
%使用Matlab语言描述微分方程u和v,注意我们先必须化为一阶微分方程组
%f1=@(t,u)[u(2);p*u(2)+q*u(1)+r];
%f2=@(t,v)[v(2);p*v(2)+q*v(1)];
%则原微分方程的解为
%x=u+c*v=u+(beta-u(b))[img]file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\[LC3U)F{0XCAB)LKNIT0K@G.gif[/img](b)*v
%
%输入参数
% f1 描述方程u的Matlab函数,只能是句柄(@()和M函数),或者inline函数
% f2 描述方程v的Matlab函数
% a,b 微分计算区间[a,b]
% alpha,beta 上下边界
% maxiter 最大迭代次数
% 输出参数
% [t,x] 坐标点t对应的微分值x
%
我们举一个例子吧,对于下面的二阶边值问题
f1=@(t,u)[u(2);2*t/(1+t.^2)*u(2)-2/(1+t.^2)*u(1)+1];%这里必须使用“;”隔开
f2=@(t,u)[u(2);2*t/(1+t.^2)*u(2)-2/(1+t.^2)*u(1)];
a=0;b=4;alpha=1.25;beta=-0.95;maxiter=1000;
[t,x]=lineshoot(f1,f2,a,b,alpha,beta,maxiter);
plot(t,x)
复制代码
附件中的代码使用到了自己编写的四阶龙阁库塔算法rk4()函数,但是假如说对Matlab中的ode**函数比较熟悉的网友,可以直接调用ode45。
下面给出参考代码,但是程序是将原来的边值问题转换为如下四个初值问题:
lineshoot.rar
(1.68 KB, 下载次数: 0)
|
zan
|