您的位置:首页 > 编程语言 > C语言/C++

C语言实现直接法解线性方程组

2016-05-22 15:43 555 查看
首先说以下什么是直接法,以及有哪些方法属于直接法。

直接法:经过有限步运算就能求得精确解的方法。

主要包括以下四种:

Ø 顺序高斯消去法

Ø 选主元高斯消去法

Ø 高斯-约当消去法

Ø 矩阵三角分解法

这里主要阐述顺序高斯消去法接线性方程组(其他方法都是在这个的基础的稍作变化)
一.基本思想

利用线性方程组初等变换中的一种变换,即用一个不为零的数乘以一个方程加至

另一个方程,使方程组变成同解的上三角方程组,然后再自上而下对上三角方程组求解。

二.两个过程

顺序高斯消去法分为“消去”和“回代”两个过程。

三.一般求解过程

四.使用条件

因为这里涉及到对角线元素的除法,所以需要对角线上的元素全不为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");
}


六.运行结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: