1、计算数值实验报告太原理工大学本科实验报告课程名称: 计算数值方法 实验地点: 综合楼五层506室 专业班级:计科1002 学号: 2010001414 学生姓名: xxx 指导教师: 王峥 2012 年 6 月 20 太原理工大学学生实验报告学院名称计算机科学与技术专业班级计科 1002学号2010001414学生姓名 xxx实验日期2012.6.5成绩课程名称计算数值方法实验题目实验一 方程求根一、课题名称方程求根:熟悉使用、迭代法、牛顿法、割线法等方法对给定的方程进行根的求解。选择上述方法中的两种方法求方程:二分法f(x)=x3+4x2-10=0在1,2内的一个实根,且要求满足精度|x*-
2、xn|0.510-5迭代法:用迭代公式x=f(x)进行迭代计算,直到满足|x*-xn|0.510-5 为止 。二分法:设f(x)在a,b上连续,且f(a1)*f(x1)0,记(a2,b2)=(x1,b1)带入计算式进行计算 直到 |x*-xn|0.510-5 为止 。二、目的和意义(1)了解非线性方程求根的常见方法,如二分法、迭代法、牛顿法、割线法。(2)加深对方程求根方法的认识,掌握算法。会进行误差分析,并能对不同方法进行比较。三、计算公式(1)迭代法 1).首先对给定的计算公式进行变形使其能够迭代或者找出相应迭代速度较快的式子。 2).带入求好的式子到循环中去比如:(2)二分法: f(x)
3、在区间(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)/20,则在区间((a+b)/2,b)内有零点,反之在(a,(a+b)/2)内有零点 带入1)中继续。四、主要仪器设备Vc+ 9.0 C-free CodeBlocks五、结构程序设计迭代法: #include #include main() int i; double xn15,y,x1,x2,m ; printf(请输入x1,x2的值:n ); scanf(%lf%lf,&x1,&
4、x2); printf(请输入精度要求:n ); scanf(%lf,&m); printf( n xnn);i=0; do xn0=(x1+x2)/2 ; xni+1= sqrt(10/(4+xni); /迭代 printf(%5d %5lfn,i,xni); y= fabs(xni+1-xni) ; i+; if(ym)break; while(1); 二分法:#include #include main() int m,n,o,p; double a,b,l; printf(请输入x3, x2, x的系数和常数p:n); scanf(%d%d%d%d,&m,&n,&o,&p); /1 4
5、 0 -10 printf(请输入x1,x2:n); scanf(%lf%lf,&a,&b); /1 2 printf(请输入精度要求:n); scanf(%lf,&l); /0.5x105 printf( n an bn xn f(xn)n); double x,fx; int i=1; do x=(b+a)/2; fx=m*x*x*x+n*x*x+o*x+p; printf(%5d %5f %5f %5f %5fn,i,a,b,x,fx); i+; if(fx=0) break; if(fx0) b=x; else if(fx0) a=x; if(b-a)l) break; /进行计算并返
6、值 while(1);六、结果讨论和分析 二分法: 迭代法: 分析讨论:使用不同的方法,可以不同程度的求得方程的解,不同的方法速度不同,求得的结果也稍有区别,当然和要求精度也有关系。刚开始的时候用数组对二分法进行求解,发现 循环到第二次 就无法实现值的传递,于是换了另外一种方法代替了数组。流程图:实验地点综合楼五层506室指导教师王峥太原理工大学学生实验报告学院名称计算机科学与技术专业班级计科 1002学号2010001414学生姓名 xxx实验日期2012.6.5成绩课程名称计算数值方法实验题目实验二 线性方程组的直接解法一、课题名称线性方程组的直接解法合理利用Gauss消元法、LU分解法、
7、追赶法求解下列方程组: (n=5,10,100)二、目的和意义(1)了解线性方程组常见的直接解法,如Guass消元法、LU分解法、追赶法。(2)加深对线性方程组求解方法的认识,掌握算法。(3)会进行误差分析,并能对不同方法进行比较。三、计算公式 高斯分解法:将原方程组化为三角形方阵的方程组:lik=aik/akk aij= aij- lik* akj k=1,2,n-1 i=k+1,k+2, ,n j=k+1,k+2, ,n+1由回代过程求得原方程组的解: xn= ann+1/ ann xk=( akn+1-akj xj)/ akk (k=n-1,n-2, ,2,1) LU分解法:将系数矩阵A
8、转化为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.四、主要仪器设备Vc+ 9.0 C-free CodeBlocks五、结构程序设计 Gauss消元法: #include #include using namespace std;int main() int n,i,j,k; double a100100,b100,o; cout输入未知数个数:n; cout输入数列:endl
9、; for (i=1;i=n;i+) for (j=1;jaij; for (i=1;i=n;i+) for (j=i+1;j1e-7) o=aii/aji; for (k=i;k0;i-) bi=ain+1/aii; for (j=i-1;j0;j-) ajn+1=ajn+1-bi*aji; cout解得:endl; for (i=1;i=n;i+) coutbiendl; /system(pause); return 0;列主元素消元法: #include #include #define N 20 using namespace std; void load(); float aNN;
10、int m; int main() int i,j; int c,k,n,p,r; float xN,lNN,s,d; coutm; coutendl; cout请按顺序输入增广矩阵a:endl; load(); for(i=0;im;i+) for(j=i;jfabs(aii)?j:i; /*找列最大元素*/ for(n=0;nm+1;n+) s=ain; ain=acn; acn=s; /*将列最大数防在对角线上*/ for(p=0;pm+1;p+) coutaipt; coutendl; for(k=i+1;km;k+) lki=aki/aii; for(r=i;r=0;i-) d=0;
11、 for(j=i+1;jm;j+) d=d+aij*xj; xi=(aim-d)/aii; /*求解*/ cout该方程组的解为:endl; for(i=0;im;i+) coutxi=xit; return 0; void load() int i,j; for(i=0;im;i+) for(j=0;jaij; LU分解法:#include void solve(float l100,float u100,float b,float x,int n) int i,j; float t,s1,s2; float y100; for(i=1;i=n;i+) /* 第一次回代过程开始 */ s1=
12、0; for(j=1;j=1;i-) /* 第二次回代过程开始*/ s2=0; for(j=n;ji;j-) t=-uij; s2=s2+t*xj; xi=(yi+s2)/uii; void main() float a100100,l100100,u100100,x100,b100; int i,j,n,r,k; float s1,s2; for(i=1;i=99;i+)/*将所有的数组置零,同时将L矩阵的对角值设为1*/ for(j=1;j=99;j+) lij=0,uij=0; if(j=i) lij=1; printf (输入方程组的个数 n:n);/*输入方程组的个数*/ scanf
13、(%d,&n); printf (读取原矩阵 A(x的系数):n);/*读取原矩阵A*/ for(i=1;i=n;i+) for(j=1;j=n;j+) scanf(%f,&aij); printf (读取列矩阵 B(y的值):n);/*读取列矩阵B*/ for(i=1;i=n;i+) scanf(%f,&bi); for(r=1;r=n;r+)/*求解矩阵L和U*/ for(i=r;i=n;i+) s1=0; for(k=1;k=r-1;k+) s1=s1+lrk*uki; uri=ari-s1; for(i=r+1;i=n;i+) s2=0; for(k=1;k=r-1;k+) s2=s2
14、+lik*ukr; lir=(air-s2)/urr; printf(输出矩阵 L:n);/输出矩阵Lfor(i=1;i=n;i+) for(j=1;j=n;j+) printf(%7.3f ,lij); printf(n); printf(输出矩阵 U:n);/输出矩阵U for(i=1;i=n;i+) for(j=1;j=n;j+) printf(%7.3f ,uij); printf(n); solve(l,u,b,x,n); printf(解为:n); for(i=1;i=n;i+) printf(x%d=%fn,i,xi); 追赶法: #include #define N 3 mai
15、n() double A33,b3; printf(请按顺序输入x的系数:n); int a,c; for(a=0;a3;a+) for(c=0;c3;c+) scanf(%lf,&Aac); printf(请按顺序输入y的值:n); int k; for(k=0;k3;k+)scanf(%lf,&bk); int i; A01=A01/A00; for(i=1;i2;i+) Aii+1=Aii+1/(Aii-Aii-1*Ai-1i); for(i=1;i3;i+) Aii=Aii-Aii-1*Ai-1i; b0=b0/A00; for(i=1;i=0;i-) bi=bi-Aii+1*bi+1
16、; for(i=0;i3;i+) printf(x%d=%.6lfn,i,di); 六、结果讨论和分析Gauss消元法: 列主元素消元法: LU分解法: 追赶法: 分析讨论从消元过程可以看出,对于n阶线性方程组,只要各步主元素不为零,经过n-1步消元,就可以得到一个等价的系数矩阵为上三角形阵的方程组,然后再利用回代过程可求得原方程组的解. 由于列主元素法相似且优于完全主元素法 所以省略了后者。消元过程相当于分解 A为单位下三角阵L与上三角阵U的乘积,解方程组Ly=b回代过程就是解方程组Ux=y。其中的L为n阶单位下三角阵、U为上三角阵. 在 A 的LU 分解中, L取下三角阵, U 取单位上三
17、角阵,这样求解方程组Ax=d 的方法称为追赶法。另外是追赶法和其他方法求同一方程结果不一样,我多次修改源程序,也不知道原因。再就是追赶法有很大的局限性 还待改良。流程图:实验地点综合楼五层506室指导教师王峥太原理工大学学生实验报告学院名称计算机科学与技术专业班级计科 1002学号2010001414学生姓名 xxx实验日期2012.6.5成绩课程名称计算数值方法实验题目实验三 线性方程组的迭代解法一、课题名称线性方程组的迭代解法使用雅可比迭代法或高斯-赛德尔迭代法对下列方程组进行求解。 二、目的和意义学习使用雅可比迭代法或高斯-赛德尔迭代法三、计算公式雅克比迭代法:设线性方程组Ax=b的系数
18、矩阵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+ 9.0 C-free CodeBlocks五、结构程序设计雅克比迭代法:#include #include main() int i; double x120 ,x220,x320; double x10, x20, x30; printf(请输入x1,x2,x3的初值:n);scanf(%lf%lf%lf,&x10,&
19、x20, &x30); printf( n x1n x2n x3n n); for(i=0;i18;i+) x10=x10; x20=x20; x30=x30; x1i+1=0.1*x2i+0.2*x3i+0.72; x2i+1=0.1*x1i+0.2*x3i+0.83; x3i+1=0.2*x1i+0.2*x2i+0.84; printf(%5d %5lf %5lf %5lfn,i,x1i,x2i,x3i); 六、实验结果与分析:雅克比迭代法:分析讨论: 其实,这两个迭代法是之前迭代法的升级,多了几个迭代式子而已,而且两者相差不大比较简单,所以选择了雅克比迭代法进行求解,但是没有与另一种方法
20、 高斯赛德尔迭代法进行实质性的比较。流程图:实验地点综合楼五层506室指导教师王峥太原理工大学学生实验报告学院名称计算机科学与技术专业班级计科 1002学号2010001414学生姓名 xxx实验日期2012.6.10成绩课程名称计算数值方法实验题目实验四 矩阵特征值与特征向量问题一、课题名称使用幂法求A模为最大的特征值及其相应的特征向量。二、目的和意义(1)了解矩阵特征值与特征向量问题解法,掌握幂法。(2)加深对矩阵特征值与特征向量问题求解方法的认识,掌握算法。三、计算公式幂法:由已知的非零向量x0和矩阵A的乘幂构造向量序列xn以计算矩阵A的按模最大特征值及其特征向量的方法,称为幂法。迭代公
21、式:结果可取 四、主要仪器设备Vc+ 9.0 C-free CodeBlocks五、结构程序设计源代码: #include#include#define N 3#define eps 1e-6#define KM 30float MaxValue(float x,int n) float Max=x0; int i; for (i=1;ifabs(Max)Max=xi; return Max; void PowerMethod(float *A) float UN,VN,r1,r2,temp; int i,j,k=0; while(kKM) k+; for(i=0;iN;i+) temp=0;
22、 for(j=0;jN;j+)temp+=*(A+i*N+j)*Uj; Vi=temp; for(i=0;iN;i+)Ui=Vi/MaxValue(V,N); if(k=1)r1=MaxValue(V,N); else r2=MaxValue(V,N); if(fabs(r2-r1)eps)break; r1=r2; printf(r=%fn,r2); for(i=0;iN;i+)printf(y%d=%fn,i+1,Ui);void main() float ANN=2,-1,0,-1,2,-1,0,-1,2 ;float UN; /A的值 U0=1; U1=1; U2=1;/x0的值 Po
23、werMethod(A0);六、结果讨论和分析分析讨论由于该程序将A矩阵和x0的值编写在程序中,所以要想修改成其他矩阵时比较麻烦,所以也有一定的局限性。 幂法是一种求任意矩阵A的按模最大特征值及其对应特征向量的迭代算法。该方法的最大优点是计算简单,容易在计算机上实现,对稀疏矩阵较为适合,但有时收敛速度很慢。流程图:实验地点综合楼五层506室指导教师王峥太原理工大学学生实验报告学院名称计算机科学与技术专业班级计科 1002学号2010001414学生姓名 xxx实验日期2012.6.10成绩课程名称计算数值方法实验题目 实验五 代数插值一、课题名称(使用拉格朗日插值法或牛顿插值法求解:已知f(x)在6个点的函数值如下表所示,运用插值方法,求f(0.596)的近似值。x0.400.550.650.800.901.05f(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) 为以