用C++编制雅可比迭代法、高斯—赛德尔迭代法和超松弛迭代法解方程组Ax=b的程序。
时间: 2023-11-02 17:06:38 浏览: 136
以下是使用C语言编写的雅可比迭代法、高斯—赛德尔迭代法和超松弛迭代法解方程组Ax=b的程序。
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 3 // 矩阵维数
double A[N][N] = { { 10, -1, 2 }, { -1, 11, -1 }, { 2, -1, 10 } }; // 系数矩阵
double b[N] = { 6, 25, -11 }; // 右手边向量
double x[N] = { 0, 0, 0 }; // 初值向量
double x_new[N] = { 0, 0, 0 }; // 迭代后的向量
double omega = 1.25; // 超松弛因子
// 计算向量的二范数
double norm(double *v) {
double sum = 0;
for (int i = 0; i < N; i++) {
sum += v[i] * v[i];
}
return sqrt(sum);
}
// 使用雅可比迭代法求解方程组Ax=b
void jacobi() {
int k = 0; // 迭代次数
double epsilon = 1e-6; // 精度要求
double delta; // 误差
do {
k++;
for (int i = 0; i < N; i++) {
double sum = 0;
for (int j = 0; j < N; j++) {
if (i != j) {
sum += A[i][j] * x[j];
}
}
x_new[i] = (b[i] - sum) / A[i][i];
}
delta = norm(x_new) - norm(x);
for (int i = 0; i < N; i++) {
x[i] = x_new[i];
}
} while (fabs(delta) > epsilon);
printf("Jacobi method: x = (%lf, %lf, %lf), k = %d\n", x[0], x[1], x[2], k);
}
// 使用高斯—赛德尔迭代法求解方程组Ax=b
void gauss_seidel() {
int k = 0; // 迭代次数
double epsilon = 1e-6; // 精度要求
double delta; // 误差
do {
k++;
for (int i = 0; i < N; i++) {
double sum = 0;
for (int j = 0; j < N; j++) {
if (i != j) {
sum += A[i][j] * x_new[j];
}
}
x_new[i] = (b[i] - sum) / A[i][i];
x[i] = x_new[i];
}
delta = norm(x_new) - norm(x);
} while (fabs(delta) > epsilon);
printf("Gauss-Seidel method: x = (%lf, %lf, %lf), k = %d\n", x[0], x[1], x[2], k);
}
// 使用超松弛迭代法求解方程组Ax=b
void sor() {
int k = 0; // 迭代次数
double epsilon = 1e-6; // 精度要求
double delta; // 误差
do {
k++;
for (int i = 0; i < N; i++) {
double sum = 0;
for (int j = 0; j < N; j++) {
if (i != j) {
sum += A[i][j] * x_new[j];
}
}
x_new[i] = (1 - omega) * x[i] + omega * (b[i] - sum) / A[i][i];
}
delta = norm(x_new) - norm(x);
for (int i = 0; i < N; i++) {
x[i] = x_new[i];
}
} while (fabs(delta) > epsilon);
printf("SOR method: x = (%lf, %lf, %lf), k = %d\n", x[0], x[1], x[2], k);
}
int main() {
jacobi();
gauss_seidel();
sor();
return 0;
}
```
阅读全文