在前面三章中通过线性规划、整数规划、非线性规划三方面对规划问题有了一个初步的认识。
线性规划:https://blog.csdn.net/qq_51564046/article/details/118568020?spm=1001.2014.3001.5501
整数规划:https://blog.csdn.net/qq_51564046/article/details/118571195?spm=1001.2014.3001.5501
非线性规划:https://blog.csdn.net/qq_51564046/article/details/118576469?spm=1001.2014.3001.5501
今天我们进入新的篇章——微分方程。
适用范围:当直接导出变量之间的函数关系比较困难,但导出包含未知函数的导数或微分关系比较容易时。
一、人口模型(Malthus模型和Logistic模型)
1.马尔萨斯模型:
基本假设:人口增长率r是常数。
模型总结:适用于群体总数不太大时合理。人口的净增长率不可能保持常数,与人口数量有关。
马尔萨斯模型实例:
1625 | 1830 | 1930 | 1960 | 1974 | 1987 | 1999 |
5 | 10 | 20 | 30 | 40 | 50 | 60 |
T=1999-1960;
r=log(2)/T
x=[1960 1974 1987 1999 2011 2016];
y=[30 40 50 60 70 74.42];
plot(x,y,'*')
hold on
tt=1960:2050
xx=30*exp(r*(tt-1960));
plot(tt,xx,'r-')
legend('实际数据’,‘拟合数据')
xlabel('time')
ylabel('人数(亿)')
线性最小二乘法拟合
最小二乘拟合:作为度量误差“大小”标准的函数逼近
在次数不超过n的多项式中找一个函数使残差平方和最小
解决:matlab中的polyfit指令:x,y分别表示横纵坐标,n为拟合多项式的次数,P为输出的多项式系数向量。
polyval(p,x)。p为polyfit的结果。x为预测值得x坐标。函数结果即为x处对应得y值。
最小二乘法模型实例:
给出美国人口从1790年到1990年的人口,估计2010年的人口。
年份 | 1790 | 1800 | 1810 | 1820 | 1830 | 1840 | 1850 | 1860 | 1870 | 1880 |
人口 | 3.9 | 5.3 | 7.2 | 9.6 | 12.9 | 17.1 | 23.2 | 31.4 | 38.6 | 50.2 |
年份 | 1890 | 1900 | 1910 | 1920 | 1930 | 1940 | 1950 | 1960 | 1970 | 1980 |
人口 | 62.9 | 76.0 | 92.0 | 106.5 | 123.2 | 131.7 | 150.7 | 179.3 | 204.0 | 226.5 |
xxdata=[1790 1800 1810 1820 1830 1840 1850 1860];
xdata=xxdata-1790;
yydata=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4];
ydata=log(yydata)
p=polyfit(xdata,ydata,1)%polyfit 基于最小二乘法的曲线拟合
xxxdata=[1790:2000];
xx=[0:2000-1790];
z1=polyval(p,xx)%求的xx处的y值
y1=exp(z1);
xxx=[1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900 1910 1920 1930 1940 1950 1960 1970 1980];
yyy=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 106.5 123.2 131.7 150.7 179.3 204 226.5];
plot(xxx,yyy,'*',xxxdata,y1,'r-')
hold on
legend('实际数据','预测数据')
xlabel('时间','fontsize',18)
ylabel('人口','fontsize',16)
看完上面的代码肯定有不少人都想问,为什么xdata做了-1790的处理和ydata用了log函数。
我们拟合的是一次函数,马尔萨斯模型的式子为
经过处理变为一次函数形式:,看到这里相信大家的困惑就迎刃而解了。
这里还有一种函数类型:增函数,t->0时y=0;t->inf时,y趋于一个定值。指数类型:
非线性最小二乘法拟合
适用matlab中的lsqcurvefit函数。[x,resnorm]=lsqcurvefit(fun,x0,xdata,ydata)
fun为需要拟合的函数。x0为函数系数的初始猜测值。xdata为x的坐标值,ydata为y的坐标值。
output:x经拟合后的系数。resnorm误差
2.Logistic模型
人口的净增长率与人口的数量有关,r=r(N)=r-aN
用Logistic模型预测美国2010年人口(数据见上表)
function [F]=myfun1(x,xdata)
F= x(1) ./ (1 + (x(1) / 3.9 - 1) .* exp(- x(2) .* xdata));
end
xx=[1790 1800 1810 1820 1830 1840 1850 1860 1870];
xdata=xx-1790;
ydata=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6];
x0=[1,1];
xi=lsqcurvefit(@myfun1,x0,xdata,ydata)
x1=1790:1:1980; xx1=x1-1790;
y1=myfun1(xi,xx1);
xxdata=[1790 1800 1810 1820 1830 1840 1850 1860 1870 1880 1890 1900 1910 1920 1930 1940 1950 1960 1970 1980];
yydata=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76 92 106.5 123.2 131.7 150.7 179.3 204 226.5];
plot(xxdata,yydata,'ro',x1,y1,'b-')
Logistic模型同样适用于新产品推广问题和捕鱼业问题。只要是随着变量x的增加会导致目标结果涨幅的变慢,Logistic模型都适用。
二、传染病模型
模型1 :已感染人数i(t)
假设:每个病人每天有效接触人数为。
模型2:区分已感染者和未感染者(SI模型)
假设:1.总人数不变,病人和健康人的比例分别未i(t)和s(t)。2.每个病人每天有效接触人数为,且使接触的健康人致病。
模型3:病人治愈成为健康人,健康人可再次被感染。(SIS模型)
1.总人数不变,病人和健康人的比例分别未i(t)和s(t)。2.每个病人每天有效接触人数为,且使接触的健康人致病。3.病人每天的治愈比例为
=1为阈值,当其大于1时,i(t)按S形曲线增长。当期小于1时,呈下降趋势。
SI模型可以看作SIS模型的一个特例。
模型4:病人治愈后移出感染系统。(SIR模型)
总人数N不变,病人、健康人和移出者的比例分别为i(t),s(t),r(t)。 每个病人每天有效接触人数为
。 病人每天的治愈比例为。
微分形式:
三、种群模型
一个自然环境种有两个种群生存,它们之间的关系:相互竞争,相互依存,弱肉强食。
甲乙两个种群,它们独自生存时数量变化均服从Logistic规律
两个种群生存在一起时,乙对甲的增长有阻滞作用与乙的数量成正比。甲对乙有同样作用
寻找该非线性方程的平衡点。
平衡点稳定判定准则:考虑方程的Jacobian矩阵