数值分析迭代法.docx
- 文档编号:15379856
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:11
- 大小:23.46KB
数值分析迭代法.docx
《数值分析迭代法.docx》由会员分享,可在线阅读,更多相关《数值分析迭代法.docx(11页珍藏版)》请在冰点文库上搜索。
数值分析迭代法
华北科技学院
上机报告
专业、班级
姓名
课稈名称
学号
数值分析-
卜机颍目
实验六,实验七—
仟课教师
指导教师
成绩(优、良、中、及格、不及格)
华北科技学院基础部
实验六解线性方程组的迭代法
1.目的与要求:
1)熟悉求解线性方程组的有关理论哈方法。
2)会编制雅可比迭代和高斯一塞得尔迭代法。
3)通过实际计算,进一步了解各算法的优缺点,选择合适的数值方法。
2•雅可比迭代法算法
设方程组AX=b的系数矩阵的对角元素an0(i1,2,L,n),M为迭代次数容许的最大
值,为容许误差.
①取初始向量x(x10),x20),L,xn°))T,令k=0;
②对i1,2,L,n计算
aii
n
(k1)(k)人(k1),r
③如果XiXi,则输出x,结束;否则执行④
i1
④如果kM,则不收敛,终止程序;否则kk1,转②.
2)RIV,其中
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
R
0
0
0
30
57
7
0
5
0,V
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
1.用雅可比迭代法计算:
#include"stdafx.h"
#include"iostream.h"
#include"stdio.h"
#include"math.h"
#include"conio.h"
#include"malloc.h"
#include
#defineEPS1e-8
#defineMAX100
float*Jacobi(floata[9][10],intn)
{
float*x,*y,s;
doubleepsilon;
inti,j,k=1;
x=(float*)malloc(n*sizeof(float));y=(float*)malloc(n*sizeof(float));for(i=0;i x[i]=0; while (1) {k++; epsilon=0; for(i=0;i { s=0; for(j=0;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) { returny; } for(i=0;i x[i]=y[i]; } } voidmain() { inti; floata[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.200550 x[1]=0.368393 x[2]=-0.731859 x[3]=-0.300318 x[4]=-0.446577x[5]=0.399384x[6]=0.121501x[7]=0.151792x[8]=-0.334359 Pressanykeytocontinue 2.用高斯-塞德尔迭代法: #include"stdafx.h" #include"stdio.h" #include"math.h" #include"conio.h" #include"iostream" #include"malloc.h" #defineN100 voidmain() { inti; float*x; floatc[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,intn) { inti,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++; } returnx; } 程序运行结果如下: 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.334359 Pressanykeytocontinue 实验七方程求根 1.目的与要求: 不同特点; 2)编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。 2.二分法 算法 给定区间[a,b],并设f(a)与f(b)符号相反,取为&根的容许误差,3为|f(x)|的容许误差 1令c=(a+b)/2 2如果(c-a)<&或心)|<3,则输出c,结束;否则执行③, 3如果f(a)f(c)>0,则令a: =c;否则b: =c,重复①,②,③。 3.牛顿迭代法 算法 给定初始值Xo,为根的容许误差,n为|f(x)|的容许误差,N为迭代次数的容许值。 ①如果f(X。 )0或迭代次数大于N,则算法失败,结束;否则执行②, ③若XiXo或f(Xi),则输出X! ,程序结束;否则执行④, ④XoXi,转向 (1). 实验内容: X 1.用牛顿法求方程xe1°在Xo1附近的解. #include"stdafx.h" #include #include #include #defineN100 #defineEPS1e-6 #defineETA1e-8 voidmain() { floatf(float); floatf1(float); floatx0,y0; floatNewton(float(*)(float),float(*)(float),float); printf("Pleaseinputx0\n");scanf("%f",&x0); printf("x(0)=%f\n",x0);y0=Newton(f,f1,x0); printf("\nTherootoftheequationisx=%f\n",y0); } floatNewton(float(*f)(float),float(*f1)(float),floatx0) { floatx1,d; intk=0; do {x1=x0-f(x0)/f1(x0); if((k++>N)||(fabs(f1(x1)) {printf("\nNewtonmethodfailed");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);returnx1; } floatf(floatx) { returnx*exp(x)-1; } floatf1(floatx) { returnexp(x)+x*exp(x); } 程序运行结果如下: Pleaseinputx0 1 x(0)=1.000000 x(4)=0.567143 x (1)=0.683940x (2)=0.577454x(3)=0.567230x(5)=0.567143 Therootoftheequationisx=0.567143 Pressanykeytocontinue 2.编写一个割线法的程序,求解上题。 #include"stdafx.h" #include #include #include #defineN100 #defineEPS1e-6 #defineETA1e-8 voidmain() { floatf(float); floatf1(float); floatx0,x1,y0; floatxianjie(float(*)(float),float(*)(float),float,float);printf("请输入两个初始值x0,x1(逗号隔开)\n");scanf("%f,%f",&x0,&x1); printf("x(0)=%f,x (1)=%f\n",x0,x1);y0=xianjie(f,f1,x0,x1); printf("\n方程的根为x=%f\n",y0); } floatxianjie(float(*f)(float),float(*f1)(float),floatx0,floatx1) { floatx2,d; intk=0; do { x2=x1-(x1-x0)*f(x1)/(f(x1)-f(x0));if((k++>N)||(fabs(f1(x2)) { printf("\n弦截法错误。 "); exit(0); }d=(fabs(x2)<1? x2-x1: (x2-x1)/x2); x0=x1; x1=x2; printf("x(%d)=%f,x(%d)=%f\n",k,x0,k+1,x1);}while(fabs(d)>EPS&&fabs(f(x2))>ETA); returnx2; floatf(floatx) { returnx*exp(x)-1; } floatf1(floatx) { returnexp(x)+x*exp(x); } 程序运行结果如下: 请输入两个初始值x0,x1(逗号隔开) 1,0.6 x(0)=1.000000,x (1)=0.600000 x (1)=0.600000,x (2)=0.577041 x (2)=0.577041,x(3)=0.567406 x(3)=0.567406,x(4)=0.567145 x(4)=0.567145,x(5)=0.567143 x(5)=0.567143,x(6)=0.567143 方程的根为x=0.567143 Pressanykeytocontinue
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 迭代法
![提示](https://static.bingdoc.com/images/bang_tan.gif)