Matlab用导数作定性分析
5.1知识要点:函数作图 —用导数定性描述函数
【 clf,x=linspace(-8,8,30);f=(x-3).^2./(4*(x-1)); plot(x,f) 】
【 fplot('(x-3)^2/(4*(x-1))',[-8,8])) 】
【 clf,x=sym('x'); f=(x-3)^2/(4*(x-1)); ezplot(f,[-8,8]) ,
title('(x-3)^2/(4*(x-1))','fontsize',11) ,
xlabel('x','fontsize',11) 】
◆按函数绘图步骤绘制完整的函数图,直接用Matlab符号演算完成必须的计算。
【 df_dx=diff('(x-3)^2/(4*(x-1))') 】
【 sym('x');factor(df_dx) 】
【 f=inline('(x-3)^2/(4*(x-1))');X1=[-1,f(-1)],X2=[3,f(3)] 】
求符号二阶导数d2y/dx2:
【 df2_dx2=diff(‘(x-3)^2/(4*(x-1))’,2) 】
二阶导数的因式分解:
【 sym('x'); factor(df2_dx2) 】
【 syms x
f_left=limit('(x-3)^2/(4*(x-1))',x,1,'left')
f_right=limit('(x-3)^2/(4*(x-1))',x,1,'right') 】
【 syms x
f_minus_inf=limit('(x-3)^2/(4*(x-1))',x,-inf,'right')
f_plus_inf=limit('(x-3)^2/(4*(x-1))',x,inf,'left') 】
③有无斜渐近线?
【 syms x, a=limit('((x-3)^2/(4*(x-1)))/x',x,inf) 】
【 b=limit('(x-3)^2/(4*(x-1))-(1/4)*x',x,inf,'left') 】
5.2实验与观察:微分方程的定性解图示
5.2.1人口增长的预测
1.Malthus模型
2.Logistic模型
【 N=dsolve('DN=r*(1-N/Nm)*N','N(t0)=N0') 】
3.微分方程解的定性分析
观察1:
◆(1)求N = N (t)的驻点和拐点。
【 syms t
dN2_dt2=diff('r*(1-N(t)/Nm)*N(t)',t) , dN2_dt2=factor(dN2_dt2) 】
4.用导数作稳定性分析
下面是绘制图5.8的参考程序。
【 clf, N=linspace(0,300,50);
dN=0.3134*(1-N/250).*N;
plot(N,dN),hold on,
plot([0 300],[0,0]),
plot([0,250/2,250],[0,0,0],'o'),
xlabel('N','fontsize',11),ylabel('dN','fontsize',11),
text(N(32),dN(32),'\leftarrow\it{d N / d t}>0,相点递增右移','fontsize',11),
text(125,dN(45),'\it{dN/dt}<0,相点递减左移 \rightarrow','fontsize',11);
h=text(251/2,1.5,'\it{N_m/2}');set(h,'fontsize',11) 】
5.观察程序及其说明
zxy5_1.m (绘制函数图象,图5.3)
【 clf, x=sym('x'); f=(x-3)^2/(4*(x-1)); g=x/4-5/4;
hold on,
h=line([-8 8],[0,0]); set(h,'color’,'red’);
h=line([0 0],[-8,8]); set(h,'color’,'red’);
line([1 1],[-8 8]);plot([-1 1 3],[-2,0,0],'o’),
ezplot(g,[-8 8]); ezplot(f,[-8,8]), %符号函数绘图
text(-1-0.5,-2-0.5,'(-1,-2)’);text(1,0-0.5,'(1,0)'); text(3,0.5,'(3,0)');
x=1.4;text(x,subs(f),'\leftarrow{(x-3)}^{2}/{4(x-1)}');
x=0.6;text(x,subs(f),'\leftarrow{(x-3)}^{2}/{4(x-1)}');
x=2.5;text(x,subs(g),'\leftarrow斜渐近线{y=x/4-5}');
text(1,-2,'\leftarrow垂直渐近线x=1');title('(x-3)^2/4(x-1)') 】
zxy5_2.m (人口预测,图5.5)
【 global p1;clf,
t1=[1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900 1910 1920 1930 1940 1950 1960 1970 1980 ];
x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.0 72.0 92.0 106.5 123.2 131.7 150.7 179.3 204.0 226.5];
p1(1)=3.9; p1(2)=250;p1(3)=1790;p1(4)=0.03134;
[t,N]=ode23('Logistic_fun',[1790 2100],3.9);
plot(t,N,t1,x,'o',t,250*ones(1,length(t))),axis([1790 2100 0 300]),
xlabel('t','fontsize',11), ylabel('N','fontsize',11) 】
Logistic_fun.m
【 function dN = Logistic_fun(t,N)
global p1
N0=p1(1);Nm=p1(2);t0=p1(3);r=p1(4);
dN =r*(1-N/Nm)*N; 】
zxy5_3.m (方程的解轨线和相轨线,图5.6)
【 clear,clf
global p1;
p1(1)=3.9; p1(2)=250;p1(3)=0;p1(4)=0.03134;Nm=p1(2);
tpas=linspace(0,300,1000);
plot([0 0],[0,500],':',[0 300],[Nm,Nm],':',[0 300],[Nm/2,Nm/2],':'),
axis([-50 300 0 500]),xlabel('t'),ylabel('N'),hold on
text(-30,Nm,'\it{N_m}\rightarrow'); text(-35,Nm/2,'\it{N_m/2}\rightarrow');
button=1;
while button==1
k=[];
[t0,N0,button]=ginput(1);
[t,N]=ode23('Logistic_fun',tpas,N0);
k=find(N<=Nm/2+1&N>=Nm/2-1);
ts=tpas(k);Ns=N(k); text(-35,N0,'\it{N_0}\rightarrow');
plot(t0,N0,'o',ts,Ns,'square',t,N,':'),hold on
comet(t,N),pause,comet(0*ones(length(t),1),N)
end 】
这一程序是不难读懂的。
5.3 应用、思考和练习
5.3.1.函数作图
◆(2) 下面的绘图较复杂一些,是一个很好的练习。
图5.9 x(t),y(t)的曲线
zxy5_4.m
【 clf,n=2000;a=-4;b=6;c=-8;d=8;
t=linspace(a,b,n);
x=(t.^2)./(t-1);y=t./(t.^2-1);
kx=find(abs(x)>=d);x(kx)=NaN;
ky=find(abs(y)>=d);x(ky)=NaN;
plot(t,[x;y],'.','markersize',3),
hold on,plot([a b],[0,0],'r',[0 0],[c,d],':'),axis([a b c d]),
xlabel('t'),ylabel('x and y') ,
text(-3.8,7,'put any key to show x=x(t)');pause,comet(t,x),
text(-3.8,6,'put any key to show y=y(t)');pause,comet(t,y) 】
5.3.2.平衡点的分类
5.3.3定性分析的应用
1.捕鱼业持续的收获
画定性分析图的程序zxy5_4.m
【 clf,clear,N=50; r=4.4;E=[0.5 2.2 6.5];x=linspace(0,N,30);
f1=r*x.*(1-x/N);plot(x,r.*x,':','linewidth',2),axis([0 50 0 80]),hold on
text(x(10),r*x(10),['\leftarrow y=rx, r= ',num2str(r)])
for i=1:3
f2(i,:)=E(i)*x;
text(x(5),f2(i,5),['\leftarrow y=',num2str(E(i)),'x'])
end
plot(x,f1,x,f2),hold on,
text(x(22),f1(22),['\leftarrow dx/dt=rx(1-x/N)']),xlabel('x'),ylabel('dx/dt') 】
2. 蚜虫生长和跃变
200多个MATLAB经典教程和MATLAB论文请查看:matlab教程