Matlab ode45 解微分方程

在用odesolver(ode45, ode15s, …)来解微分方程的时候,最基本的用法是: 

[t, y] = odesolver(odefun, tspan, y0); 

这里的odefun是待求的微分方程。那么odefun中一般会含有多个系统参数,通常要通过改变参数来观察系统动态的变化。那么如何在调用odesolver的时候传递参数呢? 
以前,我都是用全局变量的写法,将参数在主函数和子函数中分别都定义为global,这样做有一个弱点:针对系统不同,参数的表达与数量有变化的时候,程序通常要做变化,通用性不强。那么最好是在调用的时候进行传递,方法如下: 

实际上很简单,就是将一切其他的参数都写在括号中就可以了!但是要注意的是:odesolver的第四个参数一定是options,也就是对微分方程添加补充功能的参数(类型为structure,要用odeset来定义),那么其他系统参数就只能从第五个参数写起。也就是说,第四个参数不可以为空,一定要定义某种option加进去,或者用使用空白矩阵(placeholder)。这样调用的时候格式就是:

 [t, y] = odesolver(odefun, tspan, y0, options, parameter1, parameter2); 或者 

[t, y] = odesolver(odefun, tspan, y0, [], parameter1, parameter2);

 然后定义微分方程的时候也要有参数的地方:

 function dydt = odefun(t, y, parameter1, parameter2) dydt = [ eqn-1; eqn-2; …]; 就OK了。 


另一种用法: 

[T,Y] = ode45(@(t,y) rigid(t,y,Lambda,Lami,Cs,ionization,Ed),[0 100],[PHI_0,E_0,M_0,Gma_0],options); Lambda,Lami,Cs,ionization,Ed是参数 之前有声明 t y是变量 ,[PHI_0,E_0,M_0,Gma_0],是初始值 

-------------------------------------------------- 

function dy = rigid(t,y,Lambda,Lami,Cs,ionization,Ed) dy = zeros(4,1);    % a column vector dy(1) = y(2); 
dy(2) = exp(y(1))-y(3)/y(4); 
dy(3)=Lambda*ionization/Cs*exp(y(1)); 
dy(4) = -y(4)*Lambda/Lami-Lambda*ionization/Cs-y(2)/y(4)-Ed/y(4); 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 [t,H]=ode45('solitiontry1',tspan,h0,[],m1,epsinon) 

—————————————————————————————— 

function solfi=solitiontry1(t,H,flag,m1,epsinon) %m1=1.15; 

y=(1-epsinon)*(1-exp(H))+epsinon*m1^2*(1-sqrt(1+2*H*m1^-2))+m1^2*(1-sqrt(1-2*H*m1^-2)); solfi=-sqrt(-2*y); 


注意前面两个函数之间的区别,第二个多了一股flag参数。应该是针对options为空的那个参数的,但是在这里,如果options不为空的话,还不知道有什么区别。

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值