数值计算雅可比迭代
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
一、 实验目的
了解并学习线性方程组的解法,运用雅可比迭代法求解给定的线性方程组。掌握如何求解线性方程组。
二、实验方法(要求用自己的语言描述算法)
雅可比迭代法:
运用雅可比迭代法求解线性方程组时,必须要考虑迭代过程的收敛性,接下来,先证明给定的线性方程组收敛:
[ 4−10−100−14−10−100−14−10−1−10−14−100−10−14−100−10−14] [ x 1x 2x 3x 4x 5x 6] =[ 05−25−26]
由上式可得雅可比迭代矩阵:
B j =[ 014014001401401400140140141401401400140140140014014
0] 可以得到:
‖B j ‖∞=max {12,34,34,34,34,12}=34
<1 故原线性方程迭代过程必收敛。
由线性方程组可以得到迭代方程如下
x 1=(x 2+x 4)∕4
x 2=(x 1+x 3+x 5+5)∕4
x 3=(x 2+x 4+x 6−2)∕4
x 4=(x 1+x 3+x 5+5)∕4
x 5=(x 2+x 4+x 6−2)∕4
x 6=(x 3+x 5+6)∕4
依次迭代,直至满足条件 ‖X (k+1)−X (k )‖2≤0.0001 结束迭代。
三、实验代码
#include
#include
#include
#include
#include
#include
using namespace std;
//雅可比迭代法
int main(){
double x[2][6] = {0};//数据标记
int time = 0;
double sum1 ;//求和计数
ofstream fout("output.txt");//打开只写文件
double number[6][7] = { 4, -1, 0, -1, 0, 0, 0, -1, 4, -1, 0, -1, 0, 5, 0, -1, 4, -1, 0, -1, -2, -1, 0, -1, 4, -1, 0, 5, 0, -1, 0, -1, 4, -1, -2, 0, 0, -1, 0, -1, 4,
6 };//存储数据
cout << "原线性方程组为:" << endl;
fout << "原线性方程组为:" << endl;
for (int i = 0; i < 6; i++){
for (int j = 0; j < 7; j++)//输出线性方程组
{
cout << ' ' << right << setw(4) << number[i][j];
fout << ' ' << right << setw(4) << number[i][j];//对齐单元格
}
cout << endl;
fout << endl;
}
while (1){
sum1 = 0;
x[1][0] = (x[0][1] + x[0][3]) / 4;
x[1][1] = (x[0][0] + x[0][2] + x[0][4] + 5) / 4;
x[1][2] = (x[0][1] + x[0][3] + x[0][5] - 2) / 4;
x[1][3] = (x[0][0] + x[0][2] + x[0][4] + 5) / 4;
x[1][4] = (x[0][1] + x[0][3] + x[0][5] - 2) / 4;
x[1][5] = (x[0][2] + x[0][4] + 6) / 4;//迭代公式
for (int i = 0; i < 6; i++){
sum1 += (x[0][i] - x[1][i])*(x[0][i] - x[1][i]);//计算求和,用于判断是否结束循环
}
time++;
for (int i = 0; i < 6; i++)
x[0][i] = x[1][i];//存储计算值
sum1 = sqrt(sum1);
fout << "第" << time << "步计算结果为:" << endl;
fout << fixed << setprecision(5) << "‖X^((k+1) )-X^((k) ) ‖_2 = " << sum1 << endl;//输出数据结果到文件
if (fabs(sum1) <= 0.0001)
break;//满足条件,退出循环
}
cout << "迭代次数为:" << time << endl;
cout << "计算结束后,获得的结果为:" << endl;
fout << "计算结束后,获得的结果为:" << endl;
for (int i = 0; i < 6; i++){
cout << fixed << setprecision(4) << 'x' << i + 1 << '=' << x[0][i] << endl;//输出数据结果到控制台
fout << fixed << setprecision(4) << 'x' << i + 1 << '=' << x[0][i] << endl;//输出数据结果到文件
}
system("pause");
}
四、实验结果及其讨论
雅可比迭代法实验结果如图3-1所示
图3-1 雅可比迭代法实验结果