- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE
PAGE 15
常微分方程的数值求解技术
1 Euler方法
2 Runge-Kutta方法
3 线性多步方法
1 Euler方法
1.1 从一个人口增长(Malthus)模型谈起
英国人口统计学家马尔萨斯(Malthus,1766-1834年)调查了英国100多年人口出生统计资料,发现人口出生率稳定于一个常数。并提出了著名的Malthus人口增长模型。此模型的基本假设是:在考虑一个国家或地区的人口总数随时间变化的人口自然增长过程中,略去迁移、自然环境条件等因素对人口变化的影响,视净相对增长率(出生率与死亡率之差)是常数。即单位时间内人口的增长量与人口成正比,比例系数为。此假设就是一个常微分方程的问题。
记为时刻的人口,视为连续、可微函数。据Malthus的假设,在到时间内人口的增长量为,又设时的人口为,令时,可得满足方程
假设取1790年为初始状态,已知与1800年的实际人口,由最小二乘法拟合,可以定出。计算1790年~1880年间的人口(百万),。即求解微分方程
以下先介绍Euler方法,再给出此微分方程的数值解。
1). Euler公式
(1.2)
2).改进的Euler公式
(1.5)
此公式称为改进的Euler公式。它也可写成一个显式公式
(1.6)
或
(1.7)
3).人口增长(Malthus)模型的题解
例1 取1790年为初始状态,已知与1800年的实际人口,由最小二乘法拟合,可以定出。用改进的Euler公式计算1790年~1880年间的人口(百万),即求解微分方程
其中,。
解 改进的Euler公式
具体的计算公式为
,计算结果如下表6-1。
表6-1 用改进的Euler公式估计1790~1880年份的人口数据(106)
年份
1790
1800
1810
1820
1830
1840
1850
1860
1870
1880
ti
0
1
2
3
4
5
6
7
8
9
xi
3.9
5.2811
7.1512
9.6837
13.1129
17.7565
24.0445
32.5593
44.0893
59.7024
1.2 软件介绍
在本节里,将通过数值例子和Matlab程序介绍本节提出的Euler公式及改进的Euler公式的上机实现方法。
1.根据式(6.1.2)及算法6-1所表示的Euler公式,编写Matlab程序(函数名:Euler_f.m)。
function [x,y]=Euler_f(fun1,x0,y0,h,N)
% fun1 为一阶微分方程的函数;
% x0,y0为初始条件;
% h为区间步长;
% N为区间的个数;
% x为Xn构成的向量;
% y为Yn构成的向量.
x=zeros(1,N+1);
y=zeros(1,N+1);
x(1)=x0;
y(1)=y0;
for n=1:N
x(n+1)=x(n)+h;
y(n+1)=y(n)+h*feval(fun1,x(n),y(n));
end
2.根据式(6.1.7)及算法6-2所表示的改进的Euler公式,编写Matlab程序(函数名:Euler_r.m)。
function [x,y]=Euler_r(fun1,x0,y0,h,N)
% fun1 为一阶微分方程的函数;
% x0,y0为初始条件;
% h为区间步长;
% N为区间的个数;
% x为Xn构成的向量;
% y为Yn构成的向量.
x=zeros(1,N+1);
y=zeros(1,N+1);
x(1)=x0;
y(1)=y0;
for n=1:N
x(n+1)=x(n)+h;
ybar=y(n)+h*feval(fun1,x(n),y(n));
y(n+1)=y(n)+h/2*(feval(fun1,x(n),y(n))+feval(fun1,x(n+1),ybar));
end
例2 采用Euler公式(Euler_f.m)和改进的Euler公式(Euler_r.m)的Matlab程序上机实现人口指数增长(Malthus)模型所反映的微分方程的题解。其中,。
解 利用Matlsb编程过程如下:
求精确解
y=dsolve(‘Dy=0.307*y’,’y(0)=3.9’
运行后显示精确解
y=39/10*exp(307/1000*x);
(1)建立并保存名为fun11.m的M文件函数。
function f=fun1(x,y)
f=0.307*y;
(2)建立并保存名为Euler_f.m和Euler_r.m的M文件函
原创力文档


文档评论(0)