西安交大计算方法.docx
- 文档编号:4897523
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:21
- 大小:776.49KB
西安交大计算方法.docx
《西安交大计算方法.docx》由会员分享,可在线阅读,更多相关《西安交大计算方法.docx(21页珍藏版)》请在冰豆网上搜索。
西安交大计算方法
西安交通大学
计算方法上机实验
班级:
(xxx)
姓名:
(xxx)
学号:
2111601004
1.按两种顺序计算y,哪个接近真值?
Y=1000+++…+
用java语言编写:
publicclassAdd{
publicstaticvoidmain(String[]args)
{
doubles=0,y=1000;
for(doublea=1001.0;a<=2000.0;a++)
{
y+=1.0/a;
}
for(doublea=2000.0;a>=1001.0;a--)
{
s+=1.0/a;
}
s=s+1000;
System.out.println("正序和"+s);
System.out.println("逆序和"+y);
}
}
运行结果:
结论:
显然假设是double类型的数据时,先算大数的过程吃掉了末尾的小数被进位所埋没,导致了大数吃小数的误差,按从小到大(从右向左)的计算顺序所得的结果与真值相近,而按从大到小(从左到右)的计算顺序所得的结果与真值的误差较大。
1-18.设(x)=1+x+++…+,计算(-5)和1/(5),哪个接近?
解法一:
用JAVA语言编写:
publicclasssecond
{publicstaticvoidmain(String[]args)
{doubles1=1,s2=1;
doublee=1,sum=1;//e的初值为1,sum用来存放n!
inta=1;
while(sum sum=a*sum; e=1.0/sum+e; a++; } doubleb=1.0/(e*e*e*e*e); System.out.println("较为精确的值1/e^5="+b); for(inti=1;i<=24;i++) { s1+=cimi1(i); s2+=cimi2(i); } s1=1.0/s1; System.out.println("1/S24(5)="+s1); System.out.println("S24(-5)="+s2); } publicstaticdoublecimi1(intai) {doublexi=1; for(inti=ai;i>=1;i--) { xi=xi*(5.0/i); } returnxi; } publicstaticdoublecimi2(intai) {doublexi=1; for(inti=ai;i>=1;i--) { xi=xi*(-5.0/i); } returnxi; } } 运行结果: 解法二: 用matlab编程并运行,如下: (1)计算(-5) 运行结果如下: (2)计算1/(5) 运行结果如下: 而的真是结果为0.006737946 比较得1/(5)的计算结果与真实值更接近 解法三: 也可以用C++编写: #include"stdafx.h" #include"stdio.h" #include"iostream" usingnamespacestd; intmain(intargc,char*argv[]) {intfunc1(int); doublefunc2(int); doubley=0; inti; for(i=1;i<25;i++) {intz=func1(i); doublee=func2(i); y+=z/e; } cout<<"----------------------------------------"< cout<<"1/S(5)的运算结果是: "<<""<<1.0/(y+1)< cout<<"----------------------------------------"< return0; } intfunc1(intx){ inty=1; intk; for(k=0;k y*=5; returny;} doublefunc2(intn){ doubley=1; intj; for(j=1;j<=n;j++) y*=j; returny; } 运行结果如下图: 结论: 通过比较上述的几种编程结果,可以看出1/S(5),更接近真实值,而且用matlab更为简便,可以直接利用函数库,并可以轻松的嵌入秦九韶算法,大大减少运算量和时间。 1.已知方程组 ++= ++= ++= 的真解===1,且令a=,b=,c=,d=时利用克莱姆法则可将真解表示为 G=0.45a--0.1125 =[(0.2a–0.0625)b+(0.25a–0.1)c+(0.125-)d]/G =-[(0.1–0.25a)b+(-0.2)c+(0.25–0.5a)d]/G =[(0.125-)b+(0.5a–0.25)c+(a–0.25)d]/G 试将a,b,c,d依次取2~6位近似有效数,分别计算,,。 解: 用matlab编程如下: 将a,b,c,d依次取2~6位近似有效数 取2位有效近似有效数 取3位有效近似有效数 取4位有效近似有效数 取5位有效近似有效数 取6位有效近似有效数 结论: 随着所选取的近似有效位越多,计算的结果越接近真解 2.将选主元和不选主元高斯消去法编程程序。 解方程组: +=7 ++=15 +6+=15 +6+=15 ………… +6+=15 6+=14 并且比较将结果与真实值比较。 publicclassdaI{ /** *@paramargs */ publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub double[][]a; double[]x; double[]L; doublec=0.0,sum=0.0; a=newdouble[85][86]; x=newdouble[85]; L=newdouble[86]; for(inti=1;i<85;i++){ for(intj=1;j<86;j++){ a[i][j]=0; } } a[1][1]=6; a[1][2]=1; a[84][83]=8; a[84][84]=6; a[1][85]=7; a[84][85]=14; for(inti=2;i<84;i++){ a[i][i]=6; a[i][i+1]=1; a[i][i-1]=8; a[i][85]=15; } for(intk=1;k<84;k++){ for(inti=k+1;i<85;i++){ c=a[i][k]/a[k][k]; for(intj=k+1;j<86;j++){ a[i][j]=a[i][j]-c*a[k][j]; } } } x[84]=a[84][85]/a[84][84]; for(intk=83;k>0;k--){ for(intj=k+1;j<85;j++){ sum=sum+a[k][j]*x[j]; } x[k]=(a[k][85]-sum)/a[k][k]; sum=0.0; } for(inti=1;i<85;i++){ System.out.println("x["+i+"]="+x[i]); } } } 运行如下: 解: 将不选主元法用matlab编程如下: 将选主元法用matlab编程如下: 输入系数阵A和常数项b,计算得方程组的结果为x=[1,1,1,1,1,1,1,1,1......]。 用methematican语言实现选主元过程及其结果如下: 结论: 通过选主元与不选主元计算出的结果与真实结果比较,得出: 用选主元得到的结果与真实值相近,原因是用选主元的方法可以避免在计算时出现小除数的现象,从而避免了病态问题的出现。 所以用选主元法比不选主元法计算出的结果准确。 3.已知函数f(x)=1/(1+),x1,节点=-1+0.2i(i=010)。 (1)计算f(x)和拉格朗日插值多项式(x)的值,=-1+0.05k(k=040). (2)求三次自然插值样条函数S(x)的M表示中(i=0),计算S(x),x=-1+0.05k,k=040. (3)画出y=f(x),y=(x),y=S(x)的图形。 解: (1)用mathematica语言进行编程,方便作图: 计算f(x)和(x): (2)三次自然插值样条函数S(x),用mathematica语言编程: (3)采用mathematica软件画图如下: 结论: 比较y=f(x),y=(x),y=S(x)的图形可得,高次项会逐渐使得结果偏离真实值,而y=S(x)与y=f(x)比较接近。 说明三次自然插值样条函数S(x)在插值多项式次数比较高的时候,能更好的减少与真实值的误差,而朗格朗日插值多项式则恰恰相反。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西安 交大 计算方法