最速下降法(C语言)
先输入两个整数m和n,分别表示迭代的次数和矩阵的阶数;
接着用一行输入迭代前的初始解;
然后用n行输入线性方程组的系数矩阵A;
最后用一行输入n维右端向量b。
结果:
依次输出线性方程组的解x1,x2,...xn。
计算结果保留4位小数。
10 2 -2 -2 3 2 2 6 2 -8
#include<stdio.h> int main() { int m,n,i,j,k; double x1=0,x2=0,a1=0,x4,x3,p1,sum=0; double a[10][10]={0},x[10]={0},b[10]={0},c[10]={0},r[10]={0},y[10]={0},p[10]={0}; scanf("%d %d",&m,&n); for(i=1;i<=n;i++) { scanf("%lf",&x[i]); } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%lf",&a[i][j]); } } for(i=1;i<=n;i++) { scanf("%lf",&b[i]); } for(i=1;i<=n;i++) { sum=0; for(k=1;k<=n;k++) { sum+=a[i][k]*x[k]; } c[i]=sum; } for(i=1;i<=n;i++) { r[i]=b[i]-c[i]; } for(i=1;i<=n;i++) { p[i]=r[i]; } while(m>0) { x1=0; x2=0; a1=0; x3=0; x4=0; p1=0; for(i=1;i<=n;i++) { x1+=r[i]*p[i]; } for(i=1;i<=n;i++) { sum=0; for(k=1;k<=n;k++) { sum+=a[i][k]*p[k]; } y[i]=sum; } for(i=1;i<=n;i++) { x2+=y[i]*p[i]; } a1=x1/x2; for(i=1;i<=n;i++) { x[i]=x[i]+a1*p[i]; } for(i=1;i<=n;i++) { r[i]=r[i]-a1*y[i]; } for(i=1;i<=n;i++) { x3+=(-1)*r[i]*y[i]; x4+=p[i]*y[i]; } p1=x3/x4; for(i=1;i<=n;i++) { p[i]=r[i]+p1*p[i]; } m=m-1; } for(i=1;i<=n;i++) { printf("%.4lf ",x[i]); } return 0; }