教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 实用文档 >

实验三:解线性方程组的迭代法

来源:网络收集 时间:2026-10-01
导读: 系部 学号 实验题目 数计系 专 业 姓 名 计算机科学与技术 日期 成绩 2010 年 12 月 实验三: 实验三:解线性方程组的迭代法 一.实验目的 1.熟练运用已学过的迭代法求解线性方程组, 包括雅克比迭代法、 迭代法和 SOR 迭代法。 G-S 2.加深对计算方法技巧,选

系部 学号 实验题目

数计系

专 业 姓 名

计算机科学与技术

日期 成绩

2010 年 12 月

实验三: 实验三:解线性方程组的迭代法

一.实验目的 1.熟练运用已学过的迭代法求解线性方程组, 包括雅克比迭代法、 迭代法和 SOR 迭代法。 G-S 2.加深对计算方法技巧,选择正确的计算方法来求解各种线性方程组。 3.培养使用电子计算机进行科学计算和解决问题的能力。 二.实验环境 VC++6.0 实验语言:c++ 三.实验内容 1.试用雅克比迭代法和高斯塞德尔迭代法求解如下的线性方程组,设置精度为 1.0e-6:

10 1 1 x1 6.2 1 10 2 x2 = 8.5 2 1 5 x 3.2 3 2. 用 w=1 及 w=1.25 的 SOR 方法求解如下的线性方程组, 设置精度为 0.5e-7(初值为(1,1,1))

4 3 0 x1 24 3 4 1 x2 = 30 0 1 4 x 24 3 四.实验公式 迭代法的基本思想: 根据方程组 Ax = b 设计出一个迭代公式,然后将任意选取的一初始向量 x 代公式,求出 x 序列 {x

v

v

v (0)

代入迭

v (1)

,再以 x

v (1)

代入同一迭代公式,求出 x

v (2)

,如此反复进行,得到向量

v(k )

v } .当 {x ( k ) } 收敛时,其极限即为原方程组的解。 v

1.雅克比迭代法:

v a ≠ 0(i = 1, 2,..., n) ,M 为最大迭代次数,ε 设方程组 Ax = b 的系数矩阵对角线元素 ii为容许误差. 雅可比(Jacobi)迭代法解方程组算法步骤如下: ① 取初始向量 x = ( x1 , x2 ,..., xn ) ,令 k = 0 .(0) (0) (0) T

v

② 对 i = 1, 2,..., n ,计算

xi( k +1) =

n 1 (bi ∑ aij x (jk ) ) . aii j =1 j ≠i

③ 如果

∑xi =1

n

( k +1) i

v xi( k ) < ε ,则输出 x ( k +1) ,结束;否则执行④

④ 如果 k ≥ M ,则不收敛,终止程序;否则 k ← k + 1 ,转② 2.高斯塞德尔迭代法: 在雅可比(Jacobi)迭代法中,如果当新的分量求出后,马上用它来代替旧的分量,则 可能会更快地接近方程组的准确解.基于这种设想构造的迭代公式称为高斯-塞德尔 (Gauss-Seidel)迭代法 算法可相应地从雅可比(Jacobi)迭代法改造得到。 迭代法. 迭代法 3.SOR 迭代法: 逐次超松弛(Successive Over Relaxation)迭代法,简称 SOR 迭代法,它是在 GS 法基础上 为提高收敛速度,采用加权平均而得到的新算法。

再由

与

加权平均得

这里 ω>0 称为松弛参数,将(7.3.1)代入则得

称为 SOR 迭代法,ω>0 称为松弛因子,当 ω=1 时即为 GS 法。 五、实验程序 实验程序 # include <stdio.h> # include <math.h> # include <malloc.h> include float **a,*b,*x,e,w; int n,c,k=1; /*雅可比迭代法 雅可比迭代法*/ /*雅可

