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");
}

六.运行结果




评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值