请用c语言实现雅可比迭代
时间: 2023-10-16 15:10:07 浏览: 63
雅克比迭代法 c语言
雅可比迭代是一种用于求解线性方程组的迭代方法,其基本思想是将线性方程组的系数矩阵分解为对角矩阵和非对角矩阵的和,然后逐个求解对角线上的未知数,不断迭代直到收敛。下面是用C语言实现雅可比迭代的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_ITER 1000 // 最大迭代次数
#define EPSILON 1e-6 // 迭代收敛精度
void Jacobi(double **A, double *b, double *x, int n) {
double *x_new = (double*)malloc(sizeof(double) * n); // 存放新解向量
int iter = 0; // 迭代次数
// 迭代过程
while (iter < MAX_ITER) {
// 求解新解向量
for (int i = 0; i < n; i++) {
double sum = 0.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];
}
// 判断是否达到收敛精度
double delta = 0.0;
for (int i = 0; i < n; i++) {
delta += pow((x_new[i] - x[i]), 2);
}
if (sqrt(delta) < EPSILON) {
break;
}
// 更新解向量
for (int i = 0; i < n; i++) {
x[i] = x_new[i];
}
iter++;
}
// 输出结果
printf("Solution:\n");
for (int i = 0; i < n; i++) {
printf("x[%d] = %.4f\n", i, x[i]);
}
// 释放内存
free(x_new);
}
int main() {
// 线性方程组的系数矩阵和常数向量
double A[3][3] = {{4.0, -1.0, 0.0}, {-1.0, 4.0, -1.0}, {0.0, -1.0, 4.0}};
double b[3] = {1.0, 4.0, 1.0};
// 初始解向量
double x[3] = {0.0, 0.0, 0.0};
// 转化为动态数组
double **A_dyn = (double**)malloc(sizeof(double*) * 3);
for (int i = 0; i < 3; i++) {
A_dyn[i] = (double*)malloc(sizeof(double) * 3);
for (int j = 0; j < 3; j++) {
A_dyn[i][j] = A[i][j];
}
}
// 调用雅可比迭代函数
Jacobi(A_dyn, b, x, 3);
// 释放内存
for (int i = 0; i < 3; i++) {
free(A_dyn[i]);
}
free(A_dyn);
return 0;
}
```
阅读全文