计算数值实验报告.docx
《计算数值实验报告.docx》由会员分享,可在线阅读,更多相关《计算数值实验报告.docx(28页珍藏版)》请在冰点文库上搜索。
计算数值实验报告
本科实验报告
课程名称:
计算数值方法
实验地址:
综合楼五层506室
专业班级:
计科1002学号:
14
学生姓名:
xxx
指导教师:
王峥
2012年6月20
太原理工大学学生实验报告
学院名称
计算机科学与技术
专业班级
计科1002
学号
14
学生姓名
xxx
实验日期
成绩
课程名称
计算数值方法
实验题目
实验一方程求根
一、课题名称
方程求根:
熟习使用、迭代法、牛顿法、割线法等方法对给定的方程进行根的求解。
选择上述方法中的两种方法求方程:
二分法f(x)=x3+4x2-10=0在[1,2]内的一个实根,且要
求知足精度|x*-xn|<×10-5
迭代法:
用迭代公式x=f(x)进行迭代计算,直到知足|x*-xn|<×10-5为止。
二分法:
设f(x)在[a,b]上连续,且f(a1)*f(x1)<0,记(a2,b2)=(x1,b1)带入计算式进行计算直到|x*-xn|<×10-5为止。
二、目的和意义
(1)认识非线性方程求根的常有方法,如二分法、迭代法、牛顿法、割线法。
(2)加深对方程求根方法的认识,掌握算法。
会进行偏差剖析,并能对不同方法进行比较。
三、计算公式
(1)迭代法
1).第一对给定的计算公式进行变形使其能够迭代或许找出相应迭代速度较快的
式子。
2).带入求好的式子到循环中去比方:
xk1(xk)(k0,1,2,L)
(2)二分法:
f(x)在区间(x,y)上连续
1).先找到a、b属于区间(x,y),使f(a),f(b)异号,说明在区间(a,b)内一
定有零点,而后求f[(a+b)/2],
2).假如f[(a+b)/2]=0,该点就是零点,
假如f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,反之在(a,(a+b)/2)内
有零点带入1)中持续。
四、主要仪器设施
Vc++C-freeCodeBlocks
五、结构程序设计
迭代法:
#include<>
#include<>
main()
{
inti;
doublexn[15],y,x1,x2,m;
printf("请输入x1,x2的值:
\n");
scanf("%lf%lf",&x1,&x2);
printf("请输入精度要求:
\n");
scanf("%lf",&m);
printf("nxn\n");
i=0;
do{
xn[0]=(x1+x2)/2;
xn[i+1]=sqrt(10/(4+xn[i]));
1
2
3
x1
14
0.31015
59.14
3
1
x1
59.17
4
2
1
5
x1
5.291
6.130
1
2
x2
46.78
8
7
2
10
x2
0
1
2
x2
8
11.2
9
5
2
x3
1
4
8
3
6
x3
2
4
1
x3
13
1
2
1
1
x4
2
126
1120x4
1
x1
7
2
1
x2
5
12
1
xn1
5
1
2
xn
5
追赶法:
用来求对角方程组;将系数矩阵
A转变为A=L*U,L为一般下n-1对角矩阵,U为单位上n-1对角矩阵,而后经过
程组l*y=b,u*x=y,
来求解x.
、主要仪器设施
c++C-freeCodeBlocks
、结构程序设计
Gauss消元法:
#include
#include
usingnamespacestd;
intmain()
{
intn,i,j,k;
doublea[100][100],b[100],o;
cout<<"输入未知数个数:
"<cin>>n;
cout<<"输入数列:
"<for(i=1;i<=n;i++)
for(j=1;j<=n+1;j++)
cin>>a[i][j];
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(fabs(a[j][i])>1e-7)
{
o=a[i][i]/a[j][i];
for(k=i;k<=n+1;k++)
a[j][k]=a[j][k]*o-a[i][k];
}
for(i=n;i>0;i--)
{
b[i]=a[i][n+1]/a[i][i];
for(j=i-1;j>0;j--)
a[j][n+1]=a[j][n+1]-b[i]*a[j][i];
}
cout<<"解得:
"<for(i=1;i<=n;i++)cout<
lf\n",i,d[i]);
}
、结果议论和剖析
消元法:
列主元素消元法:
解法:
追赶法:
议论
从消元过程能够看出,关于n阶线性方程组,只需各步主元素不为零,经过n-1步消元,就能够获得一个等价的系数
三角形阵的方程组,而后再利用回代过程可求得原方程组的解.因为列主元素法相像且优于完整主元素法因此省略
消元过程相当于分解A为单位下三角阵L与上三角阵U的乘积,解方程组Ly=b回代过程就是解方程组Ux=y。
此中的单位下三角阵、U为上三角阵.在A的LU分解中,L取下三角阵,U取单位上三角阵,这样求解方程组Ax=d的方法法。
此外是追赶法和其余方法求同一方程结果不同样,我多次改正源程序,也不知道原由。
再就是追赶法有很大的局
改进。
图:
实验地址综合楼五层506室指导教师王峥
太原理工大学学生实验报告
学院名称
计算机科学与技术
专业班级
计科1002
学号
14
学生姓名
xxx
实验日期
成绩
课程名称
计算数值方法
实验题目
实验三线性方程组的迭代解法
一、课题名称
线性方程组的迭代解法
使用雅可比迭代法或高斯-赛德尔迭代法对以下方程组进行求解。
10x1
x2
2x3
7.2
x1
10x2
2x3
8.3
x1
x2
5x3
4.2
二、目的和意义
学习使用雅可比迭代法或高斯-赛德尔迭代法
三、计算公式
雅克比迭代法:
设线性方程组
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。
四、主要仪器设施
Vc++C-freeCodeBlocks
五、结构程序设计
雅克比迭代法:
#include<>
#include<>
main()
{
inti;
doublex1[20],x2[20],x3[20];
doublex10,x20,x30;
printf("请输入x1,x2,x3的初值:
\n");
scanf("%lf%lf%lf",&x10,&x20,&x30);
printf("nx1[n]x2[n]x3[n]\n");
for(i=0;i<18;i++)
{
x1[0]=x10;
x2[0]=x20;
x3[0]=x30;
x1[i+1]=*x2[i]+*x3[i]+;
x2[i+1]=*x1[i]+*x3[i]+;
x3[i+1]=*x1[i]+*x2[i]+;
printf("%5d%5lf%5lf%5lf\n",i,x1[i],x2[i],x3[i]);
}}
六、实验结果与剖析:
雅克比迭代法:
剖析议论:
其实,这两个迭代法是以前迭代法的升级,多了几个迭代式子而已,并且二者相差不大比较
简单,因此选择了雅克比迭代法进行求解,可是没有与另一种方法高斯赛德尔迭代法进行本质性的比较。
流程图:
实验地址综合楼五层506室指导教师王峥
太原理工大学学生实验报告
学院名称计算机科学与技术专业班级计科1002学号14
学生姓名xxx实验日期成绩
课程名称计算数值方法实验题目实验四矩阵特点值与特点向量问题
一、课题名称
使用幂法求A模为最大的特点值及其相应的特点向量。
210
A121
012
二、目的和意义
(1)认识矩阵特点值与特点向量问题解法,掌握幂法。
(2)加深对矩阵特点值与特点向量问题求解方法的认识,掌握算法。
三、计算公式
幂法:
由已知的非零向量x0和矩阵A的乘幂结构向量序列{xn}以计算矩阵A的按模最大特点值及其特点向量的方法,称为幂法。
迭代公式:
yk
Axk
1
mk
max(
yk),k1,2,...
xk
yk
mk
结果可取
1mk
1yk或1xk
四、主要仪器设施
Vc++C-freeCodeBlocks
五、结构程序设计
源代码:
#include<>
#include<>
#defineN3
#defineeps1e-6
#defineKM30
floatMaxValue(floatx[],intn)
{
floatMax=x[0];
inti;
for(i=1;iif(fabs(x[i])>fabs(Max))Max=x[i];
returnMax;
}
voidPowerMethod(float*A)
{
floatU[N],V[N],r1,r2,temp;
inti,j,k=0;
while(k{
k++;
for(i=0;i{
temp=0;
for(j=0;jV[i]=temp;
}
for(i=0;iif(k==1)r1=MaxValue(V,N);
elser2=MaxValue(V,N);
if(fabs(r2-r1)r1=r2;
}
printf("r=%f\n",r2);
for(i=0;i}
voidmain()
{
floatA[N][N]={{2,-1,0},{-1,2,-1},{0,-1,2}};floatU[N];//A的值
U[0]=1;
U[1]=1;
U[2]=1;//x0的值
PowerMethod(A[0]);
}
六、结果议论和剖析
剖析议论
因为该程序将A矩阵和x0的值编写在程序中,因此要想改正成其余矩阵时比较麻烦,因此也有必定的限制性。
幂法是一种求随意矩阵A的按模最大特点值及其对应特点向量的迭代算法。
该方法的最大长处是计算简单,简单在计算机上实现,对稀少矩阵较为合适,但有时收敛速度很慢。
流程图:
实验地址综合楼五层506室指导教师王峥
太原理工大学学生实验报告
学院名称
计算机科学与技术
专业班级
计科1002
学号
14
学生姓名
xxx
实验日期
成绩
课程名称
计算数值方法
实验题目
实验五代数插值
一、课题名称
(使用拉格朗日插值法或牛顿插值法求解:
已知f(x)在6个点的函数值以下表所示,运用
插值方法,求f的近似值。
x
f(x)
二、目的和意义
学习使用拉格朗日插值法或牛顿插值法求解
三、计算公式
设函数在区间[a,b]
上n+1
互异节点x0,x1,⋯,xn上的函数值分别为
y
y
⋯,y,求n次插值多项式P(x),知足条件
0
1
n
n
Pn(xj)=yj,j=0,1,
⋯,n
令
Ln(x)=y0l0(x)+y
1l1(x)+⋯+ynln(x)=∑yili(x)
此中l
(x),l
(x),⋯,l
(x)
为以x,x
⋯,x
n
为节点的n次插值基函
0
1
n
0
1
数,则Ln(x)是一次数不超出n的多项式,且知足
Ln(xj)=yj,L=0,1,
⋯,n
再由插值多项式的独一性,得
Pn(x)≡Ln(x)
四、主要仪器设施
Vc++C-freeCodeBlocks
五、结构程序设计
#include<>
#include<>
main()
{
intI;
charL;
doubleM[100][100];
doublex[100],y[100];
doubleX=1,xx=0,w=1,N=0,P,R=1;
intn=5;
//cout<<"请输入所求均差阶数:
";//求全部阶差
//cin>>n;
//for(inti=0;i<=n;i++)
//{
/*cout<<"请输入x"<
"<cin>>x[i];
cout<<"请输入y"<
"<cin>>y[i];
M[i][0]=x[i];
M[i][1]=y[i];*///
用二维保留全部数据
M[0][0]=;M[0][1]=;
M[1][0]=;M[1][1]=;
M[2][0]=;M[2][1]=;
M[3][0]=;M[3][1]=;
M[4][0]=;M[4][1]=;
M[5][0]=;M[5][1]=;
for(intj=2;j<=n+1;j++)
{
for(inti=1;i<=n;i++)
{
M[i][j]=(M[i][j-1]-M[i-1][j-1])/(M[i][0]-M[i-j+1][0]);
}
}
for(inti=1;i<=n;i++)
{
cout<<"其"<
"<}
cout<<"请输入x的值:
x=";
cin>>xx;
for(inti=0;i{
X*=xx-M[i][0];
N+=M[i+1][i+2]*X;
P=M[0][1]+N;
}
cout<<"其函数值:
y="<
}
六、结果议论和剖析
剖析议论
拉格朗日插值的长处是插值多项式特别简单成立,弊端是增添节点是原有多
项式不可以利用,一定从头成立,即全部基函数都要从头计算,这就造成计算量
的浪费。
因此该程序选择了牛顿法,因为在输入数据的时候比较麻烦因此将
数据存在了程序里面,只好在程序里改正数据。
此外因为精度问题计算结果
有必定的偏差。
流程图:
实验地址综合楼五层506室指导教师王峥
太原理工大学学生实验报告
学院名称
计算机科学与技术
专业班级
计科1002
学号
14
学生姓名
xxx
实验日期
成绩
课程名称
计算数值方法
实验题目
实验六
最小二乘法拟合多项式
一、课题名称
给定数据点(xi,yi),用最小二乘法拟合数据的多项式,并求平方偏差。
xi0
yi1
二、目的和意义
1.娴熟运用已学计算方法求解方程组
2.加深对计算方法技巧,选择正确的计算方法来求解各样方程组
3.培育使用电子计算机进行科学计算和解决问题的能力
三、计算公式
成立正规方程组:
∑(∑
x
i
j+k
)k∑i
j
i
j=0,1,⋯,n
a=x
y
平方偏差:
I=∑(∑akxik-yi)
2
四、主要仪器设施
Vc++C-freeCodeBlocks
五、结构程序设计
源代码:
#include<>
#include<>
#defineN15
doublepower(double&a,intn)
{
doubleb=1;
for(inti=0;ib*=a;
returnb;
}
voidGauss();
doubleX[N],Y[N],sumX[N],sumY[N],a[N][N],b[N],l[N][N],x[N];
voidmain()
{
ofstreamoutdata;
ifstreamindata;
doubles;
inti,j,k,n,index;
//cout<<"请输入已知点的个数n=";
//cin>>n;
n=7;
cout<//cout<<"请输入X和Y:
"<
X[0]=;Y[0]=;
X[1]=;Y[1]=;
X[2]=;Y[2]=;
X[3]=;Y[3]=;
X[4]=;Y[4]=;
X[5]=;Y[5]=;
X[6]=;Y[6]=;//绑定数据//能够解绑由下for循环输入任何数据
for(i=0;i{
//cout<<"X["<
//cin>>X[i];
sumX[1]+=X[i];
//cout<<"Y["<
//cin>>Y[i];
sumY[1]+=Y[i];
//cout<
}
cout<<"sumX[1]="<
cout<<"请输入拟合次数index=";
cin>>index;
cout<
i=n;
sumX[0]=i;
for(i=2;i<=2*index;i++)
{
sumX[i]=0;
for(j=0;j
sumX[i]+=power(X[j],i);
cout<<"sumX["<
}
for(i=2;i<=index+1;i++)
{
sumY[i]=0;
for(j=0;j
sumY[i]+=power(X[j],i-1)*Y[j];
cout<<"sumY["<
}
for(i=1;i<=index+1;i++)
{//成立正规方程组
for(j=1;j<=index+1;j++)
a[i][j]=sumX[i+j-2];
b[i]=sumY[i];
}
k=1;//用高斯消元法解方程组
do{
for(j=k+1;j<=index+1;j++)l[j][k]=a[j][k]/a[k][k];
for(i=k+1;i<=index+1;i++){
for(j=k+1;j<=index+1;j++)
a[i][j]=a[i][j]-l[i][k]*a[k][j];
b[i]=b[i]-l[i][k]*b[k];
}
if(k==index+1)break;
k++;
}while
(1);
x[index+1]=b[index+1]/a[index+1][index+1];
for(i=index;i>=1;i--)
{
s=0;
for(j=i+1;j<=index+1;j++)
s=s+a[i][j]*x[j];
x[i]=(b[i]-s)/a[i][i];
}
cout<<"拟合系数为:
";//输出拟合系数
for(i=1;i<=index+1;i++)
cout<
cout<cout<<"拟合曲线方程为:
"<
cout<<"y(x)="<
for(inti=1;i{
cout<<"+"<for(intj=0;j
{
cout<<"*x";
}
}
cout<
doublem=0;
cout<";
for(i=0;i
{
doublet=x[1]+x[2]*X[i]-Y[i];
m=m+power(t,2);
}
cout<
cout<<"特别说明:
为了方便"<cout<<"数据被存在程序中无需"<
cout<<"输入改正在代码里进行!
"<}
六、结果议论和剖析
剖析议论
数据拟合的详细作法是:
对给定的数据(xi,yi)(i=0,1,,m),在取定的函数类中,