第六章:微分方程建模

6.1 三级火箭问题

建立微分方程模型求出三级火箭最佳

6.2 人口模型

6.2.1 Malthus模型
6.2.2 Logistic模型
6.2.3 模型推广

在Malthus模型上增加一个竞争项-b x 2 x^2 x2(b>0),作用是使纯增长率减少。

6.2.4 美国人口的预报模型

1.非线性最小二乘估计

clc, clear
a=textread('data.txt'); %把原始数据保存在纯文本文件中
x=a([2:2:6],:)';   %提出人口数据
x=nonzeros(x);  %去掉后面的0,并变成列向量
t=[1790:10:2000]';
t0=t(1); x0=x(1);
fun=@(cs,td)cs(1)./(1+(cs(1)/x0-1)*exp(-cs(2)*(td-t0))); %cs(1)=xm,cs(2)=r
cs=lsqcurvefit(fun,rand(2,1),t(2:end),x(2:end),zeros(2,1))
xhat=fun(cs,[t;2010])  %预测已知年代和2010年的人口

2.线性最小二乘法
(1)向后差分

clc, clear
a=textread('data4.txt');´¿Îı¾Îļþdata4.txtÖÐ
x=a([2:2:6],:)'; x=nonzeros(x);
t=[1790:10:2000]';
a=[ones(21,1), -x(2:end)]; 
b=diff(x)./x(2:end)/10;
cs=a\b;
r=cs(1), xm=r/cs(2)

(2)向前差分

clc, clear
a=textread('data4.txt'); 
x=a([2:2:6],:)'; x=nonzeros(x);
t=[1790:10:2000]';
a=[ones(21,1), -x(1:end-1)]; 
b=diff(x)./x(1:end-1)/10;
cs=a\b;
r=cs(1), xm=r/cs(2)

6.3 Matlab求微分方程的符号解

利用符号运算工具箱,使用dsolve命令
[y1, … , yN] = dsolve(eqns,conds,Name,Value)
(eqns为符号微分方程(组),conds为初始条件或边值条件,Name和Value为可选的成对参数)

6.3.1 通解
clc, clear
syms y(x) %定义符号变量
dsolve(x^2+y+(x-2*y)*diff(y)==0)
6.3.2 初边值问题
clc, clear
syms y(x) %¶¨Òå·ûºÅ±äÁ¿
dy=diff(y); d2y=diff(y,2); %定义一阶导数和二阶导数,用于初值或边值条件的复制
y=dsolve(diff(y,3)-diff(y,2)==x,y(1)==8,dy(1)==7,d2y(2)==4)
y=simplify(y) %把计算结果化简
6.3.3 常微分方程组
clc,clear
syms f(x) g(x)
df=diff(f); 
[f1,g1]=dsolve(diff(f,2)+3*g==sin(x),diff(g)+df==cos(x)) %求通解
f1=simplify(f1), g1=simplify(g1) %对符号解进行化简
[f2,g2]=dsolve(diff(f,2)+3*g==sin(x),diff(g)+df==cos(x),df(2)==0,f(3)==3,g(5)==1)
f2=simplify(f2), g2=simplify(g2) 
6.3.3 线性常微分方程组

(1)一阶齐次线性微分方程组

clc, clear
syms x(t) y(t) z(t) 
X=[x; y; z]; %定义符号向量
A=[2 1 3;0 2 -1;0 0 2]; B=[1 2 1]';
[x,y,z]=dsolve(diff(X)==A*X,X(0)==B)

(2)非齐次线性方程组

clc,clear
syms x(t) y(t) z(t) 
X=[x;y;z]; A=[1,0,0;2,1,-2;3,2,1];B=[0;0;exp(t)*cos(2*t)];
X0=[0;1;1]; %初值条件
X=dsolve(diff(X)==A*X+B,X(0)==X0) %求符号解
X=simplify([X.x;X.y;X.z]) %显示解的各个分量
pretty(X) %分数线居中的显示方式

6.4 放射性废料的处理

(1)问题一:

