1. 程式人生 > >C語言實現直接法解線性方程組

C語言實現直接法解線性方程組

  利用線性方程組初等變換中的一種變換,即用一個不為零的數乘以一個方程加至

另一個方程,使方程組變成同解的上三角方程組,然後再自上而下對上三角方程組求解。

二.兩個過程

順序高斯消去法分為“消去”和“回代”兩個過程。

三.一般求解過程


四.使用條件

因為這裡涉及到對角線元素的除法,所以需要對角線上的元素全不為0。這裡用一個

定理來說明:

  方程組係數矩陣的順序主子式全不為0,才能用高斯消去法實現方程組的求解。

五.程式碼實現

<span style="color:#330099;"><span style="white-space: pre;">	</span>/*
*作者:朱康
*時間:2016/5/14	16:49 
*描述:使用順序高斯消去法求線性方程組的解
*/
#include<stdio.h>
void cal_elimination(double p[][20], double *constant_vector, int n);	 //消去
void cal_substitution(double p[][20], double *constant_vector, double *matrix_result, int n); //回代
void print_elimi(double p[][20], int n);				//輸出變換後的係數矩陣
void print_const(double *constant_vector, int n);		//輸出變換後的常向量矩陣
void print_result(double *matrix_result, int n);		//輸出解
void main()
{
	double matrix_coeff[20][20]={0};		//係數矩陣
	double (*p)[20] = matrix_coeff;
	double constant_vector[20]={0};			//常向量
	double matrix_result[20]={0};
	printf("請輸入解向量的數目:\n");
	int n;
	scanf("%d", &n);
	printf("請輸入係數矩陣:\n");
	int i, j;
	for(i = 0; i < n; i++)
	{
		for(j = 0; j < n; j++)
		{
			scanf("%lf", p[i] + j);			
		}
	}
	printf("請輸入%d個常向量:\n", n);
	for(i = 0; i < n; i++)
	{
		scanf("%lf", &constant_vector[i]);
	}
	p = matrix_coeff;
	cal_elimination(p, constant_vector, n);
	print_elimi(p, n);
	print_const(constant_vector, n);
	cal_substitution(p, constant_vector, matrix_result, n);
	print_result(matrix_result, n);
}	
//void cal_elimination(int (*p)[20], int n)	//消去
void cal_elimination(double p[][20], double *constant_vector, int n)	//消去
{
	int i, j, t = 0, r = 0;
	double temp[20] = {0};
	double con_temp = 0;
	for(; r < n ; r++)
	{
		for(i = r; i < n - 1; i++)		//行座標
		{
			double k1 = -(p[i + 1][r] / p[r][r]);	//計算每次要加的值,對於係數矩陣
			double k2 = k1 * constant_vector[r];	//計算每次加到常向量上的值
			for(j = 0; j < n; j++)
			{
				temp[j] = p[r][j] * k1;
			}
			t = i + 1;
			for(j = 0; j < n; j++)
			{
				p[t][j] += temp[j];
			}
			constant_vector[t] += k2;		//計算常向量上的值
		}
	}
}
void cal_substitution(double p[][20], double *constant_vector, double *matrix_result, int n)	//回代求解
{
	int i, j;	
	matrix_result[n - 1] = constant_vector[n - 1] / p[n - 1][n - 1];
 	for(i = n - 2; i >= 0; i--)
	{
		double temp = 0; 
		for(j = i + 1; j < n; j++)
		{
			temp += p[i][j] * matrix_result[j];
		}
		matrix_result[i] = (constant_vector[i] - temp) / p[i][i];
	}
}
void print_elimi(double p[][20], int n)
{
	printf("變換後的係數矩陣:\n");
	int i, j;
	for(i = 0; i < n; i++)
	{
		for(j = 0; j < n; j++)
		{
			printf("%5.1lf", p[i][j]);
		}
		printf("\n");
	}
}
void print_const(double *constant_vector, int n)
{	
	printf("變換後的常向量矩陣:\n");
	int i;
	for(i = 0; i < n; i++)
	{
		printf("%5.1f\n", *(constant_vector + i));
	}
	printf("\n");
}
void print_result(double *matrix_result, int n)
{
	int i;
	printf("解為:\n");
	for(i = 0; i < n; i++)
	{
		printf("x%d=%4.4f\n", i, *(matrix_result + i));
	}
	printf("\n");
}