比迭代法*/ void Jacobi(float y[]) { int i,j; float t=0.0,s=0.0,*x; x=(float *)malloc(sizeof(float)*(n+1)); for(i=1;i<n+1;i++) { float t=0.0; for(j=1;j<n+1;j++)

{ if(j==i) continue; t=t+a[i][j]*y[j]; t=t+a[i][j]*y[j]; } x[i]=(b[i]x[i]=(b[i]-t)/a[i][i]; } t=0.0; for(i=1;i<n+1;i++) { s=fabs(x[i]s=fabs(x[i]-y[i]); s=s*s; t+=s; } t=sqrt(t); for(i=1;i<n+1;i++) y[i]=x[i]; if(t>e) { k++; Jacobi(y); } printf("\ 实际迭代次数为%d else printf("\n 实际迭代次数为%d 次\n",k); } /*高斯-赛德尔代法 /*高斯-赛德尔代法*/ 高斯 void Gauss_Siedel(float y[]) { int i,j; float t=0.0,s=0.0,*x; x=(float *)malloc(sizeof(float)*(n+1)); for(i=1;i<n+1;i++) { t=0.0; s=0.0; for(j=1;j<i;j++) t=t+a[i][j]*x[j]; for(j=i+1;j<n+1;j++) s=s+a[i][j]*y[j];

x[i]=(b[i]- s)/a[i][i]; x[i]=(b[i]-t-s)/a[i][i]; } t=0.0; for(i=1;i<n+1;i++) { s=fabs(x[i]s=fabs(x[i]-y[i]); s=s*s; t+=s; } t=sqrt(t); for(i=1;i<n+1;i++) y[i]=x[i]; if(t>e) { k++; Gauss_Siedel(y); } printf("\ 实际迭代次数为%d else printf("\n 实际迭代次数为%d 次\n",k); } 迭代法*/ /*SOR 迭代法*/ void SOR(float y[]) { i,j; int i,j; float t=0.0,s=0.0,*x;

x=(float *)malloc(sizeof(float)*(n+1)); for(i=1;i<n+1;i++) { t=0.0; s=0.0; for(j=1;j<i;j++) t=t+a[i][j]*x[j]; for(j=i;j<n+1;j++) s=s+a[i][j]*y[j]; x[i]=y[i]+w*(b[i]x[i]=y[i]+w*(b[i]-t-s)/a[i][i]; } t=0.0;

for(i=1;i<n+1;i++) for(i=1;i<n+1;i++) { s=fabs(x[i]s=fabs(x[i]-y[i]); s=s*s; t+=s; } t=sqrt(t); for(i=1;i<n+1;i++) y[i]=x[i]; if(t>e) { k++; SOR(y); } else printf("\ 实际迭代次数为%d printf("\n 实际迭代次数为%d 次\n",k); }

void main() { int i,j,choice; printf("输入未知数个数 输入未知数个数:"); printf("输入未知数个数:"); scanf("%d",&n); **)malloc(sizeof(float)*(n+1)); a=(float **)malloc(sizeof(float)*(n+1)); for(i=0;i<n+1;i++) a[i]=(float *)malloc(sizeof(float)*(n+1)); printf("\ 输入系数: printf("\n 输入系数:\n"); for(i=1;i<n+1;i++) for(j=1;j<n+1;j++) scanf("%f",&a[i][j]); b=(float *)malloc(sizeof(float)*(n+1)); printf("\ 输入右边项: printf("\n 输入右边项:\n"); for(i=1;i<n+1;i++) scanf("%f",&b[i]); x=(float *)malloc(sizeof(float)*(n+1)); printf("\ 输入初始值: printf("\n 输入初始值:\n"); for(i=1;i<n+1;i++)

scanf("%f",&x[i]); printf("\ 输入精度: printf("\n 输入精度:\n"); scanf("%f",&e); printf("\ 输入最大迭代次数: printf("\n 输入最大迭代次数:\n"); scanf("%d",&c); printf("\ 选择迭代方式\ printf("\n\n 选择迭代方式\n\n"); printf("[1]雅可比迭代法 雅可比迭代法\ printf("[1]雅可比迭代法\n"); printf("[2]高斯-赛德尔代法\ printf("[2]高斯-赛德尔代法\n"); [2]高斯 迭代法\ printf("[3]SOR 迭代法\n"); scanf("%d",&choice); if(choice==3) { printf("\ w:\ printf("\n 输入松弛因子 w:\n"); scanf("%f",&w); SOR(x); } if(choice==1) Jacobi(x); if(choice==2) Gauss_Siedel(x); printf("\ 方程解为: printf("\n 方程解为:\n"); for(i=1;i<n+1;i++) printf("%f\ printf("%f\n",x[i]); }

六、运行结果 运行结果:

? 运行结果:? 结果

七、实验分析 实验分析 注意比较各个结果,然后写出你的想法和结论。 注意比较各个结果,然后写出你的想法和结论。

…… 此处隐藏:2099字,全部文档内容请下载后查看。喜欢就下载吧 ……
实验三:解线性方程组的迭代法.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/137405.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150份
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150份
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)