西安交大计算方法Word格式.docx
《西安交大计算方法Word格式.docx》由会员分享,可在线阅读,更多相关《西安交大计算方法Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
for(doublea=2000.0;
a>
=1001.0;
a--)
s+=1.0/a;
s=s+1000;
System.out.println("
正序和"
+s);
逆序和"
+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<
Math.pow(10,1000000)){
sum=a*sum;
e=1.0/sum+e;
a++;
doubleb=1.0/(e*e*e*e*e);
较为精确的值1/e^5="
+b);
for(inti=1;
i<
=24;
i++)
s1+=cimi1(i);
s2+=cimi2(i);
s1=1.0/s1;
1/S24(5)="
+s1);
S24(-5)="
+s2);
publicstaticdoublecimi1(intai)
{doublexi=1;
for(inti=ai;
i>
=1;
i--)
xi=xi*(5.0/i);
returnxi;
publicstaticdoublecimi2(intai)
xi=xi*(-5.0/i);
运行结果:
解法二:
用matlab编程并运行,如下:
(1)计算(-5)
运行结果如下:
(2)计算1/(5)
而的真是结果为0.006737946
比较得1/(5)的计算结果与真实值更接近
解法三:
也可以用C++编写:
#include"
stdafx.h"
#include"
stdio.h"
iostream"
usingnamespacestd;
intmain(intargc,char*argv[])
{intfunc1(int);
doublefunc2(int);
doubley=0;
inti;
for(i=1;
25;
{intz=func1(i);
doublee=func2(i);
y+=z/e;
cout<
<
"
----------------------------------------"
endl;
1/S(5)的运算结果是:
"
1.0/(y+1)<
cout<
return0;
intfunc1(intx){
inty=1;
intk;
for(k=0;
k<
x;
k++)
y*=5;
returny;
doublefunc2(intn){
doubley=1;
intj;
for(j=1;
j<
=n;
j++)
y*=j;
运行结果如下图:
通过比较上述的几种编程结果,可以看出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+=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;
84;
a[i][i]=6;
a[i][i+1]=1;
a[i][i-1]=8;
a[i][85]=15;
for(intk=1;
k<
k++){
for(inti=k+1;
c=a[i][k]/a[k][k];
for(intj=k+1;
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;
sum=sum+a[k][j]*x[j];
x[k]=(a[k][85]-sum)/a[k][k];
sum=0.0;
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)在插值多项式次数比较高的时候,能更好的减少与真实值的误差,而朗格朗日插值多项式则恰恰相反。