在C語(yǔ)言中,使用迭代法求解方程組通常涉及以下步驟:
下面是一個(gè)簡(jiǎn)單的示例,展示了如何使用C語(yǔ)言和雅可比迭代法求解一個(gè)線性方程組:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 定義矩陣和向量的結(jié)構(gòu)體
typedef struct {
double **data;
int rows;
int cols;
} Matrix;
typedef struct {
double *data;
int size;
} Vector;
// 創(chuàng)建矩陣
Matrix createMatrix(int rows, int cols) {
Matrix matrix;
matrix.data = (double **)malloc(rows * sizeof(double *));
for (int i = 0; i < rows; i++) {
matrix.data[i] = (double *)malloc(cols * sizeof(double));
}
matrix.rows = rows;
matrix.cols = cols;
return matrix;
}
// 創(chuàng)建向量
Vector createVector(int size) {
Vector vector;
vector.data = (double *)malloc(size * sizeof(double));
vector.size = size;
return vector;
}
// 釋放矩陣內(nèi)存
void freeMatrix(Matrix matrix) {
for (int i = 0; i < matrix.rows; i++) {
free(matrix.data[i]);
}
free(matrix.data);
}
// 釋放向量?jī)?nèi)存
void freeVector(Vector vector) {
free(vector.data);
}
// 雅可比迭代法求解線性方程組
Vector jacobiIteration(Matrix A, Vector b, double epsilon) {
int maxIterations = 1000; // 最大迭代次數(shù)
int iterations = 0;
Vector x = createVector(A.cols);
for (int i = 0; i < A.cols; i++) {
x.data[i] = 0.0; // 初始化解向量
}
while (iterations < maxIterations) {
Vector x_new = createVector(A.cols);
for (int i = 0; i < A.rows; i++) {
double sum = 0.0;
for (int j = 0; j < A.cols; j++) {
if (j != i) {
sum += A.data[i][j] * x.data[j];
}
}
sum += A.data[i][i] * x_new.data[i];
x_new.data[i] = (b.data[i] - sum) / A.data[i][i];
}
// 檢查收斂性
double maxChange = 0.0;
for (int i = 0; i < A.cols; i++) {
double change = fabs(x_new.data[i] - x.data[i]);
if (change > maxChange) {
maxChange = change;
}
}
if (maxChange < epsilon) {
break; // 收斂
}
x = x_new; // 更新解向量
iterations++;
}
if (iterations == maxIterations) {
printf("Warning: Iteration did not converge within %d iterations.\n", maxIterations);
}
return x;
}
int main() {
// 定義方程組的系數(shù)矩陣和常數(shù)項(xiàng)向量
Matrix A = createMatrix(3, 3);
A.data[0][0] = 4; A.data[0][1] = -1; A.data[0][2] = 0;
A.data[1][0] = -1; A.data[1][1] = 4; A.data[1][2] = -1;
A.data[2][0] = 0; A.data[2][1] = -1; A.data[2][2] = 4;
Vector b = createVector(3);
b.data[0] = 4;
b.data[1] = 4;
b.data[2] = 4;
// 設(shè)置收斂閾值
double epsilon = 1e-6;
// 使用雅可比迭代法求解方程組
Vector x = jacobiIteration(A, b, epsilon);
// 輸出結(jié)果
printf("The solution is: ");
for (int i = 0; i < A.cols; i++) {
printf("%f ", x.data[i]);
}
printf("\n");
// 釋放內(nèi)存
freeMatrix(A);
freeVector(b);
freeVector(x);
return 0;
}
這個(gè)示例展示了如何使用C語(yǔ)言實(shí)現(xiàn)雅可比迭代法求解一個(gè)3x3線性方程組。請(qǐng)注意,這個(gè)示例僅用于演示目的,實(shí)際應(yīng)用中可能需要根據(jù)具體問(wèn)題進(jìn)行調(diào)整和優(yōu)化。