数值分析实验报告Word下载.docx
《数值分析实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《数值分析实验报告Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
endl;
第二个倒序方法的值:
daoxu()<
return0;
五、程序结果
六.实验体会
这个程序还是比较简单的,仅仅需要一个循环就可以完成,只要细心就不会有错。
从这个实验里我也看到了计算机毕竟不是万能的,由于机器字长的问题对于一些特殊的计算会出错——即大数吃小数这样的计算,这样会让人们在日常的生产生活中产生一些意想不到的问题。
不过只要稍微对计算方法做一下改动就可以改正这种错误——改变算术的顺序。
至于从哪个方向计算更好,那就要具体问题具体分析了.
对于程序上的解决了,cout输出的小数保留的位数。
实验二
1、拉格朗日插值
按下列数据
x
-3.0
-1.0
1.0
2.0
3.0
y
1.5
作二次插值,并求x
=-2,x
=0,x
=2.75时的函数近似值
2牛顿插值
0.30
0.42
0.50
0.58
0.66
0.72
1.04403
1.08462
1.11803
1.15603
1.19817
1.23223
作五次插值,并求x
=0.46,x
=0.55,x
=0.60时的函数近似值.
1.掌握牛顿插值法。
2.掌握拉格朗日插值法。
开始时判断输入的点是否在区间内,不在则退出
在则继续根据值选择节点带入公式计算
四源程序:
朗格朗日二次插值
doubleinser(doublex)
doublesum1,sum2,sum3,sum;
doublexi[5]={-3.0,-1.0,1.0,2.0,3.0};
doubleyi[5]={1.0,1.5,2.0,2.0,1.0};
inti;
inta,b,c;
for(i=0;
5;
if(x>
xi[i]&
&
x<
xi[i+1]||x<
xi[0]||x>
xi[4])
{
a=i;
b=(i+1)%5;
c=(i+2)%5;
break;
}
sum1=yi[a]*(x-xi[b])*(x-xi[c])/((xi[a]-xi[b])*(xi[a]-xi[c]));
sum2=yi[b]*(x-xi[a])*(x-xi[c])/((xi[b]-xi[a])*(xi[b]-xi[c]));
sum3=yi[c]*(x-xi[b])*(x-xi[a])/((xi[c]-xi[b])*(xi[c]-xi[a]));
sum=sum1+sum2+sum3;
朗格朗日二次插值-2.0的值:
inser(-2.0)<
朗格朗日二次插值0.0的值:
inser(0.0)<
朗格朗日二次插值2.75的值:
inser(2.75)<
牛顿插值
#defineN6
doublefi[N];
intchazhi();
doubleniudun(doublex)
doublexi[N]={0.3,0.42,0.5,0.58,0.66,0.72};
doubleyi[N]={1.04403,1.08462,1.11803,1.5603,1.19817,1.23223};
doublesum=0,sumx[N];
chazhi();
sumx[0]=1;
for(intj=1;
j<
N;
j++)
sumx[j]=(x-xi[j-1])*sumx[j-1];
for(inti=0;
sum=fi[i]*sumx[i]+sum;
intchazhi()
inti,j;
:
:
fi[0]=yi[0];
intflag=1;
for(j=N-1;
j>
j--)
for(i=0;
j;
yi[i]=double(yi[i+1]-yi[i])/double(xi[flag+i]-xi[i]);
:
fi[flag]=yi[0];
flag++;
牛顿插值插入0.46,可得值:
niudun(0.46)<
牛顿插值插入0.55,可得值:
niudun(0.55)<
牛顿插值插入0.60,可得值:
niudun(0.60)<
拉格朗日插值
五.实验体会
这个实验的目的主要是掌握如何在计算机上运用拉格朗日插值法和牛顿插值法来解决问题。
对于拉格朗日插值,已经给出了五个节点的函数值,可以在一定的范围内使用拉格朗日插值法,所以对于-5到1上的X我利用前三个节点,而对于1到5上X我利用后三个节点,这样算出来值的误差会比较小。
在牛顿插值上,题中已经给出了六个节点的函数值,利用这六个节点可以算出五阶差商,然后很容易就能够得出结果。
其中四阶差商为负数,但是差别不大,五阶差商又变回了正数,所以可以用到五阶差商,这样结果也会更准确。
实验三
一.实验内容
分别用复化梯形公式和复化辛卜生公式计算f(x)=sin(x)/x的积分,并与准确值比较判断精度。
二.实验目的
1掌握复化梯形公式。
2掌握复化辛卜生公式。
1.复化梯形公式代数形式求解定积分,为每个区间内的梯形公式的累加,所以除端点外的点都累加两次
2.复化新普生公式与梯形公式形式上差别不大,但是由于使用的是三个点一个区间所以只可以求解Sn4所以流程类似。
四.源程序
//************************复化梯形公式************
math.h>
#defineA0
#defineB1
#defineN8
doubleYi(doublexk)
doubles;
if(xk==0)
return0.0;
else
s=double(sin(xk))/double(xk);
returns;
doublefx()
{
doublesumx=0;
doubleki;
for(intk=0;
k<
k++)
ki=((double(B-A))/double(N))*k+A;
sumx+=Yi(ki);
returnsumx;
intmain()
if(A>
B)
cout<
输入的A小于B,错误"
return1;
doublesumx=fx(),sumy,sum;
sumy=sumx-Yi(A)+Yi(B);
sum=(double(B-A)/double(N))*(sumx+sumy)*0.5;
sinx/x在"
A<
到"
B<
区间的"
N<
段分值为:
sum<
//*/
/*
#defineN100
ki=((double(B-A))/double(N))*k+A+((double(B-A))/double(2*N));
doublefy()
doublesumy=0;
sumy+=Yi(ki);
returnsumy;
doublesumx=fx(),sumy=fy(),sum;
doubleh=abs(A-B);
sum=(Yi(A)+4*sumx+2*sumy+Yi(B))*h/double(6*N);
*/
复化辛卜生公式
六.实验体会
要求函数sin(x)/x的积分,程序是通过两种不同的复化求积,通过计算机计算,检验,更加理解了复化梯形公式和复化辛卜生公式。
如果要想求其它区间的积分可以直接输入。
复化梯形和复化辛卜生公式都是将区间分解成为若干等份,然后依次求积,编程应注意算法的严密性。
实验四
一.实验内容
用改进欧拉方法解初值问题y’=x+y;
y(0)=1。
0<
1,取步长h=0.1计算,并与准确值y=-x-1-2ex相比较。
(p141习题第二题2)
1了解掌握欧拉方法。
按照欧拉格式进行带入迭代计算流程图如下
//用改进欧拉方法解初值问题y'
=x+y;
1,取步长h=0.1计算,
//并与准确值y=-x-1-2ex相比较。
iomanip>
doubleh;
doubleimplicit(inti,doubleyi)
doubleyp;
yp=yi+h*(double(i*h+A)+yi);
returnyp;
doubleexpli(inti,doubleyi,doubleyp)
doubleyc;
yc=yi+h*(double((i+1)*h+A)+yp);
returnyc;
intn;
请输入步长h。
如:
0.1"
cin>
>
h;
n=int(double(B-A)/double(h));
double*y=newdouble[n+1],*yl=newdouble[n+1];
请输入y(0)为:
y[0];
yl[0]=y[0];
doubleypp,ycc;
n;
ypp=implicit(i,yl[i]);
ycc=expli(i,yl[i],ypp);
yl[i+1]=(ypp+ycc)/double
(2);
}//计算改进欧拉值
=n;
y[i]=-((i*h+A)+1-2*exp(i*h+A));
//计算真实值
yl[n-1]<
"
yl[n]<
改进欧拉公式准确值误差"
cout.precision(7);
yl[i]<
y[i]<
yl[i]-y[i]<
deletey;
deleteyl;
六.实验体会
课本上给出了明确的过程了,所以我就按照那个写了这个程序。
我认为实验目的主要还是通过编程更好地理解改进欧拉的方法,课本上给出了它的两种形式,第一种是用于做题的,而第二个就是这个程序上的。
熟悉了这两种方法就能够很好地掌握改进欧拉方法了。
实验五
一实验内容
分别用下列方法求f(x)=x3-3x-1=0在x0=2附近的根。
根的准确值为x*=1.87938524…,要求准确到四位有效数字,并对比各种算法的计算量。
二分法;
(2)简单迭代法;
(3)牛顿迭代法
二实验目的
1了解二分法
2熟悉简单迭代法
3掌握牛顿迭代法
三算法描述
这三个都是迭代算法,以上一部的值带入下一步求出近似解。
四源程序
#defineA1
#defineB3
doubleErFenFa()
doubleb=B,a=A,ab=(b+a)/double
(2);
doubleyb=b*b*b-double(3)*b-double
(1),ya=a*a*a-double(3)*a-double
(1),yab;
if(yb*ya>
=0)
输入AB区间有错"
while((b-a)>
0.0005)
ab=double(b+a)/double
(2);
yab=ab*ab*ab-double(3)*ab-double
(1);
if(yab>
0)
b=ab;
if(yab<
a=ab;
if(yab=0)
cout.precision(7);
由二分法计算可得x="
ab<
其误差为:
ab-1.87938524<
returnab;
doubleDieDaiFa()
doublexk,x=3;
xk=2;
intN;
while(fabs(xk-x)>
0.0005||N>
20)
x=xk;
xk=pow(double(3)*x+double
(1),1.0/3);
由简单迭代法计算可得x="
xk<
xk-1.87938524<
returnxk;
doubleNewDunfa()
doublexk=2,x=3;
xk=x-(x*x*x-double(3)*x-double
(1))/(double(3)*x*x-double(3));
由牛顿法计算可得x="
doublex1,x2,x3;
x1=ErFenFa();
x2=DieDaiFa();
x3=NewDunfa();
五实验结果
二分法实现比较简单,很容易写出算法来,简单迭代法按公式进行迭代,但好几次没弄清楚变量,由实验结果也可看出牛顿法的迭代次数少、精确度高。
实验六
一实验内容:
分别用高斯列主元消去法和直接三角分解法(LU分解)求方程组的解
系数矩阵:
10787常向量:
10
75658
861096
759107
精确解为:
(-60,102,-27,16)
二实验目的:
1.了解高斯列主元消去法的算法步骤。
2.掌握直接三角分解法。
列主元消去每次选择一个最大列元素然后交换到第一行进行消元计算然后队进行消元后的结果回带得到方程的解。
/高斯法
#definet(i,j)((i)-1)*n+(j)-1
stdio.h>
stdlib.h>
intmain(void)
intn,i,j,k;
//n方程个数i,j,k控制循环变量
double*matrix;
//方程系数矩阵
double*c;
//方程常向量
double*sol;
//方程解向量
doublet;
//临时变量
//输入n
printf("
请输入方程个数:
\n"
);
scanf("
%d"
&
n);
//申请内存
matrix=(double*)malloc(sizeof(double)*n*n);
c=(double*)malloc(sizeof(double)*n);
sol=(double*)malloc(sizeof(double)*n);
//输入数据
for(i=1;
i<
=n;
i++)
printf("
请输入第%d行系数:
i);
for(j=1;
j<
j++)
scanf("
%lf"
matrix[t(i,j)]);
请输入常向量:
scanf("
c[t(1,i)]);
//求梯形矩阵
for(k=1;
k<
k++)
//akk项等于1
t=matrix[t(k,k)];
for(j=k;
matrix[t(k,j)]=matrix[t(k,j)]/t;
c[t(1,k)]=c[t(1,k)]/t;
//aik项等于0
for(i=1+k;
t=-matrix[t(i,k)];
for(j=k;
{
matrix[t(i,j)]=matrix[t(i,j)]+t*matrix[t(k,j)];
}
c[t(1,i)]=c[t(1,i)]+t*c[t(1,k)];
//回带求解x1,x2.....xn
for(i=n;
i>
=1;
i--)
sol[t(1,i)]=c[t(1,i)];
for(j=i+1;
sol[t(1,i)]=sol[t(1,i)]-matrix[t(i,j)]*sol[t(1,j)];
//打印梯形矩阵
梯形矩阵为\n"
printf("
%5g"
matrix[t(i,j)]);
%10g\n"
c[t(1,i)]);
//打印方程的解
\n\n线性方程组解为\n"
%5g"
sol[t(1,i)]);
\n\n\n"
//释放内存
free(matrix);
free(c);
free(sol);
//列主元消去法
#include<
#defineMAX10
voidmain()
doubleA[4][5]={{10,7,8,7,10},{7,5,6,5,8},{8,6,10,9,6},{7,5,9,10,7}};
doubles,t,detA,max;
inti,j,k,m,n=4;
detA=1;
//消元计算