计算方法与实习实验报告Word格式文档下载.docx
《计算方法与实习实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算方法与实习实验报告Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
sum1<
endl;
按降序计算的结果为:
sum2<
return0;
程序执行结果是:
1.64473
1.64483
分析:
显然升序结果的误差大于降序结果。
随着n的增大误差将越来越大,实际中,需合理选择计算顺序。
使误差尽量小。
实习题二
1.用牛顿法求下列方程的根:
1)
C语言程序代码如下:
cmath>
doublef(doublex){
returnx*x-exp(x);
doublef1(doublex){
return2*x-exp(x);
doubleeps=1e-6,eta=1e-8,x0,x1;
inti;
请输入迭代初值:
cin>
>
x0;
运行结果为:
for(i=0;
100;
i++){
x1=x0-f(x0)/f1(x0);
if(fabs(x1-x0)<
eps||fabs(f(x1))<
eta)
{cout<
x1<
break;
elsex0=x1;
x0<
1
-1.39221
-0.835088
-0.709834
-0.703483
-0.703467
实习题三
1.用列主元消去法解方程组:
C语言程序代码如下:
#include<
cmath>
voidColPivot(float*,int,float[]);
floatx[4];
floatc[4][5]={1,1,0,3,4,2,1,-1,1,1,3,-1,-1,3,-3,-1,2,3,-1,4};
ColPivot(c[0],4,x);
=3;
i++)printf("
x[%d]=%f\n"
i,x[i]);
voidColPivot(float*c,intn,floatx[]){
inti,j,k,t;
floatp;
=n-2;
k=i;
for(j=i+1;
j<
=n-1;
j++)
if(fabs(*(c+j*(n+1)+i))>
(fabs(*(c+k*(n+1)+i))))k=j;
if(k!
=i)
for(j=i;
=n;
j++){
p=*(c+i*(n+1)+j);
*(c+i*(n+1)+j)=*(c+k*(n+1)+j);
*(c+k*(n+1)+j)=p;
p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));
for(t=i;
t<
t++)
*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));
for(i=n-1;
i>
=0;
i--){
for(j=n-1;
=i+1;
j--)
(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));
x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));
x[0]=-1.333333
x[1]=2.333333
x[2]=-0.333333
x[3]=1.000000
4.编写用追赶法解三对角线性方程组的程序,并解下列方程组:
2)
,其中
A10x10=-41
1-41
...
...
1-4
b=-27
-15
…
-15
#definei11
intmain()
{
floata[i]={0,0,1,1,1,1,1,1,1,1,1};
floatb[i]={0,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4};
floatc[i]={0,1,1,1,1,1,1,1,1,1,0};
floatd[i]={0,-27,-15,-15,-15,-15,-15,-15,-15,-15,-15};
floate[i]={0,0,0,0,0,0,0,0,0,0,0};
floatf[i]={0,0,0,0,0,0,0,0,0,0,0};
floatg[i]={0,0,0,0,0,0,0,0,0,0,0};
floatm;
intj;
f[1]=c[1]/b[1];
g[1]=d[1]/b[1];
for(j=2;
i-1;
{
m=b[j]-f[j-1]*a[j];
f[j]=c[j]/m;
g[j]=(d[j]-g[j-1]*a[j])/m;
g[i-1]=(d[i-1]-g[i-2]*a[i-1])/(b[i-1]-f[i-2]*a[i-1]);
e[i-1]=g[i-1];
for(j=i-2;
=1;
e[j]=g[j]-f[j]*e[j+1];
x1~x10依次为:
for(j=1;
i;
e[j]<
return0;
8.70576
7.82303
7.58637
7.52245
7.50344
7.49131
7.46179
7.35583
6.96156
5.49039
实习题四
2.按下列数据
Xi
0.30
0.42
0.50
0.58
0.66
0.72
Yi
1.04403
1.08462
1.11803
1.15603
1.19817
1.23223
作5次插值,并求X1=0.46,X2=0.55,X3=0.60时的函数近似值。
floatchazhi(floatx[],floaty[],floatxx,intn)
float*a,yy=0;
a=newfloat[n];
a[i]=y[i];
for(j=0;
if(j!
=i)a[i]*=(xx-x[j])/(x[i]-x[j]);
yy=yy+a[i];
deletea;
returnyy;
floatx[6]={0.30,0.42,0.50,0.58,0.66,0.72};
floaty[6]={1.04403,1.08462,1.11803,1.15603,1.19817,1.23223};
floatxx1,xx2,xx3,yy1,yy2,yy3;
请输入x"
xx1>
xx2>
xx3;
yy1=chazhi(x,y,xx1,6);
yy2=chazhi(x,y,xx2,6);
yy3=chazhi(x,y,xx3,6);
x="
xx1<
"
y="
yy1<
xx2<
yy2<
xx3<
yy3<
请输入x
0.460.550.60
x=0.46,y=1.10072
x=0.55,y=1.14127
x=0.6,y=1.16619
实习题五
1.试分别用抛物线
和指数曲线
拟合下列数据
1.5
2
2.5
3
3.5
4
4.5
33.4
79.5
122.65
159.05
189.15
214.15
238.65
252.5
5
5.5
6
6.5
7
7.5
8
267.55
280.5
296.65
301.4
310.4
318.15
325.15
比较两个拟合函数的优劣。
①二次曲线:
matlab代码为:
A=[11.522.533.544.555.566.577.58];
B=[33.479.5122.65159.05189.15214.15238.65252.5267.55280.5296.65301.4310.4318.15325.15];
S=zeros(1,5);
T=zeros(3,1);
fork=1:
S(k)=sum(A.^(k-1));
end
T(k)=sum(A.^(k-1).*B);
C=zeros(3,3);
a=zeros(3,1);
fori=1:
forj=1:
C(i,j)=S(i+j-1);
a=C\T;
disp(a(k));
执行结果为:
-45.3333
94.2302
-6.1316
故拟合曲线为:
②指数曲线:
C语言程序代码为:
voidmain()
doubleX[15]={1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6,6.5,7,7.5,8};
doubleY[15]={log(33.4),log(79.5),log(122.65),log(159.05),log(189.15),log(214.15),log(238.65),log(252.5),log(267.55),log(280.5),log(296.65),log(301.4),log(310.4),log(318.15),log(325.15)};
doublexx;
doubleyy;
xx=0;
yy=0;
for(inti=0;
15;
++i)
xx+=(X[i]/15.0);
yy+=(Y[i]/15.0);
}
doubleb;
b=0;
doublem;
doublez;
m=0;
z=0;
for(intv=0;
v<
++v)
m+=((X[v]-xx)*(X[v]-xx));
z+=((X[v]-xx)*(Y[v]-yy));
if(m==0)
cout<
fail"
;
b=z/m;
doublelna;
lna=yy-b*xx;
a为:
exp(lna)<
b为:
b<
67.4026
0.23896
由计算结果可知,指数曲线的误差远大于二次拟合曲线。
因为拟合指数曲线时,利用取对数,将指数曲线间接转化为拟合一次曲线,而对于曲线拟合来说,拟合度越高往往意味着精确度越高。
故,指数曲线误差度大于二次曲线。
实习题六
1、用复化梯形公式和复化辛卜生公式计算积分I1(f)=
dx和I2(f)=
dx。
观察n为多少时,所得近似值具有6位有效数字。
(1)①用复化梯形公式计算:
Matlab程序如下:
functionadaptTrap(a,b,eps)
h=b-a;
T1=0;
T2=(b-a)/2*(f(a)+f(b));
n=1;
whileabs(T1-T2)>
eps
T1=T2;
m=2*n+1;
x=a:
(b-a)/(2*n):
b;
s=sum(f(x(2:
2:
m-1)));
T2=1/2*(T1+h*s);
n=n*2;
h=h/2;
fprintf(‘T(%d)=%f\n’,n,T2);
functiony=f(x)
y=sqrt(1+(cosx).*(cosx));
执行程序结果:
T(8)=1.910099
其中,n=8
②用复化辛卜生公式计算:
functionSimpson(a,b)
n=2;
fori=1:
x=a:
m=2*n+1;
h=(b-a)/n;
s=(h/6)*(f(a)+2*sum(f(3:
m-2)))+4*sum(f(x(2:
m-1)))+f(b));
fprintf(‘s(%d)=%f\n’,n,s);
n=n*2;
y=sqrt(1+(cosx).*(cosx));
s
(2)=1.910141;
s(4)=1.910099;
s(8)=1.910099
其中,n=8
(2)①用复化梯形公式计算:
f(x)=(tanx)/x;
T(512)=0.848967;
其中,n=512.
f(x)=(tanx)/x;
s
(2)=0.849039;
s(4)=0.848972;
s(8)=0.848967;
其中,n=8.