clc,clear
syms m V rho g k s(t) v(t) %定义符号常数和符号变量
ds=diff(s); %定义s的一阶导数,为了初值条件赋值
s=dsolve(m*diff(s,2)-m*g+rho*g*V+k*diff(s),s(0)==0,ds(0)==0);
s=subs(s,{m,V,rho,g,k},{239.46,0.2058,1035.71,9.8,0.6}); %常数赋值
s=simplify(s); %化简
s=vpa(s,6)  %显示小数形式的位移函数
v=dsolve(m*diff(v)-m*g+rho*g*V+k*v,v(0)==0);
v=subs(v,{m,V,rho,g,k},{239.46,0.2058,1035.71,9.8,0.6});
v=simplify(v); %化简
v=vpa(v,6)  %显示小数形式的速度函数
y=s-90; 
tt=solve(y); tt=double(tt)   
vv=subs(v,tt);vv=double(vv)  

(2)问题二:

clc,clear
syms m V rho g k v(t)
v=dsolve(m*diff(v)-m*g+rho*g*V+k*v^2,v(0)==0);
v=subs(v,{m,V,rho,g,k},{239.46,0.2058,1035.71,9.8,0.6});
v=simplify(v); v=vpa(v,6)  
T=solve(v-12.2); T=double(T)  %求时间的临界值T
s=int(v,0,T)      %求位移的临界值

6.5 初值问题的Matlab数值解

使用Matlab工具箱提供的功能函数

6.5.1 ode23,ode45,ode113的使用
clc, clear
yx=@(x,y)-2*y+2*x^2+2*x; %定义微分方程右端项的匿名函数
[x,y]=ode45(yx,[0,0.5],1)  %第一种返回格式
sol=ode45(yx,[0,0.5],1)  %第二种返回格式
y2=deval(sol,x)  %计算自变量x对应点函数值
check=[y,y2']  %比较两种的计算结果是一样的,但一个是行向量,一个是列向量
6.5.2 高阶微分方程和一阶微分方程的解法

高阶常微分方程,必须做变量替换,化为一阶微分方程组,才能使用Matlab求数值解

rho=10; beta=28; lamda=8/3;
f=@(t,Y) [rho*(Y(2)-Y(1))
beta*Y(1)-Y(2)-Y(1)*Y(3)
-lamda*Y(3)+Y(1)*Y(2)];   %定义微分方程组右端项的匿名函数
[t,y]=ode45(f,[0,30],[5,13,17])   %求数值解
subplot(2,2,1)
plot(t,y(:,1),'*')  %画出x的曲线
subplot(2,2,2)
plot(t,y(:,2),'X')  %画出y的曲线
subplot(2,2,3)
plot(t,y(:,3),'o')  %画出z 的曲线
subplot(2,2,4)       
plot3(y(:,1),y(:,2),y(:,3)) %画出空间的轨线

6.6 边值问题的Matlab数值解

使用bvp4cbvpinit命令求解常微分方程的两点边值问题。
(1)先编写函数

function sol=example11;
solinit=bvpinit(linspace(-1,1,20),@dropinit);
sol=bvp4c(@drop,@dropbc,solinit);
fill(sol.x,sol.y(1,:),[0.7,0.7,0.7])
axis([-1,1,0,1])
xlabel('x','FontSize',12)
ylabel('h','Rotation',0,'FontSize',12)
 
function yprime=drop(x,y);
yprime=[y(2);(y(1)-1)*(1+y(2)^2)^(3/2)];
 
function res=dropbc(ya,yb);
res=[ya(1);yb(1)];
 
function yinit=dropinit(x);
yinit=[sqrt(1-x.^2);-x./(0.1+sqrt(1-x.^2))];

(2)求解

clc, clear
yprime=@(x,y)[y(2);(y(1)-1)*(1+y(2)^2)^(3/2)]; %定义一阶方程组的匿名函数
res=@(ya,yb)[ya(1);yb(1)]; %定义边值条件的匿名函数
yinit=@(x)[x.^2;2*x]; %定义初始猜测解的匿名函数,这里换了另外一个初始猜测解
solinit=bvpinit(linspace(-1,1,20),yinit); %给出初始猜测解的结构
sol=bvp4c(yprime,res,solinit); %计算数值解
fill(sol.x,sol.y(1,:),[0.7,0.7,0.7]) %填充解曲线
axis([-1,1,0,1])
xlabel('x','FontSize',12)
ylabel('h','Rotation',0,'FontSize',12)

你可能感兴趣的:(数学建模算法与应用)