数学建模之微分方程相关代码学习

Logistic模型求解

 1)非线性最小二乘估计

把第一个数据作为初始条件,利用余下的数据拟合参数Xm和r。

clc;
clear;
a=[1790:10:2000];%年份
%人口数据
b=[3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6,50.2,62.9,76.0,92.0,106.5,123.2,131.7,150.7,179.3,204,226.5,251.4,281.4];
b=b';%变成列向量
a=a';
a0=a(1);b0=b(1);%第一组数据作原始数据
fun=@(cs,td)cs(1)./(1+(cs(1)/b0-1)*exp(-cs(2)*(td-a0)));%cs(1)=Xm,cs(2)=r
cs=lsqcurvefit(fun,rand(2,1),a(2:end),b(2:end),zeros(2,1));%从第二组数据开始进行拟合
Y=fun(cs,[a;2010])%预测已知年代和2010的数据
c=[1790:10:2010];
plot(c,Y,'-r',a,b,'--b');
str=sprintf('Xm的拟合值为%f,r的拟合值为%f',cs(1),cs(2));
disp(str)

 

 2)线性最小二乘法

在这里十年一数据,故步长为10;

clc;
clear;
a=[1790:10:2000];%年份
%人口数据
b=[3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6,50.2,62.9,76.0,92.0,106.5,123.2,131.7,150.7,179.3,204,226.5,251.4,281.4];
b=b';%变成列向量
a=a';
a=[ones(21,1),-b(2:end)];
c=diff(b)./b(2:end)/10;%差分函数
cs=a\c;
r=cs(1);Xm=r/cs(2);
str=sprintf('Xm的拟合值为%f,r的拟合值为%f',Xm,r);
disp(str);

 再试试向前差分:

clc;
clear;
a=[1790:10:2000];%年份
%人口数据
b=[3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6,50.2,62.9,76.0,92.0,106.5,123.2,131.7,150.7,179.3,204,226.5,251.4,281.4];
b=b';%变成列向量
a=a';
a=[ones(21,1),-b(1:end-1)];
c=diff(b)./b(1:end-1)/10;%差分函数,往前差分
cs=a\c;
r=cs(1);Xm=r/cs(2);
str=sprintf('Xm的拟合值为%f,r的拟合值为%f',Xm,r);
disp(str);

 三种拟合方法,拟合同样的参数,由于方法不同,可能结果相差较大。

Matlab求微分方程的符号解

 微分方程的符号解

例一: (求解常微分方程的通解)

 

 

clc;
clear;
syms y(x)%定义符号变量
dsolve(x^2+y+(x-2*y)*diff(y)==0);
%diff()对于符号型变量为求导,对于数值型变量为差分
%一个“=”为赋值,==为等于;

例二:(求解常微分方程的初边值问题)

clc;
clear;
syms y(x)%定义符号变量
dy=diff(y);%一阶导
d2y=diff(y,2);%二阶导
y=dsolve(diff(y,3)-diff(y,2)==x,y(1)==9,dy(1)==7,d2y(2)==4);
y=simplify(y)%对结果进行化简

 想起了高数考试被手解常微分方程的恐惧😱。

更多内容参考 dsolve()文档。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值