计算方法上机实习题大作业实验报告文档格式.docx
《计算方法上机实习题大作业实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《计算方法上机实习题大作业实验报告文档格式.docx(38页珍藏版)》请在冰豆网上搜索。
(3)按两种顺序分别计算
并指出有效位数
三、实验步骤、程序设计、实验结果及分析
(1)实验步骤:
分别从1~10000和从10000~1两种顺序进行计算,应包含的头文件有stdio.h和math.h
(2)程序设计:
a.顺序计算
#include<
stdio.h>
math.h>
voidmain()
{
doublesum=0;
intn=1;
while
(1)
{
sum=sum+(1/pow(n,2));
if(n%1000==0)printf("
sun[%d]=%-30f"
n,sum);
if(n>
=10000)break;
n++;
}
printf("
sum[%d]=%f\n"
}
b.逆序计算
intn=10000;
if(n%1000==0)
sum[%d]=%-30f"
if(n<
=1)break;
n--;
}
(3)实验结果及分析:
程序运行结果:
结果分析:
两种不同顺序计算结果是一样的,顺序计算误差从一开始就很小,而逆序计算误差最开始十分大,后来结果正确。
,计算
利用
,
(2)程序设计
inti=0,n;
floata[1024],b[1024],d[1024];
pleaseinputn,n="
);
scanf("
%d"
&
n);
\npleaseinputa[1]toa[n]:
\n"
for(i=1;
i<
=n;
i++)
a[%d]="
i);
scanf("
%f"
a[i]);
\npleaseinputb[0]tob[n]:
for(i=0;
printf("
b[%d]="
b[i]);
d[n]=b[n];
for(i=n-1;
i>
=0;
i--)
d[i]=b[i]+a[i+1]/d[i+1];
\nf=%f\n"
d[0]);
(3)实验结果
(1)实验步骤
利用C语言编写程序,分别使用数值稳定的和数值不稳定的计算公式所建立的递推公式进行计算。
main()
doubley_0=(1/4.0)*log(5),y_1;
doubley_2=(1.0/55.0+1.0/11.0)/2,y_3;
intn=1,m=10;
有效算法输出结果:
y[0]=%-20f"
y_0);
y_1=1.0/(4*n)+y_0/(-4.0);
y[%d]=%-20f"
n,y_1);
if(n>
=10)break;
y_0=y_1;
if(n%3==0)printf("
\n无效算法的输出结果:
y[10]=%-20f"
y_2);
y_3=1.0/n-4.0*y_2;
m-1,y_3);
if(m<
=1)break;
y_2=y_3;
m--;
if(m%2==0)printf("
(3)实验结果及分析
无效算法数值不稳定,误差造成的影响特别大
先编程按从大到小的顺序计算
的程序,再编程按从小到大的顺序计算
的程序,然后按两种顺序分别计算
。
{
intN;
doubleSN[30000];
SN[30000]=(3.0/2.0-1.0/30000.0-1/30001.0)/2.0;
for(N=30000;
N>
=2;
N--)
SN[N-1]=SN[N]-1.0/(N*N-1);
从大到小顺序计算:
\nSN[1000]=%f\nSN[10000]=%f\nSN[30000]=%f\n"
SN[1000],SN[10000],SN[30000]);
SN[2]=(3.0/2-1.0/2.0-1/3.0)/2.0;
for(N=3;
N<
=30000;
N++)
SN[N]=SN[N-1]+1.0/(N*N-1);
从小到大顺序计算:
不同顺序计算所得结果是一样的。
四、总结
通过这次上机,学习了解了舍入误差在不同算法时对结果的影响不同,稳定的算法才能获得正确的结果。
2方程求根
(1)通过对二分法与牛顿迭代法做编程练习和上机运算,进一步体会二分法和牛顿法的不同。
(2)编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。
1、用牛顿法求下列方程的根
(1)
(2)
(3)
2、编写割线法程序求解第一问的方程
1、牛顿法
通过定义牛顿法求方程的子函数,用main函数调用子函数求根
#include<
typedeffloat(*p)(float);
floatff1(floatx)
returnx*x-exp(x);
floatff2(floatx)
returnx*exp(x)-1;
floatff3(floatx)
returnlog(x)+x-2;
floatanswer(float(*p)(float))
intk=2;
floatm=1,n=-1,x2,a,b,c;
if(p==ff3)n=2;
x[0]=%.4f,x[1]=%.4f,"
m,n);
while
(1)
{
if(fabs(m-n)<
1e-4)break;
a=p(n)*(n-m);
b=p(n)-p(m);
c=a/b;
x2=n-c;
m=n;
n=x2;
x[%d]=%.4f,"
k,x2);
k++;
if(k%3==0)printf("
if(k%3!
=0)printf("
iterationtimes:
%d,roots:
%.4f\n"
k-2,n);
return0;
main()
x*x-exp(x),\n"
answer(ff1);
x*exp(x)-1,\n"
answer(ff2);
lg(x)+x-2,\n"
answer(ff3);
2、割线法
(1)程序设计
floatgexian(float,float);
floatf(float);
inti,j;
floatx1=2.2;
floatx2=2,x3;
i);
if(i==1)printf("
x1);
elseif(i==2)printf("
x2);
else
for(j=3;
j<
=i;
j++)
x3=gexian(x1,x2);
x1=x2;
x2=x3;
gexian(x1,x2));
floatf(floatx)
return(x*x-exp(x));
floatgexian(floatx1,floatx2)
return(x2-(f(x2)/(f(x2)-f(x1)))*(x2-x1));
了解和学习了二分法和牛顿迭代法的思想以及程序设计的方法,比较了迭代法和牛顿法的特点:
牛顿法收敛速度较快,但对初值选取要求较高;
割线法计算量少。
3线性方程组数值解法
(1)熟悉求解线性方程组的有关理论和方法;
(2)会编制列主元消去法,LU分解法,雅可比及高斯-赛德尔迭代法的程序;
(3)通过实际计算,进一步了解各种方法的优缺点,选择合适的数值方法。
1、用列主元消去法解方程组
2、用LU分解法解方程组
voidColPivot(float*,int,float[]);
voidColPivot(float*c,intn,floatx[])
inti,j,t,k;
floatp;
=n-2;
k=i;
for(j=i+1;
=n-1;
if(fabs(*(c+j*(n+1)+i))>
(fabs(*(c+k*(n+1)+i))))
k=j;
if(k!
=i)
for(j=i;
{
p=