- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数值分析-常微分数值解的求法C语言.
本科生课程设计报告
实习课程 数值分析 学院名称 管理科学学院 专业名称 信息与计算科学 学生姓名 学生学号 指导教师 实验地点 实验成绩
二〇 一 六 年 六 月 二〇 一 六 年 六
摘要
常微分方程数值解法是计算数学的一个分支.是解常微分方程各类定解问题的数值方法.现有的解析方法只能用于求解一些特殊类型的定解问题,实用上许多很有价值的常微分方程的解不能用初等函数来表示,常常需要求其数值解.所谓数值解,是指在求解区间内一系列离散点处给出真解的近似值.这就促成了数值方法的产生与发展.?
关键词:数值解法;常微分
实验内容和要求
常微分方程初值问题
有精确解。
要求:分别取步长h = 0.1,0.01,0.001,采用改进的Euler方法、4阶经典龙格-库塔R-K方法和4阶Adams预测-校正方法计算初值问题。以表格形式列出10个等距节点上的计算值和精确值,并比较他们的计算精确度。其中多步法需要的初值由经典R-K法提供。运算时,取足以表示计算精度的有效位。
算法说明
2.1函数及变量说明
表1 函数及变量定义
函数/变量名 类 型 说 明 f double 要求的微分方程 p_f double 微分方程原函数 Euler,Euler_Pro
K_R,Adams double 欧拉,改进欧拉,经典K_R,4阶Adams预测-校正方法 Main Void 主函数
欧拉方法:
(i=0,1,2,3,......n-1)
(其中a为初值)
改进欧拉方法:
(i=0,1,2......n-1) (其中a为初值)
经典K-R方法:
4、4阶adams预测-校正方法
预测:
校正:
Adsms内插外插公式联合使用称为Adams预测-校正系统,利用外插公式计算预测,用内插公式进行校正。计算时需要注意以下两点:
外插公式为显式,内插公式为隐式。故用内插外插公式时需要进行迭代。
这种预测-校正法是四步法,计算Yn+1时,不但用到前一步信息,而且要用到更前三步信息,,因此它不是自动开始的,实际计算时必须借助某种单步法,用Runge-Kutta格式为它提供初始值,依据局部截断误差公式得:
进一步将Adams预测-校正系统加工成下列方案:
运用上述方案计算时,要先一步的信息和更前一步的信息
因此在计算机之前必须给出初值和,可用其他单步法来计算,则一般令他为零。
源程序
#includestdio.h
#includestdlib.h
#includewindows.h
#includemath.h
//微分方程
double f(double x,double y)
{
return (-y+cos(2*x)-2*sin(2*x)+2*x*exp(-x));
//return x*pow(y,-2)*2.0/3.0;
}
//原函数
double p_f(double x)
{
return x*x*exp(-x)+cos(2*x);
//return pow(1.0+pow(x,2),1.0/3.0);
}
//求精确解
double* Exact(double a,double b,double h)
{
int i;
double c = (b-a)/h;
double *y = new double [c+1];
for(i=0;i=c;i++)
y[i]= p_f(a+i*h);
return y;
}
//欧拉方法
double* Euler(double a,double b,double h,double y0)
{
int i;
double c = (b-a)/h;
double *y = new double [c+1];
y[0]=y0;
for(i=1;i=c;i++)
{
y[i]= y[i-1]+ h* f(a+(i-1)*h,y[i-1]);
//printf(%f\n,f(a+(i-1)*h,y[i-1]));
}
return y;
}
//改进欧拉方法
double* Euler_Pro(double a,double b,double h,double y0)
{
int i;
double c = (b-a)/h ,yb;
double *y = new double [c+1];
y[0]=y0;
for(i=1;i=c;i++)
{
yb=y[i-1] +h* f(a+(i-1)*h,y[i-1]);
y[i] = y[i-1] + 0.5*h*( f
原创力文档


文档评论(0)