数学建模 | 您所在的位置:网站首页 › matlab指数序列程序 › 数学建模 |
文章目录
运行软件:MATLAB R2012a实验数据指数增长模型指数增长模型:方法一对2010年的人口预测
指数增长模型:方法二对2010年人口预测
改进的指数增长模型对2010人口预测
逻辑斯蒂(logistic)模型逻辑斯蒂(logistic)模型:方法一对2010预测
逻辑斯蒂(logistic)模型:方法二对2010预测
运行软件:MATLAB R2012a
实验数据
年份17901800181018201830184018501860人口/百万3.95.37.29.612.917.123.231.4增长率/10年0.29490.31130.29860.29690.29070.30120.30820.2452
年份18701880189019001910192019301940人口/百万38.650.262.976.092.0105.7122.8131.7增长率/10年0.24350.24200.20510.19140.16140.14570.10590.1059
年份1950196019701980199020002010人口/百万150.7179.3203.2226.5248.7281.4308.7增长率/10年0.15790.14640.11610.10040.11040.1349
指数增长模型
满足人口增长的微分方程和初始条件为: 根据已知数据对模型的参数进行估计又称为数据拟合。 对下面的这个公式同时取对数 代码如下: 使用的是matlb函数 function [ x1 ] = method_1( x ) %方法一:直接用人口数据和线性最小二乘法 % 利用函数polyfit(),dsolve()求解,r年增长率,返回x1模型的估计值 y=log(x); t=0:1:21; p=polyfit(t,y,1); r=p(1); a=p(2); x0=exp(a); s=dsolve('Dx=r*x','x(0)=x0','t'); x1=eval(s); x1=x1'; end运行代码: x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; m=1790:10:2000; m=m'; m(:,2)=x'; m(:,3)=method_1(x);运行界面: 根据上面算出的结果,可以得到:r=0.2020 x0=6.0496 直接利用算出来的参数计算2020年的结果(t=22) 运行代码: >> x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; >> y=log(x); t=0:1:21; p=polyfit(t,y,1); r=p(1); a=p(2); x0=exp(a); %若要预测2010年的人口对t进行更改 t=0:1:22; s=dsolve('Dx=r*x','x(0)=x0','t'); >> t=22; >> eval(s)运行结果: 先对人口数据进行数值微分,再计算增长率并将其平均值作为 的估计; 直接取原始数据。 公式: 运行代码 x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; m=1790:10:2000; m=m'; m(:,2)=x'; m(:,3)=method_1(x); m(:,4)=method_2(x);运行界面: 已经求得r与x0代码: x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; n=length(x); t=0:1:n-1; rk=zeros(1,n); rk(1)=(-3*x(1)+4*x(2)-x(3))/2; rk(n)=(x(n-2)-4*x(n-1)+3*x(n))/2; for i=2:n-1 rk(i)=(x(i+1)-x(i-1))/2; end rk=rk./x; r=sum(rk)/n; x2=zeros(n,1); x2(1)=x(1); >> t=22; >> x2(1)*exp(r*t)运行结果: 指数增长模型进行改进。改进为: 假设: 运行代码: x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; m=1790:10:2000; m=m'; m(:,2)=x'; m(:,3)=method_1(x); m(:,4)=method_2(x); m(:,5)=method_3(x);运行界面: 运行结果: xm:表示人口容量 有了人口容量的限制,当人口数量增加时,增长率r减小,用 ![]() 开勇函数dsolve()求解可得 运行代码: x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; m=1790:10:2000; m=m'; m(:,2)=x'; m(:,3)=method_1(x); m(:,4)=method_2(x); m(:,5)=method_3(x); m(:,6)=logistic_1(x);运行界面: 代码: >> x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; >> n=length(x); t=0:1:n-1; rk=zeros(1,n); rk(1)=(-3*x(1)+4*x(2)-x(3))/2; rk(n)=(x(n-2)-4*x(n-1)+3*x(n))/2; for i=2:n-1 rk(i)=(x(i+1)-x(i-1))/2; end rk=rk./x; p=polyfit(x,rk,1); b=p(1); a=p(2); r=a; xm=-r/b; s=dsolve('Dx=r*x*(1-x/xm)','x(0)=x0','t'); x0=3.9; >> t=22; >> eval(s)运行结果:如果出现结果有复数,对结果进行转换,如下图 直接用数据和非线性最小而成估计参数: 运行代码: function [ x5 ] = logistic_2( x ) %逻辑斯蒂模型方法二 n=length(x); t=0:1:n-1; f=@(a,t)a(1)./(1+(a(1)./a(2)-1).*exp(-a(3).*t)); [A,cancha]=lsqcurvefit(f,[500,3.9,0.3],t,x); s=dsolve('Dx=r*x*(1-x/xm)','x(0)=x0','t'); r=A(3); x0=A(2); xm=A(1); x5=eval(s); x5=x5'; x5=abs(x5); end运行代码: x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; m=1790:10:2000; m=m'; m(:,2)=x'; m(:,3)=method_1(x); m(:,4)=method_2(x); m(:,5)=method_3(x); m(:,6)=logistic_1(x); m(:,7)=logistic_2(x);运行界面: 代码: x=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 105.7 122.8 131.7 150.7 179.3 203.2 226.5 248.7 281.4]; >> n=length(x); t=0:1:n-1; f=@(a,t)a(1)./(1+(a(1)./a(2)-1).*exp(-a(3).*t)); [A,cancha]=lsqcurvefit(f,[500,3.9,0.3],t,x); s=dsolve('Dx=r*x*(1-x/xm)','x(0)=x0','t'); r=A(3); x0=A(2); xm=A(1); >> t=22; >> eval(s)运行结果: |
CopyRight 2018-2019 实验室设备网 版权所有 |