建立微分方程模型求出三级火箭最佳
在Malthus模型上增加一个竞争项-b x 2 x^2 x2(b>0),作用是使纯增长率减少。
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)
利用符号运算工具箱,使用dsolve命令
[y1, … , yN] = dsolve(eqns,conds,Name,Value)
(eqns为符号微分方程(组),conds为初始条件或边值条件,Name和Value为可选的成对参数)
clc, clear
syms y(x) %定义符号变量
dsolve(x^2+y+(x-2*y)*diff(y)==0)
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) %把计算结果化简
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)
(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) %分数线居中的显示方式
(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) %求位移的临界值
使用Matlab工具箱提供的功能函数
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'] %比较两种的计算结果是一样的,但一个是行向量,一个是列向量
高阶常微分方程,必须做变量替换,化为一阶微分方程组,才能使用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)) %画出空间的轨线
使用bvp4c和bvpinit命令求解常微分方程的两点边值问题。
(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)