
数值计算
邮政平邮价格-思福迪
2023年3月20日发(作者:补助申请书范文)本科实验报告
课程名称:计算机数值方法
实验项目:二分法牛顿法迭代法
实验地点:学院楼606
专业班级:学号:
学生姓名:
指导教师:王丽娟
年05月8日
太原理工大学学生实验报告
学院名称计算机科学与技术专业班级学号
学生姓名实验日期5月8日成绩
课程名称数值计算方法实验题目二分法迭代法求解方程
一、实验目的和要求(必填)
熟悉使用二分法、迭代法、牛顿法、割线法等方法对给定的方程进行根的求解。选择
上述方法中的两种方法求方程:f(x)=x3+4x2-10=0在[1,2]内的一个实根,且要求满足精度
|x*-x
n
|<0.5×10-5
二、实验内容和原理(必填)
f(x)在区间(x,y)上连续
先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一定有
零点,然后求f[(a+b)/2],
现在假设f(a)0,a
①如果f[(a+b)/2]=0,该点就是零点,
如果f[(a+b)/2]a,从①开始继
续使用
中点函数值判断。
如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2<=b,从①开始继
续使用
中点函数值判断。
这样就可以不断接近零点。
通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近
函数的零点,以求得零点的近似值
三、主要仪器设备(必填)
PC,DEV-C
四、操作方法与实验步骤(可选)
1.迭代法
#include
intmain(){
inti=0;
doublea;
doubleb[100];
printf("请输入任意一个在1与2之间的数n");
scanf("%lf",&b[0]);
do{
b[i+1]=b[i]-((b[i]*b[i]*b[i]+4*b[i]*b[i]-10)/(3*b[i]*b[i]+8*b[i]));
i++;
}while(b[i]-b[i+1]>0.000005);
printf("%.8lf",b[i]);
getch();
}
2.牛顿法
#include"stdio.h"
#include"math.h"
main()
{
doublex=1.5,a=0;
while(pow(pow((x-a),2),0.5)/2>0.5*0.00001)
{
a=x;
x=0.5*pow(10-pow(x,3),0.5);
printf("%fn",x);
}
getchar();
}
六、实验结果与分析(必填)
结果与书上的答案一致,编译过程中对do-while循环中条件的存在一定的不合适。。。
实验地点综合楼六层606室指导教师王丽娟
本科实验报告
课程名称:计算机数值方法
实验项目:高斯消元法,LU分解法,追赶法
实验地点:学院楼606
专业班级:学号:
学生姓名:
指导教师:王丽娟
年5月8日
太原理工大学学生实验报告
学院名称计算机科学与技术专业班级学号
学生姓名实验日期5月8日成绩
课程名称计算机数值方法实验题目高斯消元法,LU分解法,追赶法
一、实验目的和要求(必填)
2)线性方程组的直接解法
合理利用Gauss消元法、LU分解法、追赶法求解下列方程组:
①
13
8
14
142
210
321
3
2
1
x
x
x
②
2
1
78.46
17.59
1121
2592.11
21130.6291.5
1314.59103.0
4
3
2
1
15
x
x
x
x
③
3
7
7
2
2011612
6384
10278
5124
4
3
2
1
x
x
x
x
④
5
5
5
7
21
121
121
12
1
2
1
n
n
x
x
x
x
(n=5,10,100,…)
二、实验内容和原理(必填)
高斯分解法:
⑴将原方程组化为三角形方阵的方程组:
lik=aik/akk
aij=aij-lik*akj
k=1,2,…,n-1
i=k+1,k+2,…,nj=k+1,k+2,…,n+1
⑵由回代过程求得原方程组的解:
xn=ann+1/ann
xk=(akn+1-∑akjxj)/akk
(k=n-1,n-2,…,2,1)
LU分解法:
将系数矩阵A转化为A=L*U,L为单位下三角矩阵,U为普通上三角矩阵,然后
通过解方程组l*y=b,u*x=y,来求解x.
追赶法:
用来求对角方程组;将系数矩阵A转化为A=L*U,L为普通下n-1对角矩阵,U
为单位上n-1对角矩阵,然后通过解方程组l*y=b,u*x=y,来求解x.
三、主要仪器设备(必填)
PC,DEV-C++
四、操作方法与实验步骤(可选)
1.高斯消元法
#include
intmain(){
inti,j;
floatz,b,c,d,x1,x2,x3;
floata[3][4];
printf("请输入矩阵n");
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%f",&a[i][j]);
z=a[1][0]/a[0][0];
if(z!=0);{
for(j=0;j<4;j++)
a[1][j]=a[1][j]-z*a[0][j];
}
b=a[2][0]/a[0][0];
if(b!=0);{
for(j=0;j<4;j++)
a[2][j]=a[2][j]-b*a[0][j];
}
c=a[2][1]/a[1][1];
if(c!=0);{
for(j=0;j<4;j++)
a[2][j]=a[2][j]-c*a[1][j];
}
for(i=0;i<3;i++){
for(j=0;j<4;j++)
printf("%f",a[i][j]);
printf("n");
}
x3=a[2][3]/a[2][2];
x2=(a[1][3]-x3*a[1][2])/a[1][1];
x1=(a[0][3]-x3*a[0][2]-x2*a[0][1])/a[0][0];
printf("x1=%fx2=%fx3=%f",x1,x2,x3);
getch();
}
2.高斯列主元素消元法
#include
intmain(){
inti,j,n;
floatz,b,c,k,x1,x2,x3,x4;
floata[4][5];
printf("请输入矩阵n");
for(i=0;i<4;i++)
for(j=0;j<5;j++)
scanf("%f",&a[i][j]);
for(i=1;i<4;i++){
if(a[0][0]
for(j=0;j<5;j++){
k=a[0][j];
a[0][j]=a[i][j];
a[i][j]=k;
}
}
for(n=1;n<4;n++){
z=a[n][0]/a[0][0];
if(z!=0);
for(j=0;j<5;j++)
a[n][j]=a[n][j]-z*a[0][j];
}
for(n=2;n<4;n++){
c=a[n][1]/a[1][1];
if(c!=0)
for(j=0;j<5;j++)
a[n][j]=a[n][j]-c*a[1][j];
}
b=a[3][2]/a[2][2];
if(b!=0)
for(j=0;j<5;j++)
a[3][j]=a[3][j]-b*a[2][j];
for(i=0;i<4;i++){
for(j=0;j<5;j++)
printf("%f",a[i][j]);
printf("n");
}
x4=a[3][4]/a[3][3];
x3=(a[2][4]-x4*a[2][3])/a[2][2];
x2=(a[1][4]-x4*a[1][3]-x3*a[1][2])/a[1][1];
x1=(a[0][4]-x4*a[0][3]-x3*a[0][2]-x2*a[0][1])/a[0][0];
printf("%f%f%f",x1,x2,x3);
getch();
}
分解法
#include
intmain(){
intn,i,j,k,l,m;
floata[10][10],b[10][10],c[10][10];
floaty[10],w[10];
floatz;
printf("请输入为几阶矩阵n");
scanf("%d",&n);
printf("请输入矩阵n");
for(i=0;i for(j=0;j scanf("%f",&a[i][j]); for(l=0;l for(k=l+1;k b[k][l]=a[k][l]/a[l][l]; z=a[k][l]/a[l][l]; printf("b[%d][%d]=%fnz=%fn",k,l,b[k][l],z); if(b[k][l]!=0); for(j=0;j a[k][j]=a[k][j]-b[k][l]*a[l][j]; } for(i=0;i b[i][i]=1; for(i=0;i for(j=0;j if(i b[i][j]=0; for(m=0;m for(i=0;i w[m]=w[m]+b[n][0]*y[n]; for(i=0;i for(j=0;j printf("%f",a[i][j]); printf("n"); } printf("n"); for(i=0;i for(j=0;j printf("%f",b[i][j]); printf("n");} getch(); } 4.追赶法 #include"stdio.h" main() {doublea[15],b[15],c[15],d[15]; doublet; inti,n; /**********************************************/ //f=fopen("","r"); scanf("%d",&n); scanf("%lf%lf%lf",&b[1],&c[1],&d[1]); for(i=2;i<=n-1;i++) { scanf("%lf%lf%lf%lf",&a[i],&b[i],&c[i],&d[i]); } scanf("%lf%lf%lf",&a[n],&b[n],&d[n]); //fclose(f); /*********************************************/ c[1]=c[1]/b[1]; d[1]=d[1]/b[1]; for(i=2;i<=n-1;i++) { t=b[i]-c[i-1]*a[i]; c[i]=c[i]/t; d[i]=(d[i]-d[i-1]*a[i])/t; } d[n]=(d[n]-d[n-1]*a[n])/(b[n]-c[n-1]*a[n]); for(i=n-1;i>=1;i--)d[i]=d[i]-c[i]*d[i+1]; printf("n********************************n"); for(i=1;i<=n;i++) printf("d[%2d]=%lfn",i,d[i]); getch(); } 实验地点综合楼六层606室指导教师王丽娟 本科实验报告 课程名称:计算机数值方法 实验项目:雅克比迭代法以及高斯赛德尔法 实验地点:学院楼606 专业班级:学号: 学生姓名: 指导教师:王丽娟 年5月8日 太原理工大学学生实验报告 学院名称计算机科学与技术专业班级学号 学生姓名实验日期5月8日成绩 课程名称计算机数值方法实验题目雅克比迭代法 一、实验目的和要求(必填) 线性方程组的迭代解法 使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。 二、实验内容和原理(必填) 雅克比迭代法: 设线性方程组 Ax=b 的系数矩阵A可逆且主对角元素a11,a22,…,ann 均不为零,令 D=diag(a11,a22,…,ann ) 并将A分解成 A=(A-D)+D 从而线性方程组可写成 Dx=(D-A)x+b 则有迭代公式 x(k+1)=B1x(k)+f1 其中,B1=I-D-1A,f1=D-1b。 三、主要仪器设备(必填) 四、PC,vc6.0 五、操作方法与实验步骤(可选) #include"stdafx.h" main() 2.45 3.8210 2.7210 321 321 321 xxx xxx xxx {floata[15][15],x[15],sum=0; intb=0,i,j,m,n; printf("请输入行列:"); scanf("%d%d",&m,&n); printf("请输入系数n"); for(i=0;i for(j=0;j scanf("%f",&a[i][j]); printf("请输入x的初始值"); for(i=0;i scanf("%f",&x[i]); while(b<8) {for(i=0;i {sum=0; for(j=0;j if(j!=i) sum=sum+x[j]*a[i][j]; x[i]=(a[i][n-1]-sum)/a[i][i]; printf("%f",x[i]); } b++; printf("n"); } } 六、实验结果与分析(必填) 使用高斯-赛德尔和雅克比迭代都可以求出方程组的解,但是利用高斯-赛德尔迭代法所需的 迭代次数比雅克比迭代少,能够更早的达到精度要求。 实验地点综合楼六层606室指导教师王丽娟 本科实验报告 课程名称:计算机数值方法 实验项目:幂法 实验地点:学院楼606 专业班级:学号: 学生姓名: 指导教师:王丽娟 年5月8日 太原理工大学学生实验报告 学院名称计算机科学与技术专业班级学号 学生姓名实验日期5月8日成绩 课程名称计算机数值方法实验题目幂法求特征向量 一、实验目的和要求(必填) 矩阵特征值与特征向量问题 使用幂法求A模为最大的特征值及其相应的特征向量。 210 121 012 A 二、实验内容和原理(必填) 幂法:由已知的非零向量x0和矩阵A的乘幂构造向量序列{xn}以计算矩阵 A的按模最大特征值及其特征向量的方法,称为幂法。 迭代公式: 1 max(),1,2,... kk kk k k k yAx myk y x m 结果可取 1 11 k kk m yx 或 三、主要仪器设备(必填) PC,DEV-C 四、操作方法与实验步骤(可选) #include #include intmain(){ inti,j,n,f; floats; floata[10][10]; printf("请输入为几阶矩阵n"); scanf("%d",&n); floaty[n],x[n],z[n],mk[10]; printf("请输入初始矩阵Xn"); for(i=0;i scanf("%f",&x[i]); printf("请输入矩阵An"); for(i=0;i for(j=0;j scanf("%f",&a[i][j]); for(f=0;f<8;f++){ for(i=0;i y[i]=0; for(j=0;j y[i]+=a[i][j]*x[j]; } s=y[0]; for(i=0;i if(abs(y[i])>abs(s)) s=y[i]; mk[f]=s; printf("%f",mk[f]); for(i=0;i x[i]=y[i]/mk[f]; printf("%f",x[i]); } printf("n"); } getch(); } 五、实验结果与分析(必填) 幂法是一种求任意矩阵A的按模最大特征值及其对应特征向量的迭 代算法。该方法的最大优点是计算简单,容易在计算机上实现,对稀疏矩阵 较为适合,但有时收敛速度很慢。 实验地点综合楼六层606室指导教师王丽娟 本科实验报告 课程名称:计算机数值方法 实验项目:拉格朗日插值法牛顿插值法 实验地点:学院楼606 专业班级:学号 学生姓名: 指导教师:王丽娟 2013年5月8日 太原理工大学学生实验报告 学院名称计算机科学与技术专业班级学号 学生姓名实验日期5月8日成绩 课程名称计算机数值方法实验题目拉格朗日差值法 一、实验目的和要求(必填) 代数插值 使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运 用插值方法,求f(0.596)的近似值。 x0.400.550.650.800.901.05 f(x)0.410750.578150.696750.888111.026521.25386 二、实验内容和原理(必填) 设函数在区间[a,b]上n+1互异节点x0,x1,…,xn 上的函数值分别为 y0,y1,…,yn,求n次插值多项式Pn(x),满足条件 Pn(xj)=yj,j=0,1,…,n 令 Ln(x)=y0l0(x)+y1l1(x)+…+ynln(x)=∑yili(x) 其中l0(x),l1(x),…,ln(x)为以x0,x1,…,xn 为节点的n次插值基函 数,则Ln(x)是一次数不超过n的多项式,且满足 Ln(xj)=yj,L=0,1,…,n 再由插值多项式的唯一性,得 Pn(x)≡Ln(x) 三、主要仪器设备(必填) PC,DEV-C++ 四、操作方法与实验步骤(可选) #include intmain(){ floatx,s=0; intn,i,j; printf("请输入为过几个点的差值多项式n"); scanf("%d",&n); floata[n][2],b[n]; printf("请依次输入各个点n"); for(i=0;i for(j=0;j<2;j++) scanf("%f",&a[n][j]); printf("请输入xn"); scanf("%f",&x); for(i=0;i b[i]=1; for(j=0;j if(i==j) b[i]=b[i]; else b[i]=b[i]*(x-a[j][0])/(a[i][0]-a[j][0]); } } for(i=0;i printf("%f",b[i]); for(i=0;i s+=b[i]*a[i][1]; printf("%f",s); getch(); } 五、实验数据记录和处理(可选) 六、实验结果与分析(必填) 拉格朗日插值的优点是插值多项式特别容易建立,缺点是增加节点是原有多项 式不能利用,必须重新建立,即所有基函数都要重新计算,这就造成计算量的 浪费。 实验地点综合楼六层606室指导教师王丽娟 本科实验报告 课程名称:计算机数值方法 实验项目:最小二乘法拟合 实验地点:学院楼606 专业班级:学号: 学生姓名: 指导教师:王丽娟 2013年5月8日 太原理工大学学生实验报告 学院名称计算机科学与技术专业班级学号 学生姓名实验日期5月8日成绩 课程名称计算机数值方法实验题目最小二乘法 一、实验目的和要求(必填) 最小二乘法拟合多项式 给定数据点(x i ,y i ),用最小二乘法拟合数据的多项式,并求平方误差。 x i 00.50.60.70.80.91.0 y i 11.751.962.192.442.713.00 二、实验内容和原理(必填) 建立正规方程组: ∑(∑xi j+k )ak=∑xi jyi,j=0,1,…,n 平方误差: I=∑(∑akxi k-yi ) 2 三、主要仪器设备(必填) PC,DEV-C 四、操作方法与实验步骤(可选) 五、#include intmain(){ inti,n; floats,w,a,b,m,a0,a1,q; floatz[2][3]; printf("请输入共有多少个坐标点n"); scanf("%d",&n); floatx[n],y[n],f[n]; printf("请依次输入X的坐标n"); for(i=0;i scanf("%f",&x[i]); printf("请依次输入Y的坐标n"); for(i=0;i scanf("%f",&y[i]); for(i=0;i s+=x[i]; w+=y[i]; a+=x[i]*x[i]; b+=x[i]*y[i]; } printf("%f%f%f%fn",s,w,a,b); z[0][0]=n; z[0][1]=s; z[0][2]=w; z[1][0]=s; z[1][1]=a; z[1][2]=b; m=z[1][0]/z[0][0]; z[1][1]=z[1][1]-z[0][1]*m; z[1][2]=z[1][2]-z[0][2]*m; a1=z[1][2]/z[1][1]; a0=(z[0][2]-a1*z[0][1])/z[0][0]; printf("y=%f+%fxn",a0,a1); for(i=0;i f[i]=(a1*x[i]+a0); q+=((f[i]-y[i])*(f[i]-y[i])); } printf("平方误差为n"); printf("%f",q); getch(); } #include intmain(){ inti,n; floats,w,a,b,m,a0,a1,q; floatz[2][3]; printf("请输入共有多少个坐标点n"); scanf("%d",&n); floatx[n],y[n],f[n]; printf("请依次输入X的坐标n"); for(i=0;i scanf("%f",&x[i]); printf("请依次输入Y的坐标n"); for(i=0;i scanf("%f",&y[i]); for(i=0;i s+=x[i]; w+=y[i]; a+=x[i]*x[i]; b+=x[i]*y[i]; } printf("%f%f%f%fn",s,w,a,b); z[0][0]=n; z[0][1]=s; z[0][2]=w; z[1][0]=s; z[1][1]=a; z[1][2]=b; m=z[1][0]/z[0][0]; z[1][1]=z[1][1]-z[0][1]*m; z[1][2]=z[1][2]-z[0][2]*m; a1=z[1][2]/z[1][1]; a0=(z[0][2]-a1*z[0][1])/z[0][0]; printf("y=%f+%fxn",a0,a1); for(i=0;i f[i]=(a1*x[i]+a0); q+=((f[i]-y[i])*(f[i]-y[i])); } printf("平方误差为n"); printf("%f",q); getch(); } 六、实验结果与分析(必填) 数据拟合的具体作法是:对给定的数据(x i ,y i )(i=0,1,…,m),在取定的函数类中, 求p(x)属于此函数类,使误差r i =p(x i )-y i (i=0,1,…,m)的平方和最小,即 ∑ri 2 =∑(∑p(xi)-yi ) 2=min 从几何意义上讲,就是寻求与给定点(x i ,y i )(i=0,1,…,m)的距离平方和为最小 的曲线y=p(x)。 实验地点综合楼六层606室指导教师王丽娟