在用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了。
26 Comments so far
Leave a comment
Fields in bold are required. Email addresses are never published or distributed.
Some HTML code is allowed:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
URIs must be fully qualified (eg: http://www.dupola.com) and all tags must be properly closed.
Line breaks and paragraphs are automatically converted.
Please keep comments relevant. Off-topic, offensive or inappropriate comments may be edited or removed.



请问可以发送一个matlab的源码文件给我么?帮助文档看不到子函数,私有函数的具体用法。书店的书看过了,也没有示例。我的一个M-文件始终提示:One or more output arguments not assigned during call to ‘iaet’.还望不吝指点网上的资源, 谢谢。
5555 我快崩溃了。不会安装matlab7 安完后 点他的图标 结果转到x11的根目录。。
刚买小飞 实在。。什么都不懂 但matlab是必须的 老马 救命啊 指点下
juzilong@hotmail.com
我的一个M-文件始终提示:One or more output arguments not assigned during call to ‘iaet’.还望不吝指点网上的资源, 谢谢。
我也出现这个问题了,我想知道是文件错误还是我写的错误,实在是很想死了.
原来少了个参量类型。。。
大家好,我想请教大家一个问题.我编写的一个m文件中ode中用到了参数的传递,因为有些参数需要变化,所以按照这片文章中讲的方法,做了后发现还是有错误(不过错误明显减少了).提示:??? Undefined function or variable “z1″.这是为什么?
非常感谢!我试试看.
你好,ode45中tspan是微分步长的意思吗?对于两个不同的方程组,当步长tspan都取100的时候,算出来的结果是不一样的点数呢?谢谢
要对第一个方程组加上第二个方程组相应反馈,可是得出来的结果长度不一样,没有办法加入反馈.我想问一下有什么方法可以解决.谢谢
我是把它们写在同一个方程组中的,用一个m文件写成.然后再用[t,x]=ode45(@fuxian,tspan,x0);语句调用.编译时出现下面的错误:??? In an assignment A(I) = B, the number of elements in B and
I must be the same.
Error in ==> fuxian at 22
xdot(7)=f*(x(1)-x(4))*(x(1)-x(4));
其中x(1)是第一组方程的x解,x(4)是第二个方程的x解
我的本意是要让两个方程组X(1:3)和X(4:6)得出的维数相同.这样就可以在语句xdot(7)=f*(x(1)-x(4))*(x(1)-x(4));中实现
x(1)-x(4).单步执行后,还是出现同样的问题:
??? In an assignment A(I) = B, the number of elements in B and
I must be the same.
Error in ==> fuxian at 22
xdot(7)=f*(x(1)-x(4))*(x(1)-x(4));
不知道应该怎样才可以让它们的维数相同?
非常感谢!
谢谢,我发现错误了,是因为有一个变量没有定义,哈哈.看到你女儿的照片了,你们真是幸福.
我要通过Simulink来和lsqnonlin函数来优化系统参数。在Simulink中需要调用ode45所解出的结果,再通过lsqnonlin函数来优化参数,将优化后的参数重新代入ode45进行计算。如何才能在Simulink中调用ode45的结果,又怎么才能把优化后的系统参数代入ode45,进行进一步的优化呢?
ode45可否用于求解线性时变离散系统呢?
马兄,看到你的网站,好高兴,现在有个关于ode问题请教,我的传递参数与微分变量有隐式关系,那么ode函数能直接用吗?怎么用?万分感谢!
你好,我有个程序:
M=[1,0,0,0,0,0;0,1,0,0,0,0;0,0,1,0,0,0;0,0,0,1,0,0;0,0,0,0,0,0;0,0,0,0,0,0];
options=odeset;options.Mass=M;
x0=[147.918;35.47;450;1558.6;0.024;-81.11];
[t,x]=ode15s(@c3eqdae,[0,20],x0,options);plot(t,x);
M文件:function dx=c3eqdae(t,x)
dx= [六个微分方程]
运行时有如下错误:
??? Error using ==> feval
Undefined function ‘c3eqdae’.
Error in ==> C:\MATLAB6p1\toolbox\matlab\funfun\private\odearguments.m
On line 104 ==> f0 = feval(ode,t0,y0,args{:});
Error in ==> C:\MATLAB6p1\toolbox\matlab\funfun\ode15s.m
On line 212 ==> [neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, args, …
请指教,万分感激
谢谢了,我试试。我用的版本是6
请问,已知传递函数,有没有直接语句求阶跃响应函数?
谢谢,我是想得到以时间为自变量的函数,而不是曲线。
怎么做呢?
请马老师指教:在SIMULINK里建好结构框图后,已得到阶跃响应曲线。现在我想获取其阶跃响应函数,该如何往下做?
马老师,我急于得到你的解答,请一定在今天回复。万分感谢
有没有见过由传递函数求反拉氏变化的语句?
我运行了下面语句求反拉氏变化
syms s F;
F=ilaplace((17.76*s+2.96)/(359.28*s^4+41.856*s^3+1.58208*s^2+0.09768*s))
运行结果如下,可我却读不懂,不知是什么函数。恳请马老师帮我看看
F =
25000/26581504926545679*sum((-8402450618877+138298897424498*_alpha+1909484093290560*_alpha^2)*exp(_alpha*t),_alpha = RootOf(1497000*_Z^3+174400*_Z^2+6592*_Z+407))+1000/33
我是MATLAB的初学者,请教:MATLAB中FUNCTION-A的结果是FUNCTION-B的条件,怎样将这两个函数连接呢?
马兄:
最近在编程,很郁闷,马兄能否留下手机号,发到我邮箱里,我打电话过去向兄台请教,不胜感激
发现我的6.5 版中有一个BUG
例如写作:
[t,y]=ode45(@fun111,[0,1],0,[],1)
则可以运行,但写作
[t,y]=ode45(‘fun111’,[0,1],0,[],1)
则提示出错: fun111: Too many input arguments.
愤怒中
马老师您好:
我是新手,我想请问一下,如何用function来表示函数
U=g(x,t),参数可以自己给定,同时再用ode来解他们,希望老师能说的详细点,因为我对matlab实在不大懂