当前位置:文档之家› 数值分析_迭代法

数值分析_迭代法

华北科技学院上机报告系(部)专业、班级学号课程名称数值分析上机题目实验六,实验七任课教师指导教师成绩(优、良、中、及格、不及格)华北科技学院基础部实验六 解线性方程组的迭代法1.目的与要求:1) 熟悉求解线性方程组的有关理论哈方法。

2) 会编制雅可比迭代和高斯—塞得尔迭代法。

3) 通过实际计算,进一步了解各算法的优缺点,选择合适的数值方法。

2.雅可比迭代法算法设方程组AX=b 的系数矩阵的对角元素0(1,2,,),iii n a≠=M 为迭代次数容许的最大值,ε为容许误差.① 取初始向量(0)(0)(0),(,,,)12Tx x x x n =令k=0;② 对1,2,,i n =计算(1)()11();nk k ii ij j j iij ixb a x a +=≠=-∑③ 如果(1)()1,nk k iii xx ε+=-<∑则输出(1)k x+,结束;否则执行④,④ 如果,k M ≥则不收敛,终止程序;否则1,k k ←+转②.1.分别用雅可比迭代法与高斯-塞德尔迭代法解下列方程组:2),311300010000151335901100002709311000000230010793000090,00030577050200000747300012000003041007000050027270022910RI V R V =---⎡⎤⎡⎤⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥---⎢⎥⎢⎢⎥⎢==----⎢⎥⎢-⎢⎥⎢⎢⎥⎢--⎢⎥⎢--⎢⎥⎢⎢⎥⎢--⎣⎦⎣⎦其中⎥⎥⎥⎥⎥⎥⎥⎥1.用雅可比迭代法计算: #include "stdafx.h" #include "iostream.h"#include"stdio.h"#include"math.h"#include"conio.h"#include"malloc.h"#include <stdlib.h>#define EPS 1e-8#define MAX 100float *Jacobi(float a[9][10],int n) {float *x,*y,s;double epsilon;int i,j,k=1;x=(float *)malloc(n*sizeof(float));y=(float *)malloc(n*sizeof(float)); for(i=0;i<n;i++)x[i]=0;while(1){ k++;epsilon=0;for(i=0;i<n;i++){s=0;for(j=0;j<n;j++){if(j==i) continue;s=s+a[i][j]*x[j];}y[i]=(a[i][n]-s)/a[i][i];epsilon=epsilon+fabs(y[i]-x[i]);}//if (epsilon>EPS);if(k>=MAX){return y;}for(i=0;i<n;i++)x[i]=y[i];}}void main(){int i;float a[9][10]={{31,-13,0,0,0,-10,0,0,0,-15}, {-13,35,-9,0,-11,0,0,0,0,27},{0,-9,31,-10,0,0,0,0,0,-23},{0,0,-10,79,-30,0,0,0,-9,0},{0,0,0,-30,57,-7,0,-5,0,-20},{0,0,0,0,7,47,-30,0,0,12},{0,0,0,0,0,-30,41,0,0,-7},{0,0,0,0,-5,0,0,27,-2,7},{0,0,0,0,0,0,0,-2,29,-10}};float *x;x=(float *)malloc(9*sizeof(float));printf("结果为:\n");x=Jacobi(a,9);for(i=0;i<9;i++)printf("x[%d]=%f\n",i,x[i]);}程序运行结果如下:结果为:x[0]=-0.200550x[1]=0.368393x[2]=-0.731859x[3]=-0.300318x[4]=-0.446577x[5]=0.399384x[6]=0.121501x[7]=0.151792x[8]=-0.334359Press any key to continue2.用高斯-塞德尔迭代法:#include "stdafx.h"#include"stdio.h"#include"math.h"#include"conio.h"#include "iostream"#include"malloc.h"#define N 100void main(){int i;float *x;float c[90]={31,-13,0,0,0,-10,0,0,0,-15,-13,35,-9,0,-11,0,0,0,0,27,0,-9,31,-10,0,0,0,0,0,-23,0,0,-10,79,-30,0,0,0,-9,0,0,0,0,-30,57,-7,0,-5,0,-20,0,0,0,0,7,47,-30,0,0,12,0,0,0,0,0,-30,41,0,0,-7,0,0,0,0,-5,0,0,27,-2,7,0,0,0,0,0,0,0,-2,29,-10};float *GauseSeide(float *,int);x=GauseSeide(c,9);for(i=0;i<9;i++)printf("x[%d]=%f\n",i,x[i]);}float *GauseSeide(float *a,int n){int i,j,nu=0;float *x,dx,d,wucha;x=(float *)malloc(n*sizeof(float));for(i=0;i<=n-1;i++)x[i]=0.0;while(fabs(wucha)>1e-8){for(i=0;i<=n-1;i++){d=0.0;for(j=0;j<=n-1;j++)d+=*(a+i*(n+1)+j)*x[j];d=d-*(a+i*(n+1)+i)*x[i];dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));wc=x[i]-dx;x[i]=dx;}if(nu>=N) { printf("迭代发散\n"); exit(1); } nu++; } return x;}程序运行结果如下: x[0]=-0.200551 x[1]=0.368393 x[2]=-0.731860 x[3]=-0.300318 x[4]=-0.446577 x[5]=0.399384 x[6]=0.121500 x[7]=0.151792 x[8]=-0.334359Press any key to continue实验七 方程求根1.目的与要求:1) 通过对二分法与牛顿迭代法作编程练习与上机运算,进一步体会二分法与牛顿迭代法的不同特点;2) 编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。

