共轭梯度法c语言程序
时间: 2023-11-28 21:02:59 浏览: 121
共轭梯度法是一种用于求解线性方程组的迭代方法,以下是一个使用C语言实现的共轭梯度法程序:
```c
#include<stdio.h>
void conjugate_gradient(double A[], double b[], double x[], int n, int max_iter) {
double r[n], p[n], Ap[n];
double alpha, beta, residual;
// 初始化向量
for (int i = 0; i < n; i++) {
r[i] = b[i];
p[i] = r[i];
}
for (int k = 0; k < max_iter; k++) {
// 计算Ap
for (int i = 0; i < n; i++) {
Ap[i] = 0;
for (int j = 0; j < n; j++) {
Ap[i] += A[i*n+j] * p[j];
}
}
// 计算alpha和更新x
double pAp = 0, rr = 0;
for (int i = 0; i < n; i++) {
pAp += p[i] * Ap[i];
rr += r[i] * r[i];
}
alpha = rr / pAp;
for (int i = 0; i < n; i++) {
x[i] += alpha * p[i];
r[i] -= alpha * Ap[i];
}
// 计算残差,检查是否收敛
residual = 0;
for (int i = 0; i < n; i++) {
residual += r[i] * r[i];
}
if (residual < 1e-6) {
break;
}
// 计算beta和更新p
double old_rr = rr;
rr = 0;
for (int i = 0; i < n; i++) {
rr += r[i] * r[i];
}
beta = rr / old_rr;
for (int i = 0; i < n; i++) {
p[i] = r[i] + beta * p[i];
}
}
}
int main() {
double A[4] = {4, -1, -1, 3}; // 线性方程组的系数矩阵
double b[2] = {2, 3}; // 线性方程组的常数向量
double x[2] = {0, 0}; // 初始解向量
int n = 2; // 线性方程组的未知数个数
int max_iter = 10000; // 最大迭代次数
conjugate_gradient(A, b, x, n, max_iter);
printf("Solution: x = [%.2f %.2f]\n", x[0], x[1]);
return 0;
}
```
以上程序使用共轭梯度法求解了一个含有2个未知数的线性方程组,其中系数矩阵A为4 -1 -1 3,常数向量b为2 3,初始解向量x为0 0,最大迭代次数max_iter为10000。程序运行后将输出解向量x的值。
阅读全文