数值分析迭代法.docx
- 文档编号:24769790
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:14
- 大小:46.26KB
数值分析迭代法.docx
《数值分析迭代法.docx》由会员分享,可在线阅读,更多相关《数值分析迭代法.docx(14页珍藏版)》请在冰豆网上搜索。
数值分析迭代法
华北科技学院
上机报告
系(部)
专业、班级
学号
课程名称数值分析
上机题目 实验六,实验七
任课教师
指导教师
成绩(优、良、中、及格、不及格)
华北科技学院基础部
实验六解线性方程组的迭代法
1.目的与要求:
1)熟悉求解线性方程组的有关理论哈方法。
2)会编制雅可比迭代和高斯—塞得尔迭代法。
3)通过实际计算,进一步了解各算法的优缺点,选择合适的数值方法。
2.雅可比迭代法
算法
设方程组AX=b的系数矩阵的对角元素
M为迭代次数容许的最大值,
为容许误差.
1取初始向量
令k=0;
2对
计算
3如果
则输出
结束;否则执行④,
4如果
则不收敛,终止程序;否则
转②.
1.分别用雅可比迭代法与高斯-塞德尔迭代法解下列方程组:
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.446577 x[5]=0.399384 x[6]=0.121501 x[7]=0.151792 x[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.目的与要求: 1)通过对二分法与牛顿迭代法作编程练习与上机运算,进一步体会二分法与牛顿迭代法的不同特点; 2)编写割线迭代法的程序,求非线性方程的解,并与牛顿迭代法作比较。 2.二分法 算法 给定区间[a,b],并设f(a)与f(b)符号相反,取为ε根的容许误差,δ为|f(x)|的容许误差。 1令c=(a+b)/2 2如果(c-a)<ε或|f(c)|<δ,则输出c,结束;否则执行③, 3如果f(a)f(c)>0,则令a: =c;否则b: =c,重复①,②,③。 3.牛顿迭代法 算法 给定初始值 为根的容许误差,η为|f(x)|的容许误差,N为迭代次数的容许值。 ①如果 或迭代次数大于N,则算法失败,结束;否则执行②, ②计算 , ③若 或 ,则输出 ,程序结束;否则执行④, 4 ,转向 (1). 实验容: 1.用牛顿法求方程 在 附近的解. #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 (1)=0.683940x (2)=0.577454x(3)=0.567230x(4)=0.567143x(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文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 迭代法