2.二分法算法给定区间[a,b],并设f(a)与f(b)符号相反,取为ε根的容许误差,δ为|f(x)|的容许误差。

① 令c=(a+b)/2② 如果(c-a)<ε或|f(c)|<δ,则输出c ,结束;否则执行③, ③ 如果f(a)f(c)>0,则令a:=c ;否则b:=c ,重复①,②,③。

3.牛顿迭代法算法给定初始值ε,0x 为根的容许误差,η为|f(x)|的容许误差,N 为迭代次数的容许值。

①如果0)(0='x f 或迭代次数大于N ,则算法失败,结束;否则执行②,②计算)()(0001x f x f x x '-=, ③若ε<-01x x 或η<)(1x f ,则输出1x ,程序结束;否则执行④, ④ 10x x =,转向(1).实验容:1.用牛顿法求方程01=-x xe 在10=x 附近的解.#include "stdafx.h" #include <iostream> #include <stdio.h> #include <math.h> #define N 100 #define EPS 1e-6 #define ETA 1e-8void main() {float f(float); float f1(float); float x0,y0;float Newton(float (*)(float),float (*)(float),float); printf("Please input x0\n"); scanf("%f",&x0);printf("x(0)=%f\n",x0); y0=Newton(f,f1,x0);printf("\nThe root of the equation is x=%f\n",y0); }float Newton(float (*f)(float),float (*f1)(float),float x0) {float x1,d; int k=0; do {x1=x0-f(x0)/f1(x0);if((k++>N)||(fabs(f1(x1))<EPS)) {printf("\nNewton method failed");exit(0);}d=(fabs(x1)<1?x1-x0:(x1-x0)/x1);x0=x1;printf("x(%d)=%f\t",k,x0);}while(fabs(d)>EPS&&fabs(f(x1))>ETA);return x1;}float f(float x){return x*exp(x)-1;}float f1(float x){return exp(x)+x*exp(x);}程序运行结果如下:Please input x01x(0)=1.000000x(1)=0.683940 x(2)=0.577454 x(3)=0.567230 x(4)=0.567143 x(5)=0.567143The root of the equation is x=0.567143Press any key to continue2.编写一个割线法的程序,求解上题。

相关主题