MATLAB求微分方程组 并作图
dy/dt=d*m(1-n*x/y+p)
其中,a,b,c,d,m,n,p都为常数。
且,a,b,c,d,m都是正整数,0<=n和p<=1;
a=?时可以使两式相等? 展开
由于方程比较复杂,解析解不能用初等函数表示
只是要获得图像的话,用数值计算的办法可能更方便
fun=@(t,y) 1.44*(10^9)*(1-y).*exp(-109170./(8.314*t));
[T,Y] = ode23t(fun,500:600,0);
DY=fun(T,Y);
AX=plotyy(T,Y,T,DY);
set(get(AX(1),'Xlabel'),'String','T');
set(get(AX(1),'Ylabel'),'String','\alpha');
set(get(AX(2),'Ylabel'),'String','d\alpha/dT');
T是自变量,Y是变量也就是alpha
DY是,Y对T的导数
得到得到结果如下图
从图像看出,在T=500时,alpha=0
大概在T=600时,d(alpha)/dT趋向于0,alpha趋向于1不变
但是由于是数值解,在T不断增加的时候,d(alpha)/dT会在0附近振荡
所以T的取值不宜取得太大,这里取500到600之间
而采用ode23t函数,减少振荡
实际上,当T增大到一定值的时候,d(alpha)/dT趋向于0,
函数趋向于保持恒定值,所以后续的振荡是不合理的
取一定的区间如上图,已经可以很好地得到函数的变化趋势了
dsolve可以解微分方程组,ode45可以数值地解微分方程组,你需要数值解还是解析解?
想知道二个方程的关系,也就是随着时间二者的x,y,值的变化规律,我想知道当常数a取值为多少时,可以使,y的值不在随着时间增加。
(当然想画图了,那样看最直观)但是我高数很烂,对那个软件也是很陌生。
好的知道了。我用dsolve发现没有解析解(当然matlab说没解析解也不见得就真的解不出解析解,不过大部分情况下确实是没解析解的),就只能用数值解了。最终的变化规律还是要取决于你的常数a,b,c,d,m的数值。我写了个m函数文件如下,你先要在matlab编辑器窗口(不是命令窗口)输入这些:
function dz=myfun1(t,z)
global a b c d m n p
x = z(1);y = z(2);
dz(1) = a*b*c*(1-c/y);
dz(2) = d*m*(1-n*x/y+p);
dz = [dz(1);dz(2)];
这是定义一个新的函数。输入完后存在当前目录下,文件名为myfun1.m。完了你在命令窗口输入(我这里a,b,c,d这些常数的数值都是随便给的,t1,t2是画图的t的区间,x0,y0是解微分方程必须的初始条件,是x,y的初始点):
global a b c d m n p
a=1;b=2;c=3;d=4;m=5;n=0;p=1;
t1=-2;t2=2;x0=1;y0=1;
[t,z]=ode45(@myfun1,[t1,t2],[x0,y0]);
subplot(2,1,1);
plot(t,z(:,1),t,z(:,2));
title('x,y关于t的函数图象');
subplot(2,1,2);
plot(z(:,1),z(:,2));
title('x,y的相图');
就完了。会画出两个图,第一个就是x,y关于t的图象,第二个是y关于x的图象,称为相图。变化规律你就看图说吧。
最后说你的问题,你想知道a取多少x,y不会随t变化。这就是要说两个导数始终为零,注意是始终为零。那么这就要求y = c 以及 x = (1+p)c/n恒成立,也就是都是常数函数才能达到你的要求,这个解和a没关系。我想这个应该不是你需要的答案,所以放最后说。上面的程序画出来的图象见我的图。需要审核一段时间才能看到的。
有问题继续问吧。我没上Hi的习惯,还是继续追问我吧。