⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gsxy.c

📁 // 带有列主元的高斯消元法 // 功能: 求解线性方程组 Ax = b // 参数: A - 指向n*n系数矩阵的指针 //     b - 常数向量的指针 //     n - 方程组的维
💻 C
字号:
// 带有列主元的高斯消元法
// 功能: 求解线性方程组 Ax = b
// 参数: A - 指向n*n系数矩阵的指针
//     b - 常数向量的指针
//     n - 方程组的维数
// 返回值:0 - 如果成功。线性方程组的解保存在 b 中
//     1 - 求解失败
// ----------------------------------------------------------------------------
# include "math.h"
# include "stdio.h"
int LEquations_Gauss(double A[], double b[], int n)
{
	int i, j, k;
	double s, t;

	// 高斯列主元消元,使 Ax=b -> Ux=b'
	for(k=0; k<n; k++)
	{
		// 选取列主元素
		j = k;  t = fabs(A[k*n+k]);
		for(i=k+1; i<n; i++)
		{
			if((s = fabs(A[i*n+k])) > t)
			{
				t = s;
				j = i;
			}
		}
		if(t < 1.0e-30) return 1;	// 方程为病态,或无穷多解

		if(j != k)			// 交换方程的第 j 行和 k 行
		{
			for(i=k; i<n; i++)
			{
				t = A[j*n+i];
				A[j*n+i] = A[k*n+i];
				A[k*n+i] = t;
			}
			t = b[j];    b[j] = b[k];    b[k] = t;
		}

		t = 1.0 / A[k*n+k];		// 先将对角线元素变为 1.0
		for(i=k+1; i<n; i++) A[k*n+i] *= t;
		b[k] *= t;

		for(i=k+1; i<n; i++)		// 依次消元第k+1到n-1行的第k列元素
		{
			t = A[i*n+k];
			for(j=k+1; j<n; j++) A[i*n+j] -= A[k*n+j] * t;
			b[i] -= b[k] * t;
		}
	}

	// 回代,求解 Ux=b'
	for(i=n-2; i>=0; i--)
		for(j=i+1; j<n; j++) b[i] -= A[i*n+j] * b[j];

	return 0;
}




main()
{double A[]={1,2,1,-2,2,5,3,-2,-2,-2,3,5,1,3,2,3};
 double b[]={4,7,-1,0}; 
 int n=4,i;
  LEquations_Gauss(A,b,n);
	 for(i=0;i<4;i++)
		 printf("%f\n",b[i]);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -