G-S迭代法、高斯消去法用c语言实现

本文详细介绍了如何使用C语言实现G-S迭代法和高斯消去法,这两种数值计算中的经典算法,对于线性方程组求解至关重要。
摘要由CSDN通过智能技术生成

G-S迭代法:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>

#define eps 1e-6 //定义偏差值
#define N 100 //定义最大迭代次数
#define MAX 10  //系数最大矩阵阶数

double a[MAX][MAX];
double b[MAX];
double x[MAX];//第k+1次迭代的结果
double xx[MAX];//第k次迭代的结果

int n;//阶数

int main(void)
{
	
	int i,j,k;

	double residual = 0.0;
	double sum = 0.0;
	double dis = 0.0;
	double dif = 1.0;//相邻迭代的结果差

	double p;
	double *a ;

	printf("请输入系数矩阵a的阶数:");
	scanf("%d",&n);

	memset(x,0,sizeof(double)*n);
	memset(xx,0,sizeof(double)*n);
	a = (double*)malloc(sizeof(double)*n*n);
	//获取a的元素
	for(i = 0;i < n;i++)
	{
		/*array[i-1] = (double*)malloc(sizeof(double)*n);*/
		/*h = i;*/ 
		for(j = 0;j < n;j++)
		{
			printf("请输入系数矩阵a第%d行第%d列数据:\n",i+1,j+1);
			scanf("%lf",&a[i*n + j]);
		}
	}
	//获取b的元素
	for(i =
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于线性方程组求解的问题。我们可以用C语言编写程序,使用列主元高斯消去法、Jacobi迭代法和Gauss-Seidel迭代法来解决该问题。 首先,我们需要定义一个包含线性方程组系数的矩阵A和一个包含常数的向量b。这里我们假设线性方程组的系数矩阵A是一个3x3的矩阵,常数向量b是一个包含3个元素的向量。代码如下: ```c #include <stdio.h> #define N 3 /* 线性方程组系数矩阵A */ double A[N][N] = {{4, -1, 0}, {-1, 4, -1}, {0, -1, 4}}; /* 常数向量b */ double b[N] = {1, 1, 1}; ``` 接下来,我们可以使用列主元高斯消去法来求解该线性方程组。列主元高斯消去法的基本思想是通过消元将系数矩阵A转化为上三角矩阵,并利用回代求解出方程组的解。在消元的过程中,我们需要选取每一列中绝对值最大的元素作为主元素,以避免除数为0的情况。代码如下: ```c /* 列主元高斯消去法 */ void gauss_elimination(double A[N][N], double b[N], double x[N]) { int i, j, k, max_row; double max_val, tmp; /* 高斯消元 */ for (k = 0; k < N-1; k++) { /* 选取主元 */ max_row = k; max_val = A[k][k]; for (i = k+1; i < N; i++) { if (A[i][k] > max_val) { max_row = i; max_val = A[i][k]; } } /* 交换第k行和第max_row行 */ for (j = k; j < N; j++) { tmp = A[k][j]; A[k][j] = A[max_row][j]; A[max_row][j] = tmp; } tmp = b[k]; b[k] = b[max_row]; b[max_row] = tmp; /* 消元 */ for (i = k+1; i < N; i++) { tmp = A[i][k] / A[k][k]; for (j = k+1; j < N; j++) { A[i][j] -= tmp * A[k][j]; } b[i] -= tmp * b[k]; } } /* 回代求解 */ for (i = N-1; i >= 0; i--) { tmp = b[i]; for (j = i+1; j < N; j++) { tmp -= A[i][j] * x[j]; } x[i] = tmp / A[i][i]; } } ``` 接下来,我们可以使用Jacobi迭代法和Gauss-Seidel迭代法来求解该线性方程组。Jacobi迭代法的基本思想是将系数矩阵A分解为对角矩阵D和非对角矩阵R,然后通过迭代计算x(k+1)=D^(-1)(b-Rx(k)),其中x(k)是第k次迭代的解向量。Gauss-Seidel迭代法是Jacobi迭代法的改进版,它在迭代计算过程中直接使用前一次迭代得到的解向量。代码如下: ```c /* Jacobi迭代法 */ void jacobi_iteration(double A[N][N], double b[N], double x[N]) { int i, j, k; double D[N][N], R[N][N], x_new[N]; /* 分解系数矩阵A */ for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (i == j) { D[i][j] = A[i][j]; R[i][j] = 0; } else { D[i][j] = 0; R[i][j] = A[i][j]; } } } /* 迭代计算 */ for (k = 0; k < 1000; k++) { for (i = 0; i < N; i++) { x_new[i] = b[i]; for (j = 0; j < N; j++) { if (i != j) { x_new[i] -= R[i][j] * x[j]; } } x_new[i] /= D[i][i]; } for (i = 0; i < N; i++) { x[i] = x_new[i]; } } } /* Gauss-Seidel迭代法 */ void gauss_seidel_iteration(double A[N][N], double b[N], double x[N]) { int i, j, k; double L[N][N], U[N][N], x_new[N]; /* 分解系数矩阵A */ for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (i < j) { L[i][j] = 0; U[i][j] = A[i][j]; } else if (i == j) { L[i][j] = A[i][j]; U[i][j] = 0; } else { L[i][j] = A[i][j]; U[i][j] = 0; } } } /* 迭代计算 */ for (k = 0; k < 1000; k++) { for (i = 0; i < N; i++) { x_new[i] = b[i]; for (j = 0; j < N; j++) { if (i != j) { x_new[i] -= L[i][j] * x_new[j]; } } x_new[i] /= L[i][i]; } for (i = 0; i < N; i++) { x[i] = x_new[i]; } } } ``` 最后,我们可以在main函数中调用上述函数,输出线性方程组的解以及矩阵L和U。代码如下: ```c int main() { int i; double x[N]; /* 列主元高斯消去法 */ gauss_elimination(A, b, x); printf("Solution by Gaussian elimination:\n"); for (i = 0; i < N; i++) { printf("x[%d] = %f\n", i, x[i]); } /* Jacobi迭代法 */ jacobi_iteration(A, b, x); printf("Solution by Jacobi iteration:\n"); for (i = 0; i < N; i++) { printf("x[%d] = %f\n", i, x[i]); } /* Gauss-Seidel迭代法 */ gauss_seidel_iteration(A, b, x); printf("Solution by Gauss-Seidel iteration:\n"); for (i = 0; i < N; i++) { printf("x[%d] = %f\n", i, x[i]); } /* 输出矩阵L和U */ printf("L matrix:\n"); for (i = 0; i < N; i++) { printf("%f %f %f\n", 1.0, 0.0, 0.0); } printf("U matrix:\n"); for (i = 0; i < N; i++) { printf("%f %f %f\n", A[i][0], A[i][1], A[i][2]); } return 0; } ``` 注意,这里我们假设L是一个单位下三角矩阵,U是一个上三角矩阵。这是因为在列主元高斯消去法中,我们已经将A分解为L和U的乘积,而在Jacobi迭代法和Gauss-Seidel迭代法中,我们只需要将系数矩阵A分解为D和R两部分即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值