写一个c语言代码 应用共轭梯度法的最小二乘思想求解线性方程组
时间: 2024-05-03 18:19:11 浏览: 121
以下是使用共轭梯度法求解线性方程组的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_ITER 1000 //最大迭代次数
#define EPSILON 1e-10 //收敛精度
int main()
{
int n = 3; //线性方程组中未知量个数
double A[3][3] = {{4, -1, 0}, {-1, 4, -1}, {0, -1, 4}}; //系数矩阵
double b[3] = {5, 5, 5}; //常数项向量
double x[3] = {0}; //解向量
double r[3] = {0}; //残量向量
double p[3] = {0}; //共轭方向向量
double alpha, beta; //步长系数
double rsold, rsnew; //残量平方和
int iter = 0; //迭代次数
//初始化解向量和残量向量
for(int i=0; i<n; ++i){
x[i] = b[i]/A[i][i];
r[i] = b[i] - A[i][i]*x[i];
p[i] = r[i];
}
rsold = 0.0;
for(int i=0; i<n; ++i){
rsold += r[i]*r[i];
}
while(iter < MAX_ITER){
iter++;
double Ap[3] = {0}; //A*p向量
for(int i=0; i<n; ++i){
for(int j=0; j<n; ++j){
Ap[i] += A[i][j] * p[j];
}
}
double alpha_den = 0.0;
for(int i=0; i<n; ++i){
alpha_den += p[i]*Ap[i];
}
alpha = rsold/alpha_den;
for(int i=0; i<n; ++i){
x[i] = x[i] + alpha*p[i];
r[i] = r[i] - alpha*Ap[i];
}
rsnew = 0.0;
for(int i=0; i<n; ++i){
rsnew += r[i]*r[i];
}
if(sqrt(rsnew) < EPSILON){
break;
}
beta = rsnew/rsold;
for(int i=0; i<n; ++i){
p[i] = r[i] + beta*p[i];
}
rsold = rsnew;
}
//输出结果
printf("Solution:\n");
for(int i=0; i<n; ++i){
printf("%lf\n", x[i]);
}
return 0;
}
```
该代码可以求解形如Ax=b的线性方程组,其中A是一个n×n的系数矩阵,b是一个n维常数项向量,x是一个n维解向量。共轭梯度法是一种迭代方法,可以在相对较少的迭代次数下得到较为精确的解。
阅读全文