- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
计算方法试验报告,计算方法上机实验报告,华科计算方法实验报告,计算方法,数值计算方法实验报告,浙大计算方法实验报告,华工计算方法实验报告,计算方法第二版,qq邮箱,java计算器实验报告
西安交通大学
《数值计算方法》上机实验报告
学院:化 工
班级:化工02
姓名:
学号:
一.实验目的
通过三个上机实验掌握具体问题的解决方法,将所学的理论知识运用于实际计算之中,以加深对数值计算方法各种理论的理解,并掌握数值算法设计与分析的常用技巧。同时,解题时需要借助C++以及matlab等工具,巩固了这两种软件的应用知识。
二.实验内容
1.问题简述:
问题一:
设,计算和。哪个接近?
问题二:
已知方程组
的真解,且令时利用克莱姆法则可将真解表示为
试将依次取位近似有效数,分别计算。
问题三:
已知函数,节点。
计算和拉格朗日插值多项式的值,。
求三次自然插值样条函数的表示中,计算,。
画出的图形(各描41点)。
2.问题分析
问题一:
该问题意在比较不同算法对计算结果产生的影响,为减少计算误差,应采取更加稳定的算法,用泰勒展开的方式计算,取两种不同的计算方法(即和)进行近似计算。此处借助C++,用循环结构进行编程,最终得到结果并进行分析。
问题二:
该题意在分析不同精度的数值对方程的解所产生的影响,根据所学知识,若所取数值仅仅发生微小变化就使方程的解有很大改变并且当所取精度不够时与真实解相差甚远,则该方程即为病态方程。
问题三:
该题意在比较拉格朗日插值多项式与三次样条函数的优缺点。
(1)拉格朗日插值多项式基本原理:
已知函数在个互不相同的点处的函数值,为求的近似式,选择n次多项式
使满足条件,称为被插函数,称为插值多项式。
其中,拉格朗日差值多项式为:
(2)三次自然插值样条函数基本原理:
三次样条函数是一种分段函数,它在节点分成的每一个小区间上是次多项式,而在整个区间上阶倒数连续。
此处,因C++无法出图,故用matlab编写程序并绘出函数图象将结果进行比较。
3.解题步骤
问题一:
(1)基本思路:
运用两个循环结构,大循环用以计算各项的加和,小循环计算连乘,随后根据公式代入数据进行计算。
(2)具体程序:
#include iostream
#include cmath
using namespace std;
int main()
{
cout.precision (10); //设置精度为小数点后10位,以保证结果相对准确性
int a=-5;
int c=5;
double s1=1,s2=1,b=1; //s1,s2为加和的初始项,设为1,b为连乘初始项
double e=exp(-5);
double m1,m2;
for (int i=1;i=24;i++) //设置大循环,对各项进行加和
{
for (int j=1;j=i;j++) //设置小循环,以计算连乘
{
b=b*j;
}
s1=s1+pow(a,i)/b; //计算各项结果
s2=s2+pow(c,i)/b;
b=1; //一项计算完成后b清空,恢复初始值,以待下一连乘计算
}
coutS(-5)=s1endl;
cout1/S(5)=1/s2endl; //输出结果
coutexp(-5)=eendl;
m1=fabs(s1-e);
m2=fabs(s2-e);
if(m1=m2) //比较两种计算方式所得到的结果
coutSo 1/S(5) is closer to exp(-5)endl;
else
coutSo S(-5) is closer to exp(-5)endl;
return 0;
}
问题二:
(1)基本思路:
①构建函数设置有效位数:
由于C++中没有设置有效数字的函数,故在此构建一个函数significant(x,n)来设置所用的有效数字位数:即先将所计算的数字放大一定倍数后再缩小相应的倍数,就可达到控制有效数字的目的(具体程序见(2));
②数值计算:
用已经编好的significant(x,n)函数,并利用克莱姆法则的计算公式分别计算出不同精度下方程的值;再次,为方便计算,设置一个循环,计算2~6位有效数字的值。
(2)具体程序:
#include iostream
#include cmath
#include iomanip
using namespace std;
double significant(double x, int n) //创建函数设置有效位数
{
int j;
for(j=0;j=100;j++)
{
if ((int)(floor(x))/(int)(pow(10.0,j))==0) //循环结构得出应该扩大的倍数
break;
}
return floor(pow(1
文档评论(0)