📄 高斯消去法求线性方程组的解.txt
字号:
#include<conio.h>
#include<math.h>
#include <stdio.h>
#include <assert.h>
#define A(j,k) (*(A+(n+1)*j+k))
#define B(j,k) (*(B+n*j+k))
/*GS:高斯消去法求线性方程组的解
其中A是增广矩阵(拉成一维数组)的首地址,
如 x+2y=3
4x-5y=6
则 A={ 1,2,3, 4,-5,6};
result 存放结果,result[0]存放X0,等等
n是未知量的个数(=方程的个数)
返回值 1: 有唯一确定解,结果存于result;
0: 无解或者无穷多个解
*/
int GS(double *A, double *result , int n)
{ double t;
int i,j,k,tj;
for(k=0;k<n-1;k++)
{t=A(k,k);
tj=k;
for(j=k+1;j<n;j++) //A(j,k)=*(*(A+j)+k)
if(fabs(A(j,k))>fabs(t)){t=A(j,k);tj=j;}
//找出第k列的(绝对值)最大元素t和t的行标tj。
if(tj!=k)
{ for(i=0;i<=n;i++)
{ t=A(tj,i);A(tj,i)=A(k,i);A(k,i)=t;}
//交换tj与k行的所有对应元素
}
//保证A(k,k)为第k列的最大元素.
for(i=k+1;i<n;i++)
{ if(A(k,k)==0) return 0;
t=A(i,k)/A(k,k);//t=i/k比
for(j=k;j<n;j++) A(i,j)-=t*A(k,j);//第i行减去k行对应元素的i/k比倍
A(i,n)-=t*A(k,n);
}
}
for(i=n-1;i>=0;i--)
{ t=A(i,n);
for(j=n-1;j>i;j--) t-=A(i,j)*A(j,n);//X[j]=A(j,n);
if(A(i,i)==0) return 0;
A(i,n)=t/A(i,i);// X[i]=A(i,n);
}
for(i=0;i<n;i++)
result[i]=A(i,n);
return 1;
}
main()
{ double *A,*result;
int i,k,n,r;
double rd;
printf("Input N: ");
scanf("%d",&n);
A=new double[n*(n+1)];
result=new double[n];
assert(A&&result);
printf("Input Matrix[%d][%d] In Row Order\n",n,n+1);
for(k=0;k<n*(n+1);k++)
scanf("%lf",A+k);
r=GS(A, result, n);
if(r==0) printf("无解或者无穷多解\n");
else for(i=0;i<n;i++) printf("X%d=%.15g\n",i,result[i]);
delete[] A;
delete[] result;
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -