这个是函数文件
function [ dy ] = current( u1,u2,iL )dy=zeros(1,3);dy(1)=u1;dy(2)=u1/(1.96*10^-4)+u2/(1.96*10^-4)+iL/(10^-7);dy(3)=-u2/(17.2*10^-3)-0.5*iL/(17.2*10^-3);end
这个是仿真计算文件
y0=[0.1,0.1,-0.001];[t,x]=ode45('current',[0,3000],y0);
运行总是出错,看不懂报错
1、你贴出来的报错信息和代码对不上号:前面显示错误的那行代码和你贴出来的完全不一样;而后面的错误(Input argument 'u1' is undefined)也不可能是目前的代码所导致的——的确是有错,但错误应该是iL未定义才对。
2、使用ode*系列函数解常微分方程,用于描述微分方程的函数(例如你这里的current)输入输出参数是有固定格式要求的,应该是
dy = current( t, y )
其中t是时间,y是t时刻的状态变量。这两二个参数即使你在函数中用不上,也必须列在参数表中。当然,变量的具体名字可以自定,但含义就是上面说的。
例如,按照你现在的写法,传递到current函数的u1就是时间,而u2则是微分方程的状态变量,相当于y,是一个向量,有3个元素。如果按照上面的固定格式,current函数不允许有三个输入参数,那么,既然你写了三个输入参数,第三个参数iL自然就没有定义,所以会出错。
我猜测,你的方程中u1、u2和iL其实就是状态变量y——如果是这样,那么在current函数中将其分别以y(1)、y(2)、y(3)代替就可以了,后面的大部分内容也就没必要看了。
之所以对描述微分方程的函数(例如current)有这种固定的格式要求,是因为 ode*系列函数属于所谓“函数的函数”(Function Functions),也就是说,它的输入参数当中有其它函数(可以是函数文件名,或者函数句柄,也可以是inline函数、匿名函数)。ode* 函数在求解过程中,会反复调用作为参数传递给它的函数,而调用的过程并非由我们决定的,而是固定地写在ode*函数代码中的,所以,对描述微分方程的函数有固定格式要求也就不足为奇了。
3、假如描述微分方程的函数除了t和y之外,的确还需要其它数据,应该怎么办?
首先,请认真考虑一下问题本身,这些数据到底是什么性质?
如果是常数,可以考虑直接写在current函数里面;
如果变化的,但仅与时间t和状态变量y及其导数有关,也可以直接在current函数里面计算出来,而无需由外部传递。
如果上面两种情况都不适合,那么就需要用到传递附加参数了。传递附加参数的常用手段包括使用匿名函数、嵌套函数以及通过函数参数传递三种方式,下面介绍一下第三种方式。
ode系列函数较为一般的调用格式为
[T,Y] =solver(odefun,tspan,y0,options,p1,p2...)
这些参数中,p1、p2等就是要额外传递的参数,而相应的微分方程函数应该定义成
dy = current( t, y,p1, p2... )
options为求解器选项,如果不知道(同时也不想知道)它有什么用,可以不用管它,调用的时候用空数组([])代替即可。
4、还有一点小问题:
dy=zeros(1,3);
应改成
dy=zeros(3,1);
描述微分方程的函数要求返回列向量。
参考改动
function dy = current( t, y )
u1 = y(1);
u2 = y(2);
iL = y(3);
dy=zeros(3,1);
dy(1)=u1;
dy(2)=u1/(1.96*10^-4)+u2/(1.96*10^-4)+iL/(10^-7);
dy(3)=-u2/(17.2*10^-3)-0.5*iL/(17.2*10^-3);
这样修改后,程序可以运行,但求出来的结果是发散的,请你再仔细检查一下方程是否正确。
由于不确定你的方程中u1、u2和iL到底是什么,所以只能帮你说到这里了。
matlab ode45解微分方程组
我猜测,你的方程中u1、u2和iL其实就是状态变量y——如果是这样,那么在current函数中将其分别以y(1)、y(2)、y(3)代替就可以了,后面的大部分内容也就没必要看了。之所以对描述微分方程的函数(例如current)有这种固定的格式要求,是因为 ode*系列函数属于所谓“函数的函数”(Function Functions)...
MATLAB中ode45方法求解微分方程组
使用ode45解微分方程组,可以用下列格式来求解。[t,x]=ode45(odefun,tspan,x0)式中:odefun——给定微分方程组的自定义函数;tspan——自变量t的范围,即【t0,tf】;x0——x的初值向量,即x1(0),x1'(0),x2(0),x2'(0),x3(0),x3'(0)由于没有给出自变量t的范围和x的初值...
matlab用ode45求解微分方程组
function dx=tsst_fun(x,t)dx(1)= c-b*x(1)-w*x(1)*x(2);dx(2)=w*x(1)*x(2)-(b+m)*x(2);那么调用ode45 x0=(0,0);t0=0:0.01:10;;%根据你所想要的求得值设定t0,间隔是任意的,与求解所用的步长无关,[x,t]=ode45(@test_fun,t0,x0);得到了 这样可以么?
在matlab中用ode45命令求解微分方程组,画随时间变化的曲线。
a1=0.07; b1=0.04; s1=0.3; k1=0.5; m1=1800; w1=0.5; c1=3;a2=0.04; b2=0.02; s2=0.4; k2=0.4; m2=1500; w2=0.4; c2=2;u1 = (a1 - b1) * s2 * k2 * m2 + w1;u2 = (a2 - b2) * s1 * k1 * m1 + w2;[t, y] = ode45(@func, [0, 5], [...
matlab用ode45求解多元常微分方程组
题主给出的多元常微分方程组缺初始条件,为了解题,我们自行给出(到是题主修改一下就可以了)。x0=[0.01,0.01,0.01]; %初值 func=@(t,x)[2*x(1)-3*x(2)+3*x(3);4*x(1)-5*x(2)+3*x(3);4*x(1)+4*x(2)+2*x(3)];[t,x]=ode45(func,[0 2],x0);disp(' ...
求助,用 MATLAB 的 ode45 求解微分方程组
第一步:根据已经微分方程组和相关系数,自定义求解微分方程组的函数,其函数名 odefun,其参数为【t,z】第二步:由于未知初始条件,用随机数初定,即z0=rand(1,6)\/1000;第三步:确定时间t的范围,如tspan=[0 50];第四步:使用ode45函数,求其数值解,即 [t,z]=ode45(@(t,z)odefun(t,z...
用matlab的ode45求解二阶微分方程组,没有警告没有报错,但是运算的很 ...
【并行计算】:对于规模较大的微分方程组,可以考虑使用并行计算技术来加速求解过程。求解器选择:ode45 是适用于非刚性问题的求解器。如果问题实际上是刚性的,可能需要选择其他更适合刚性问题的求解器,如 ode15s。【模型误差】:检查微分方程模型本身是否存在近似或简化,这可能会影响求解结果的准确性。【...
matlab中的ode45怎样设置定步长解微分方程?
function [x,y]=runge_kutta1(ufunc,y0,h,a,b) %参数表顺序依次是微分方程组的函数名称,初始值向量,步长,时间起点,时间终点,n=floor((b-a)\/h); %求步数 x(1)=a; %时间起点 y(:,1)=y0; %赋初值,可以是向量,但是要注意维数 for ii=1:n x(ii+1)=x(ii)+h;k1...
Matlab使用ode45解微分方程组的基本问题,下面有一个简单的微分方程组求...
m文件,把以下代码复制进去 function dx=myfun(t,x)dx=zeros(2,1);dx(1)=4*x(1)+x(2).^2;dx(2)=8*x(1)+2*x(2).^2+5*x(2);运行以下代码 t=[0 0.1];x0=[1 1];[tt,xx]=ode45('myfun',t,x0);plot(tt,xx(:,1),'-',tt,xx(:,2),'-.')%画出两者图像 ...
请问如何实现matlab解一阶微分方程组(用其自身命令如ode45等怎么写能运 ...
;dxdt=[a*(x2-x1)+x4;d*x1-x1*x3+c*x2;x1*x2-b*x3;x2*x3+r*x4;];在Matlab下面输入:global a b c d r a=1;b=2;c=3;d=4;r=5;t_end=10; %时间计算的终点,即算到这个时间为止 x0=[1;1;1;1]; %x的初始值 [t,x]=ode45('zhidao_rk4_5',[0,t_end],x0);