C++课程设计高斯消元法求线性代数方程组的解

合集下载

C++实验报告高斯消元法

C++实验报告高斯消元法

高斯肖元法C++上机实验报告学生姓名: 学 号: 专业班级: 实验类型: 综合一 实验项目名称全选主元高斯消去法解线性方程组 二 实验原理设有n 元线性方程组(考虑便于C++程序数组表示,方程的下标从0开始),0000110,1100000110,111101,111,111n n n n n n n n n n a x a x a x b a x a x a x b a x a x a x b ---------+++=⎧⎪+++=⎪⎨⎪⎪+++=⎩写为矩阵形式为Ax=b,其中A 为线性方程组的系数矩阵,x 为列向量,是方程组的解,b 也是列向量.一般来讲,可以假定矩阵A 是非奇异阵。

(n 阶矩阵A 的行列式不为零,即 |A|≠0,则称A 为非奇异矩阵)00010,10111,1,01,11,1n n n n n n a a a a a a A a a a ----⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦,011n x x x x -⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦ ,011n b b b b -⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦将系数矩阵A 和向量b 放在一起,形成增广矩阵B :00010,010111,11,01,11,11(,)n n n n n n n a a a b a a a b b A b a a a b -----⎡⎤⎢⎥⎢⎥==⎢⎥⎢⎥⎣⎦全选主元消去就在矩阵B 上进行,整个过程分为如下两个步骤: 第一步:消去过程。

对于k 从0开始到n-2结束,进行以下三步。

1. 首先,从系数矩阵A 的k 行k 列开始的子矩阵中选取绝对值最大的元素作为主元素。

例如:11,max 0i j ij k i n k j na a ≤<≤<=≠然后交换B的第k行与第1i行,第k列与第1k列,这样,这个子矩阵中具有最大绝对值的元素被交换到k行k列的位置上.2.其次,进行归一化计算。

计算方法为:/,1,,1/kj kj kkk k kka a a j k nb b a==+-⎧⎪⎨=⎪⎩3.最后进行消去计算:,,1,,1,1,,1 ij ij ik kji i ik ka a a a j i k nb b a b i k n=-=+-⎧⎪⎨=-=+-⎪⎩第二步,回带过程:111,111/,2,,1,0 n n n nni i ij jj ix b ax b a x i n-----=+=⎧⎪⎨=-=-⎪⎩∑三代码的实现整个程序分为5个独立文件,Matrix.h文件中包括矩阵类Matrix的定义,Matrix.cpp文件中包括该类成员函数的实现,LinearEqu.h文件中包括线性方程组类LinearEqu的定义,LinearEqu.cpp文件中包括该类的成员函数实现文件;7-9.cpp文件包括程序的主函数,主函数中定义了一个类LinearEqu的对象,通过这个对象求解一个四元线性方程组。

高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)精品资料

高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)精品资料
高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)
//Gauss消去法解线性方程组
//参考教材《计算方法教程》第二版,西安交通大学出版社
#include<stdio.h>
int main(void)
{
float A[7][7]={{3,-5,6,4,-2,-3,8},
{1,1,-9,15,1,-9 ,2},
for(k=0;k<size-1;k++)
{
max=fabs(A[k][k]);
col=k;
//查找最大元素所在的行
for(i=k;i<size;i++)
{
if(max<fabs(A[i][k]))
{
max=fabs(A[i][k]);
col=i;
}
}
printf("col:%d\n",col);
for(j=k;j<size;j++)
printf("\n\n");
//消去过程
for(k=0;k<size-1;k++)
{
if(!A[k][k])
return -1;
for(i=k+1;i<size;i++)
{
Aik=A[i][k]/A[k][k];
for(j=k;j<size;j++)
{
A[i][j]=A[i][j]-Aik*A[k][j];
{
A[i][j]=A[i][j]-Aik*A[k][j];
}
b[i]=b[i]-Aik*b[k];
}

高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)

高斯消去法和列主元高斯消去法解线性方程组的程序(C语言)

//Gauss消去法解线性方程组//参考教材《计算方法教程》第二版,西安交通大学出版社#include<stdio.h>int main(void){float A[7][7]={{3,-5,6,4,-2,-3,8},{1,1,-9,15,1,-9 ,2},{2,-1,7,5,-1,6,11},{-1,1,3,2,7,-1,-2},{4,3,1,-7,2,1,1},{2,9,-8,11,-1,-4,-1},{7,2,-1, 2,7,-1,9}};float b[7]={11,2,29,9,5,8,25};float x[7]={0};float Aik,S;int i,j,k;int size=7;printf("A[][]\n");for(i=0;i<size;i++){for(j=0;j<size;j++)printf("%f ",A[i][j]);printf("\n");}printf("b[]\n");for(i=0;i<size;i++)printf("%f ",b[i]);printf("\n\n");//消去过程for(k=0;k<size-1;k++){if(!A[k][k])return -1;for(i=k+1;i<size;i++){Aik=A[i][k]/A[k][k];for(j=k;j<size;j++){A[i][j]=A[i][j]-Aik*A[k][j];}b[i]=b[i]-Aik*b[k];}}//消去的结果printf("A[]\n");for(i=0;i<size;i++){for(j=0;j<size;j++)printf("%f ",A[i][j]);printf("\n");}printf("b[]\n");for(i=0;i<size;i++)printf("%f ",b[i]);printf("\n\n");//回代过程x[size-1]=b[size-1]/A[size-1][size-1];for(k=size-2;k>=0;k--){S=b[k];for(j=k+1;j<size;j++){S=S-A[k][j]*x[j];}x[k]=S/A[k][k];}//solutionprintf("The solution x[]=\n");for(i=0;i<size;i++)printf("%f ",x[i]);return 0;}/列主元Gauss消去法解线性方程组//参考教材《计算方法教程》第二版,西安交通大学出版社#include<stdio.h>#include<math.h>int main(void){float A[7][7]={{3,-5,6,4,-2,-3,8},{1,1,-9,15,1,-9 ,2},{2,-1,7,5,-1,6,11},{-1,1,3,2,7,-1,-2},{4,3,1,-7,2,1,1},{2,9,-8,11,-1,-4,-1},{7,2,-1, 2,7,-1,9}}; float b[7]={11,2,29,9,5,8,25};float x[7]={0};float Aik,S,temp;int i,j,k;float max;//列主元的绝对值int col;//列主元所在的行int size=7;printf("A[][]\n");for(i=0;i<size;i++){for(j=0;j<size;j++)printf("%f ",A[i][j]);printf("\n");}printf("b[]\n");for(i=0;i<size;i++)printf("%f ",b[i]);printf("\n\n");//-------消去过程---------for(k=0;k<size-1;k++){max=fabs(A[k][k]);col=k;//查找最大元素所在的行for(i=k;i<size;i++){if(max<fabs(A[i][k])){max=fabs(A[i][k]);col=i;}}printf("col:%d\n",col);for(j=k;j<size;j++){temp=A[col][j];A[col][j]=A[k][j];A[k][j]=temp;}temp=b[col];b[col]=b[k];b[k]=temp;if(!A[k][k])return -1;for(i=k+1;i<size;i++){Aik=A[i][k]/A[k][k];for(j=k;j<size;j++){A[i][j]=A[i][j]-Aik*A[k][j];}b[i]=b[i]-Aik*b[k];}}//消去的结果printf("A[]\n");for(i=0;i<size;i++){for(j=0;j<size;j++)printf("%f ",A[i][j]);printf("\n");}printf("b[]\n");for(i=0;i<size;i++)printf("%f ",b[i]);printf("\n\n");//回代过程x[size-1]=b[size-1]/A[size-1][size-1]; for(k=size-2;k>=0;k--){S=b[k];for(j=k+1;j<size;j++){S=S-A[k][j]*x[j];}x[k]=S/A[k][k];}//solutionprintf("The solution x[]=\n");for(i=0;i<size;i++)printf("%f ",x[i]);return 0;}。

高斯列主元消去法解线性方程组VC++课程设计报告

高斯列主元消去法解线性方程组VC++课程设计报告

课程设计报告一.课程设计目的:采用高斯列主元消去法解线性方程组。

用C 语言或C ++设计一个程序来通过高斯列主元消去法解线性方程组AX=b 的解。

二.课程设计的内容1. 课程设计的题目及简介题目:高斯列主元消去法解线性方程组。

简介:对线性方程组AX =b 等价于⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n n nn n n n n b b b x x x a a a a a a a a a 2121212222111211方法说明(以4阶为例):(1)第1步消元——在增广矩阵(A ,b )第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A ,b )做初等行变换使原方程组的第一列元素除了第一行的全变为0;(2)第2步消元——在增广矩阵(A ,b )中的第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A ,b )做初等行变换使原方程组转化为: ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡******00**00***0****4321x x x x 注:*代表非零的数。

(3)第3步消元——在增广矩阵(A ,b )中的第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A ,b )做初等行变换使原方程组转化为: ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡*****000**00***0****4321x x x x(4)按x4 → x3→ x2→ x1 的顺序回代求解出方程组的解。

此方法即高斯列主元消去法,若在变换的过程中没有选出绝对值最大的数放在最前面进行消元而求出未知数的方法就叫高斯消去法。

高斯消去法有一很明显的缺点,即在消元的过程中可能出现小主元,这种小主元可能导致解的不稳定,为了避免小主元的出现正是高斯列主元消去法的主要目的。

而通过每次消元之前的调换方程的次序也正是计算机实现高斯列主元消去法的关键。

高斯列主元消元法

高斯列主元消元法

b)做初等行变换使原方程组转化为:
* * * * x1 *
0
*
*
*
x2
*
0 0
0 0
* *
* *
x3 x4
* *
第三步消元——在增广矩阵(A,b)中的第三列中(从第三行开
始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,
b)做初等行变换使原方程组转化为:
* * * * x1 *
。二、程序流程图
1、程序总体结构图
图 1: 程序总体结构图
输出: 调用菜单(manu)函数显示菜单 输入:所须选择的序号.
1:输入系数
2 开始计算
3:退出
2、具体功能框图
1
xxxxxxxxxxxxxxxx
1:SWAP 函数 定义:实数 t 将 a 赋值给 t 将 b 赋值给 a 将 t 赋值给 b
2:INPUT 函数
输出:a1X1 + b1X2 + c1X3 = d1 a2X1 + b2X2 + c2X3 = d2 a3X1 + b3X2 + c3X3 = d3
输出:!!!以逗号隔开,回车结束!!!
输出:input three num for a1,a2,a3: 输入:a1,a2,a3 输出:input three num for b1,b2,b3: 输入:b1,b2,b3 输出:input three num for c1,c2,c3: 输入:c1,c2,c3 输出:input three num ford1,d2,c3: 输入:d1,d2,d3 输出:input three num for c1,c2,c3:
第一步消元——在增广矩阵(A,b)第一列中找到绝对值最大的

用列主元高斯消元法求线性代数方程组的解

用列主元高斯消元法求线性代数方程组的解

课程设计任务书前 言回顾普通解方程组的方法,一般都是先逐个削去未知变量,最终得到只有一个未知变量的方程,解之,把得到的值回代到消去变量过程中得到的方程组,逐个求出未知变量。

这种解线性方程组的基本方法就是这里要介绍的高斯消去法。

数学上,高斯消元法(或译:高斯消去法),是线性代数中的一个算法,可用来为线性方程组求解,求出矩阵的秩,以及求出可逆方阵的逆矩阵。

当用于一个矩阵时,高斯消元法会产生出一个“行梯阵式”。

高斯消元法可以用在电脑中来解决数千条等式及未知数。

高斯消元法可以用来找出一个可逆矩阵的逆矩阵。

用关联矩阵表述网络拓扑结构,并根据厂站拓扑结构和网络拓扑结构等概念简化了电力系统的拓扑结构。

根据广义乘法和广义加法的运算规则,将改进的高斯消元算法应用于电力系统拓扑结构分析中,并引入稀疏、分块处理等技术提高了上述拓扑分析的效率。

采用上述高斯消元算法对山东电网220kV 以上的变电站进行拓扑结构分析,结果表明了运用该高斯消元法进行网络拓扑分析的正确性和有效性。

用列主元素法,选取每列的绝对值最大的元素作为消去对象并作为主元素。

然后换行使之变到主元位子上,在进行消元计算。

设)()(k k b X A ,确定第k 列主元所在位置k i ,在交换k i 行和k 行后,在进行消元,并用MATLAB 软件进行求解。

目录摘要......................................................................................... 错误!未定义书签。

第1章绪论 ........................................................................... 错误!未定义书签。

第2章高斯消元法的算法描述 (2)2.1高斯消元法的原理概述 (2)2.1.1高斯消元法的消元过程 (2)2.1.2高斯消元法的回带过程 (3)2.1.3高斯消元法的复杂度分析 (4)2.2列主高斯消元法原理简介 (5)2.2.1列主高斯消元法的消元过程 (6)2.2.2列主高斯消元法的回带过程 (6)2.2.3列主高斯消元法的算法描述 (6)第3章高斯消元法的物理应用 (9)3.1电网模型的描述 (9)3.2电网模型的问题分析 (9)3.3求解计算 (11)参考文献 (13)摘 要用列主元素高斯消去法法,选取每列的绝对值最大的元素作为消去对象并作为主元素。

C++求线性代数方程组的解

C++求线性代数方程组的解

河北工业大学计算机软件技术基础(VC)课程设计报告学院电气工程学院班级电气c102 姓名刘云飞__ 学号 __105986__ 成绩 __ ____一、题目:求线性代数方程组的解(高斯消去法)二、设计思路1、总体设计1)分析程序的功能通过高斯消去法求线性代数方程组的解2)系统总体结构:设计程序的组成模块,简述各模块功能。

1.方程组的系数矩阵和常数矩阵的输入函数2.高斯消去法的算法函数(包括消元和回带)3.输出方程组的解函数2、各功能模块的设计:说明各功能模块的实现方法1.执行主函数调用输入函数,输入系数矩阵和常数矩阵2.输入后主函数调用算法矩阵进行验证解情况和消元3.消元后主函数调用回带函数计算方程组的解4.计算后主函数调用输出函数输出方程组的解3、设计中的主要困难及解决方案在这部分论述设计中遇到的主要困难及解决方案。

1)困难1实现消元的函数处理解决方案通过依次进行的各行消元实现方程组的简化2)困难2方程无解的情况解决方案检查方程组第k到第n行方程中的第k列上的元素是否为0,如是则方程组无解或得不到唯一解4、你所设计的程序最终完成的功能1)说明你编制的程序能完成的功能解决求解中小规模线性方程组(阶数不要太高,例如不超过1000)的问题2)准备的测试数据及运行结果测试数据1:方程有解的情况测试数据2:方程无解的情况三、程序清单新的高斯消去法.cpp #include<iostream.h>#include<math.h>const int s=100;void shuru(double a[s][s],double b[s],int n); //函数输入原型声明void xiaoyuan(double a[s][s],double b[s],int n); //函数消元原型声明void huidai(double a[s][s],double b[s],double x[s],int n); //函数回带原型声明void shuchu(double x[s],int n,double a[s][s]); //函数输出原型声明void main() //主函数的定义{double a[s][s],b[s],x[s]; //变量数组的定义int n;cout<<"输入方程组的阶数:\n";cin>>n;shuru(a,b,n); //调用函数输入xiaoyuan(a,b,n); //调用函数消元huidai(a,b,x,n); //调用函数回带shuchu(x,n,a); //调用函数输出}void shuru(double a[s][s],double b[s],int n) //函数输入的定义{int i,j;cout<<"输入系数矩阵:\n";i=0;while(i<n){j=0;while(j<n){cin>>a[i][j]; //输入矩阵到系数矩阵j++;}i++;}cout<<"输入常数矩阵:\n";i=0;while(i<n){cin>>b[i]; //输入矩阵到常数矩阵i++;}}void xiaoyuan(double a[s][s],double b[s],int n) //函数消元的定义{int i,j,l;double p,q,max;for(l=0;l<n-1;l++){max=fabs(a[l][l]); //调用绝对值函数,选出绝对值最大者j=l;for(i=l;i<n;i++)if(max<fabs(a[i][l])){max=fabs(a[i][l]);j=i;}for(i=l;i<n;i++) //交换系数行{p=a[l][i];a[l][i]=a[j][i];a[j][i]=p;}p=b[l]; //交换常数行b[l]=b[j];b[j]=p;for(i=l+1;i<n;i++) //消元计算{q=a[i][l]/a[l][l];for(j=l;j<n;j++)a[i][j]=double(a[i][j]-q*a[l][j]); //消元后的系数矩阵b[i]-=q*b[l]; //消元后的常数矩阵}}}void huidai(double a[s][s],double b[s],double x[s],int n) //函数回带的定义{double p;int i,j;x[n-1]=b[n-1]/a[n-1][n-1];i=n-2;while(i>=0){p=0;j=i+1;while(j<n){p+=a[i][j]*x[j];x[i]=(b[i]-p)/a[i][i];j++;}i--;}}void shuchu(double x[s],int n,double a[s][s]) //函数输出的定义{int i;if(a[n-1][n-1]==0) //方程无解的情况cout<<"方程无解!\n";else{cout<<"方程组的解是:\n";i=0;while(i<n){cout<<"x"<<i+1<<"="<<x[i]<<endl;i++;}}}四、对该设计题目有何更完善的方案1、对自己完成程序进行自我评价。

c高斯消元法解方程-课程设计报告

c高斯消元法解方程-课程设计报告

《高级语言程序设计》课程设计报告题目: 高斯消元法解方程专业: 网络工程(对口)班级: 16网工(3)姓名: 代应豪指导教师:成绩:计算机学院2017 年 4月 25 日2016-2017学年 第2学期计算机学院《高斯消元法解方程》课程设计报告目录一设计内容及要求 ............................................... 错误!未定义书签。

1.设计内容......................................................... 错误!未定义书签。

2.设计要求 (3)二概要设计 (3)三设计过程或程序代码 (8)四设计结果与分析 (12)五参考文献.......................................................... 错误!未定义书签。

41设计内容及要求1.1 设计内容:高斯消去法的解题思路:反代来求得所要的答案.矩阵的基本列运算规则为:(1)任一列均可乘以一非零的常数;(2)将任一列乘以一常数后加到其他列;(3)可任意对调任两列。

第1步消元——在增广矩阵(A,b)第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A,b)做初等行变换使原方程组转化为如下形式:第 1 页共16 页第2步消元——在增广矩阵(A,b)中的第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b)做初等行变换使原方程组转化为:第3步消元——在增广矩阵(A,b)中的第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A,b)做初等行变换使原方程组转化为:按x4 x3 x2 x1 的顺序回代求解出方程组的解按照解题的思路,整个程序大概由以下几个部分组成:输入方程组;判断用户输入的维数是否大于自定义10的维数;输入各行未知项的系数;开始反代;开始计算;退出程序。

C++ 数学与算法系列之高斯消元法求解线性方程组

C++ 数学与算法系列之高斯消元法求解线性方程组

C++ 数学与算法系列之高斯消元法求解线性方程组1. 前言什么是消元法?消元法是指将多个方程式组成的方程组中的若干个变量通过有限次地变换,消去方程式中的变量,通过简化方程式,从而获取结果的一种解题方法。

消元法主要有代入消元法、加减消元法、整体消元法、换元消元法、构造消元法、因式分解消元法、常数消元法、利用比例性质消元法等。

对方程式消元时,是基于如下的初等行变换规则:•改变方程组中方程式的顺序,或者说无论先求解方程组中哪一个方程式,不影响方程组的解。

•对一个方程式中的所有系数乘以或除以某一个非零数,不影响方程组的解。

•方程式之间可以倍乘后相加或相减,不影响解。

其中最常用的为代入消元法和加减消元法,简要介绍一下。

代入消元法如求解2x+3y=10和x+y=4; 2个方程式中的x ,y变量时。

可以把第2个方程式变换成x=4-y。

然后代入到第1个方程中,2(4-y)+3y=10。

可求解出y=2,x=2。

加减消元法还是求解如上的方程组。

可以把第2个方程式乘以2后再去减第1个方程式,或者说让第1个方程式减去第2个方程式乘以2。

2x+3y-2x-2y=10-8。

可以求解y=2。

本文主要和大家聊聊高斯消元法,高斯(Gauss)消元法也称为简单消元法,是求解一般线性方程组的经典算法。

2. 高斯消元法在理解高斯消元化之前,先理解几个基本概念:什么是增广矩阵?增广矩阵是线性代数中的概念,如下线性方程组:使用每个方程式的系数构建的矩阵,称为系数矩阵,表示为:用方程式的系数和结果构建的矩阵称为方程组的增广矩阵。

如下图所示:当方程组中的每一个方程的结果都为0时, 即b1=b2=b3=b4……bm=0,称这样的方程组为齐次线性方程组。

2.1 高斯消元法的思想高斯消元的基本思想:•对于一个有n个变量、有n个方程式的方程组。

•把方程组中除了第1个方程式外的其它方程式中的x1消去,同理,再把除了第2个方程式以下的方程组中其它方程式中的x2消去,依次类推,直到最后1个方程式中只留下xn。

高斯方法解线性方程组c程序

高斯方法解线性方程组c程序

高斯消去法和高斯主元消去法解线性方程组:高斯消元法:#include<stdio.h>#include<math.h>main(){int gauss(int n,double a[],double b[]); int i;double a[3][3]={{3,-1,4},{-1,2,-2},{2,-3,-2}}; double b[3]={7,-1,0};if(gauss(3,&a[0][0],b)!=0)for(i=0;i<=2;i++)printf("\nx[%d]=%f\n",i,b[i]);}int gauss(int n,double a[],double b[]) {int i,k,j,p,q;double d,t;for(k=0;k<=n-2;k++){d=a[k*n+k];if(d==0)return(0);for(j=k+1;j<=n-1;j++){p=k*n+j;a[p]=a[p]/d;}b[k]=b[k]/d;for(i=k+1;i<=n-1;i++){for(j=k+1;j<=n-1;j++){p=i*n+j;a[p]=a[p]-a[i*n+k]*a[k*n+j];}b[i]=b[i]-a[i*n+k]*b[k];}}d=a[(n-1)*n+n-1];if(fabs(d)+1.0==1.0){printf("fail\n");return(0);}b[n-1]=b[n-1]/d;for(k=n-2;k>=0;k--){t=0.0;for(j=k+1;j<=n-1;j++)t=t+a[k*n+j]*b[j];b[k]=b[k]-t;}return (1);}⎪⎩⎪⎨⎧=---=-+-=+-0232122743321321321x x x x x x x x x结果:x1=2,x2=1,x3=0.5高斯全选主元法:#include<stdio.h>#include<math.h>#include<stdlib.h>main(){int gauss(int n,double a[],double b[]);int i;double a[3][3]={{3,-1,4},{-1,2,-2},{2,-3,-2}}; double b[3]={7,-1,0};if(gauss(3,&a[0][0],b)!=0)for(i=0;i<=2;i++)printf("\nx[%d]=%f\n",i,b[i]);}int gauss(int n,double a[],double b[]){int *js,i,j,L,k,is,p,q;double d,t;js=malloc(n*sizeof(int));L=1;for(k=0;k<=n-2;k++){d=0.0;for(i=k;i<=n-1;i++)for(j=k;j<=n-1;j++){t=fabs(a[i*n+j]);if(t>d){d=t;is=i;js[k]=j;}}if(d+1.0==1.0)L=0;else{if(js[k]!=k)for(i=0;i<=n-1;i++){p=i*n+k;q=i*n+js[k];t=a[p];a[p]=a[q];a[q]=t;}if(is!=k){for(j=k;j<=n-1;j++){p=k*n+j;q=is*n+j;t=a[p];a[p]=a[q];a[q]=t;}t=b[k];b[k]=b[is];b[is]=t;}}if(L==0){free(js);printf("fail\n");return(0);}d=a[k*n+k];for(j=k+1;j<=n-1;j++){p=k*n+j;a[p]=a[p]/d;}b[k]=b[k]/d;for(i=k+1;i<=n-1;i++){for(j=k+1;j<=n-1;j++){p=i*n+j;a[p]=a[p]-a[i*n+k]*a[k*n+j];}b[i]=b[i]-a[i*n+k]*b[k];}}d=a[(n-1)*n+n-1];if(fabs(d)+1.0==1.0){free(js);printf("fail\n");return(0);}b[n-1]=b[n-1]/d;for(i=n-2;i>=0;i--){t=0.0;for(j=i+1;j<=n-1;j++)t=t+a[i*n+j]*b[j];b[i]=b[i]-t;}js[n-1]=n-1;for(k=n-1;k>=0;k--)if(js[k]!=k){t=b[k];b[k]=b[js[k]];b[js[k]]=t;} free(js);return(1);}结果:x1=2,x2=1,x3=0.5。

Gauss消元法解解线性方程组

Gauss消元法解解线性方程组

Gauss消元法解解线性⽅程组摘要本⽂叙述了Gauss 顺序消元法解线性⽅程的算法思想以及其求解过程,同时简要叙述了Gauss 主元素消元法以及Gauss 全主元消元法。

紧接着给出了Gauss Seidel -迭代法的算法思想,本⽂给出了这三个消元⽅法以及⼀个迭代法的算法流程图,由于全主元消元法是前两个算法的基础上改进⽽来,故本⽂采⽤第三种⽅法进⾏编程计算,前两种⽅法不再重复编程,然后给出⼀个实例的计算结果,运⾏时间,在⽂章最后分析该实例的计算结果,针对同⼀实例,⼜采⽤Gauss Seidel -⽅法编程实现,然后对结果进⾏分析和对⽐。

最后给出了本⼈在编程时遇到的⼀些问题和解决办法。

关键词:Gauss 顺序消元法 Gauss 主元素消元法 Gauss 全主元消元法⼀、算法的简要描述1.1Gauss 顺序消元法Gauss 消元法在中学⾥已经学习过,其⽅法实质,就是运⽤初等变换,将线性⽅程组Ax b =转化为同解的上三⾓矩阵⽅程组1Ux L b -=(1.1.1)其中,U 为上三⾓矩阵,L 为下三⾓矩阵。

然后对式(1.1.1)进⾏回代求解,即得⽅程组的解。

⼿算的过程是⾮常清楚的,现在需回答的是计算机求解,如何实现上述计算过程。

设线性⽅程组为1111221331121122223322112233n n n n n n n nn n na x a x a x a xb a x a x a x a x b a x a x a x a x b ++++=??++++=??++++= 写成矩阵形式为1112111212222221222m m m n n a a a x b aa a xb a a a x b=???????(1.1.2)设线性⽅程组如上式所⽰,记(1)A A =,(1)b b =,与是增⼴矩阵具有形式(1)(1)[][]A b A b =,此时⽅程组为(1)(1)A x b =。

第⼀次消元。

高斯消元法解线性方程组

高斯消元法解线性方程组

高斯消元法解线性方程组C++实验报告2015年6月一、完成人王婧婷张子承郗滢二、问题描述线性方程组问题是大学阶段经常研究的问题,为了进一步熟悉理解高斯消元法的解题思路并且掌握编程语言在数学方面的应用。

且为解决线性方程组问题提供便利,要求给出线性方程组的矩阵,能够输出线性方程组的解。

三、解决方案设计基本程序流程为:(1)输入矩阵(2)运用初等行变换将其化为阶梯型矩阵(3)调用一个函数:r()求其秩(有解时)及其无解情况实验原理为:(1)系数矩阵及其增广矩阵经过初等行变换所得到的矩阵对应的方程与原方程同解(2)化为阶梯型矩阵过程(输入增广矩阵后,运用初等行变换,使其a[i][i]以下全为零,若a[i][i]为零,运用行变换交换使其不为零)(3)输出阶梯型矩阵(4)判断解情况并输出(解情况)(5)输出解四、模块及代码组织设计其基本模块分为三大部分,7小部分。

第一部分为输入矩阵阶段,用for语句实现。

第二部分是对矩阵进行一系列的处理以求得线性方程组的解,先运用初等行变换化为阶梯型,并输出化简矩阵;然后以线性方程组的秩判断其是否有解(规定无解时秩为零)。

第三部分是输出线性方程组的解情况及其解,如果无解即输出无解。

五、关键代码(1)实现化为阶梯型的代码实现此功能的代码是整个程序的重要内容,其需要进行的初等变换以实现校园的目的,使线性方程组得到简化。

其实现如下: for( i=0; i<=n-1&&i<m; i++ ){if(a[i][i]!=0){m1=a[i][i];for( j=i+1; j<=m-1; j++){m2=a[j][i];for( k=0; k<=n; k++ ){a[j][k]=a[j][k]-a[i][k]*m2/m1;}}}else if(a[i][i]==0){for( j=i+1; j<=m-1; j++){if(a[j][i]!=0){for(k=0; k<=n; k++)//交换i,j两行使a[i][i]!=0{b=a[i][k];a[i][k]=a[j][k];a[j][k]=b;}break;}}m1=a[i][i];for( j=i+1; j<=m-1; j++){m2=a[j][i];for( k=0; k<=n; k++ ){a[j][k]=a[j][k]-a[i][k]*m2/m1;}}}}(2)求出线性方程组系数矩阵秩的代码此代码是实现判断线性方程组解情况,其代码如下:int r(int m,int n,double c[][10000]){int i,j,k,b,e=0,f,x;double temp;double m1,m2;for(i=0; i<m; i++){b=0;for(j=0; j<n; j++){b=b+c[i][j];if (b!=0 ){e++;break;}}}for(i=0; i<m; i++){b=0;f=0;for(j=0; j<n; j++){b=b+c[i][j];if(b!=0 ) f=1;}if(f== 0 && c[i][n]!=0)//若系数全为0,非齐次项不为0; {return 0;x=1;break;}}if(x!=1)return e;}(3)分情况讨论解结构无解直接输出,单一解调用函数求解,无穷多解输出基础解析,代码如下:if(ra==0)cout<<"无解"<<endl;if(ra==n)//有唯一解{cout<<"唯一解"<<endl;danjie(n,a,x);for(i=0; i<n; i++)cout<<'x'<<(i)<<'='<<(x[i])<<endl;}else if(ra<n&&ra!=0){cout<<"无穷多解"<<endl;int ra=r(m,n,a);double b[ra][n-ra+1];double xx[ra][n-ra+1];for(i=0; i<ra; i++){for(k=0; k<n-ra+1; k++){b[i][k]=a[i][k+ra];}}for(i=0; i<ra; i++)a[i][ra]=b[i][n-ra];}danjie(ra,a,x);for(i=0; i<ra; i++){xx[i][0]=x[i];}for(j=1; j<=n-ra; j++){for(i=0; i<ra; i++){a[i][ra]=0;a[i][ra]=a[i][ra]-b[i][j-1];}danjie(ra,a,x);for(i=0; i<ra; i++){xx[i][j]=x[i];}}for(i=0; i<n; i++){if(i<ra){cout<<'x'<<(i+1)<<'=';for(j=0; j<=n-ra; j++){if(j==0){if(xx[i][j])cout<<xx[i][j];}else{if(xx[i][j]>0&&(xx[i][j-1]==0))cout<<xx[i][j]<<'k'<<(j);elseif(xx[i][j]>0&&xx[i][j-1]!=0)cout<<'+'<<xx[i][j]<<'k'<<(j);else if(xx[i][j]<0)cout<<xx[i][j]<<'k'<<(j); }}}else cout<<'x'<<(i+1)<<'='<<'k'<<(i+1-ra);cout<<endl;}cout << ra << endl;}void danjie(int n,double a[][10000],double x[]) {int i,j;for (i=n-1; i>=0; i--){if(i==n-1) x[i]=a[i][n]/a[i][i];elsefor(j=n-1; j>i; j--){a[i][n]=a[i][n]-x[j]*a[i][j];}x[i]=a[i][n]/a[i][i];}}运行实例(1) 2X1-X2+3X3+2X4=63X1-3X2+3X3+2X4=53X1-X2-X3+2X4=33X1-X2+X3-X4=4唯一解X1=1,X2=1,X3=1,X4=1(2)X1+X4=40X2+X5=20X3+X6=10X1+X2+X3=45X4+X5+X6=25无穷多解X1=15+X5+X6,X2=20-X5,X3=10-X6,X4=25+X5+X6,X5=X5,X6=.(3) X1+2X2=5X1+X2=42X1+X2=3无解。

高斯消元解线性方程组(c语言)

高斯消元解线性方程组(c语言)

⾼斯消元解线性⽅程组(c语⾔)warning:有bug待修今天的线性代数课学了⾼斯消元解线性⽅程组,感觉很有意思,于是写了⼀个c语⾔⼩程序,功能如下:1.把输⼊的矩阵经过初等变换,变成⾏阶梯形矩阵2.判断⽅程组解的情况3.如果有唯⼀解,输出⽅程组的解实现的思路是枚举每⼀列,第i列从a[i+1][i]到a[m][i]依次⽤第i⾏消去。

1 #include <stdio.h>2double a[21][21], x[21];3int m, n;45void print() {6 printf("\n------->\n");7for (int i = 1; i <= m; i++) {8for (int j = 1; j <= n; j++) printf("%.2lf ", a[i][j]);9 printf("\n");10 }11 }1213void work() {14 print();15for (int j = 1; j <= n - 1; j++) { //从第⼀列到第n-1列16for (int i = j + 1; i <= m; i++) { //从第j+1⾏到第m⾏17if (a[j][i] == 0) continue;18double t = - a[i][j] / a[j][j];19for (int k = j; k <= n; k++) a[i][k] += a[j][k] * t;20 }21 print();22 }23 printf("\n----------已化为阶梯型矩阵----------\n\n");24//判断是否有解25for (int i = 1; i <= m; i++) {26int flag = 0;27for (int j = 1; j <= n - 1; j++) {28if (a[i][j] != 0) flag = 1;29 }30if (flag == 1 && a[i][n] == 0) {31 printf("⽅程组⽆解\n");32return;33 }34 }35//判断是否有⽆穷多解36if (m < n - 1) {37 printf("⽅程组有⽆穷多组解\n");38return;39 }40else for (int i = 1; i <= m; i++) {41if (a[i][i] == 0) {42 printf("⽅程组有⽆穷多组解\n");43return;44 }45 }46//求解⽅程47 printf("⽅程组有唯⼀解:\n");48for (int i = m; i >= 1; i--) {49 x[i] = a[i][n];50for (int j = i + 1; j <= n - 1; j++) x[i] -= a[i][j] * x[j];51 x[i] /= a[i][i];52 }53for (int i = 1; i <= n - 1; i++) printf("x%d = %.2lf\n", i, x[i]);54 }555657int main() {58 printf("请输⼊增⼴矩阵的⾏数和列数:\n");59 scanf("%d%d", &m, &n);60 printf("请输⼊整个增⼴矩阵:\n");61for (int i = 1; i <= m; i++)62for (int j = 1; j <= n; j++)63 scanf("%lf", &a[i][j]);64 work();65return0;66 }运⾏⽰例。

高斯消元法求解方程组c语言四元方程组

高斯消元法求解方程组c语言四元方程组

1. 引言高斯消元法是一种用于求解线性方程组的数值方法,它可以有效地解决包含多个未知数和方程的复杂问题。

在计算机科学领域中,C语言是一种常用的编程语言,因此我们可以利用C语言编写高斯消元法的程序来求解线性方程组。

本文将介绍如何使用C语言编写一个能够求解四元线性方程组的高斯消元法程序。

2. 高斯消元法的原理高斯消元法的主要思想是通过一系列的行变换将系数矩阵化为上三角阵,然后通过回代求解得到方程组的解。

具体步骤如下:1. 将系数矩阵化为增广矩阵,即将系数矩阵与常数矩阵合并成一个新的矩阵。

2. 通过一系列的行变换,将增广矩阵化为上三角阵,即使得主对角线以下的元素全部为0。

3. 通过回代求解,得到方程组的解。

3. C语言实现高斯消元法接下来,我们将介绍如何使用C语言来实现高斯消元法的程序。

我们需要定义一个函数,该函数能够将系数矩阵化为上三角阵。

我们需要定义另一个函数,用于回代求解得到方程组的解。

我们需要在主函数中调用这两个函数并输出方程组的解。

4. 定义一个函数将系数矩阵化为上三角阵在C语言中,我们可以通过定义一个二维数组来表示系数矩阵。

我们可以使用循环嵌套来进行行变换,将系数矩阵化为上三角阵。

具体的代码如下所示:```cvoid gauss_elimination(int n, float A[n][n+1]) {int i, j, k;float factor;for (i = 0; i < n-1; i++) {for (j = i+1; j < n; j++) {factor = A[j][i] / A[i][i];for (k = 0; k <= n; k++) {A[j][k] -= factor * A[i][k];}}}}```5. 定义一个函数进行回代求解回代求解是高斯消元法中的最后一步,通过一系列的代入计算,可以得到方程组的解。

具体的代码如下所示:```cvoid back_substitution(int n, float A[n][n+1], float x[n]) {int i, j;x[n-1] = A[n-1][n] / A[n-1][n-1];for (i = n-2; i >= 0; i--) {x[i] = A[i][n];for (j = i+1; j < n; j++) {x[i] -= A[i][j] * x[j];}x[i] /= A[i][i];}}```6. 在主函数中调用函数并输出结果在主函数中,我们需要定义一个系数矩阵A和一个解向量x,然后调用高斯消元法和回代求解的函数,并输出方程组的解。

C++课程设计高斯消元法求线性代数方程组的解

C++课程设计高斯消元法求线性代数方程组的解

C++课程设计高斯消元法求线性代数方程组的解第一篇:C++课程设计高斯消元法求线性代数方程组的解河北工业大学计算机软件技术基础(VC)课程设计报告学院管理班级管理104班姓名杨立宝 __ 学号 101707____ 成绩 __ ____一、题目:求线性代数方程组的解(高斯消去法)(C13)二、设计思路1、总体设计1)分析程序的功能第一:编写输入程序,通过键盘先输入对应的已知量及函数的大小n和系数a[i]和得数b[i]。

第二:编写中间程序,通过函数的调用先定义线性代数方程,然后通过程序求出方程的梯形矩阵系数,并最终得出结果。

第三编写输出程序,输出最终结果。

2)系统总体结构:设计程序的组成模块,简述各模块功能。

模块一:各函数的具体内容A:三个输入函数,分别输入n,一维数组,二维数组。

即输入已知量。

B:中间运算函数,计算是使得方程系数所成的矩阵成梯形矩阵,未知数的结果。

即计算中间变量及结果。

C:最后输出函数,输出最后计算结果。

模块二:各函数原型的声明 a写头文件。

b变量声明:存放输入数据的数组的声明,存放中间变量的数组的声明,存放运算结果的数组的声明。

分别存放对应数据。

c输入有关操作的文字d函数调用,在运算中自动调用对应的函数解决对应问题。

模块三:主函数2、各功能模块的设计:说明各功能模块的实现方法模块一:各个函数的声明,直接声明。

模块二:各函数都通过for循环来实现各个数组之间的基本运算。

3、设计中的主要困难及解决方案在这部分论述设计中遇到的主要困难及解决方案。

1)困难1 函数调用是怎么用?解决方案:仔细阅读课本,以及同学之间的讨论,和老师的帮助。

4、你所设计的程序最终完成的功能1)说明你编制的程序能完成的功能输入线性代数的系数后,运行程序即可得到梯形矩阵和结果。

2)准备的测试数据及运行结果三、程序清单如果是使用一个文件完成的程序,只需列出程序代码。

如果是使用多文件完成的程序,首先说明程序中的代码存放在哪些文件中,说明文件名(例如:本程序包含first.cpp、second.cpp、third.cpp和all.h四个文件);然后依次给出每个文件名及该文件清单,例如:#include const N= 10;//设定矩阵大小范围 /* * 使用已经求出的x,向前计算x(供getx()调用)* double a[][] 系数矩阵 * double x[] 方程组解 * int i 解的序号 * int n 矩阵大小 * return 公式中需要的和 */ double getm(double a[N][N], double x[N], int i, int n){ double m = 0;int r;for(r=i+1;rresult = double(b[n-1]/a[n-1][n-1]);else //计算其他x值(对于公式中的求和部分,需要调用getm()函数)result = double((b[i]-getm(a,x,i,n))/a[i][i]);return result;} void main(){ //double a[N][N] = {{2},{1,3,2},{1,2,2}};//double b[N] = {4,6,5};double a[N][N];//系数矩阵 double b[N];//右端项 double x[N];//方程组解 int i,j,k;int n=N;//矩阵大小/*用户手工输入矩阵*/ cout<>n;cout<>a[i][j];} cout<>b[i];} /*显示原始矩阵*/ cout</*进行高斯消去*/ for(j=0;j/*显示处理后矩阵*/ cout</*回代方式解方程组*/ for(i=n-1;i>=0;i--){ x[i] = getx(a,b,x,i,n);} /*显示方程组解*/ cout<四、对该设计题目有何更完善的方案1、对自己完成程序进行自我评价。

课程设计报告-高斯列主元消元法解线性方程组

课程设计报告-高斯列主元消元法解线性方程组

《计算机数值方法》课程设计报告题目高斯列主元消元法解线性方程组学生姓名班级学号成绩指导教师学号:姓名:题目:用高斯列主元消元法解线性方程组内容用C 语言编写软件完成以下任务:用高斯列主元消元法解下列线性方程组:⎪⎩⎪⎨⎧=++=++=++53367435522321321321x x x x x x x x x指导教师和学生签字指导教师:____ ____ 学生签名:_____ ___成绩:教师评语:目录一、程序设计题目 (1)二、需求分析(高斯列主元消元法) (1)三、程序流程图 (3)四、核心技术的实现方法及程序段 (7)五、个人总结 (9)六、参考文献 (9)七、源程序 (10)一、程序设计题目用C 语言编写软件完成以下任务:用高斯列主元消元法解下列线性方程组:⎪⎩⎪⎨⎧=++=++=++53367435522321321321x x x x x x x x x二、需求分析(高斯列主元消元法)⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡n n nn n n n n b b b x x x a a a a a a a a a 2121212222111211方法说明(以4阶为例):第1步消元——在增广矩阵(A ,b )第一列中找到绝对值最大的元素,将其所在行与第一行交换,再对(A ,b )做初等行变换使原方程组转化为如下形式:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡*******0***0***0****4321x x x x第2步消元——在增广矩阵(A ,b )中的第二列中(从第二行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A ,b )做初等行变换使原方程组转化为:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡******00**00***0****4321x x x x第3步消元——在增广矩阵(A ,b )中的第三列中(从第三行开始)找到绝对值最大的元素,将其所在行与第二行交换,再对(A ,b )做初等行变换使原方程组转化为:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⋅⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡*****000**00***0****4321x x x x按x 4 → x 3→ x 2→ x 1 的顺序回代求解出方程组的解 附:下面三种变换称为初等行变换: ① 对调两行;② 以数k ≠0乘某一行中的所有元素;③ 把某一行所有元素的k 倍加到另一行对应的元素上去。

用高斯消去法解线性方程组。C++程序及结果

用高斯消去法解线性方程组。C++程序及结果

用高斯消去法解线性方程组。

设有n元线性方程组如下:算法:对于k从0开始到n-2结束,进行以下步骤:首先,第k行第k列的数不能为0,若为0,则与下面不为0的行交换。

将k行所有数除以第k行第k列的数.其次,进行消去:a[i][j]=a[i][j]-a[i][k]*a[k][j],j,i=k+1,k+2,…,n-1b[i]=b[i]-a[i][k]*b[k],i=k+1,k+2,……,n-1最后,回代过程x[n-1]=b[n-1]/a[n-1][n-1]x[i]=b[i]-∑a[i][j]x[j],I=n-2,…1,0定义一个矩阵类Matrix作为基类,然后由矩阵类派生出线性方程组类Linequ。

程序清单:#include<iostream>#include<cmath>using namespace std;class Matrix //定义矩阵类{public:Matrix(int dims=2) //构造函数{index=dims; //保护数据赋值MatrixA=new double[index*index]; //动态内存分配}~Matrix(){delete[] MatrixA;} //内存释放void setMatrix(double *rmatr) //设置矩阵值{for(int i=0;i<index*index;i++){*(MatrixA+i)=rmatr[i]; } //矩阵成员赋初值}void printM(); //显示矩阵protected:int index;double* MatrixA;};class Linequ:public Matrix //线性方程组类{public:Linequ(int dims=2):Matrix(dims){sums=new double[dims];solu=new double[dims];}~ Linequ();void setLinequ(double*a,double*b); //方程赋值void printL(); //显示方程int Solve(); //高斯消元法求解void showX(); //输出方程的解private:double *sums;double *solu;};void Matrix::printM() //显示矩阵的元素{cout<<"The Matrix is:"<<endl;for(int i=0;i<index;i++){for(int j=0;j<index;j++)cout<<*(MatrixA+i*index+j)<<" ";cout<<endl;}}Linequ::~Linequ(){delete[]sums;delete[]solu;}void Linequ::setLinequ(double *a,double *b) //方程赋值{setMatrix(a);for(int i=0;i<index;i++)sums[i]=b[i];}void Linequ::printL() //显示方程{cout<<"The Line eqution is:"<<endl;for(int i=0;i<index;i++){for(int j=0;j<index;j++)cout<<*(MatrixA+i*index+j)<<" ";cout<<" "<<sums[i]<<endl;}}void Linequ::showX() //输出方程的解{cout<<"The Result is:"<<endl;for(int i=0;i<index;i++){cout<<"X["<<i<<"]="<<solu[i]<<endl;}}int Linequ::Solve() //解线性方程组{int l,k,i,j,is,p,q,m=0;double d,t;l=1;for(k=0;k<=index-2;k++) //消去过程{d=0.0;for(i=k;i<=index-1;i++)for(j=k;j<=index-1;j++){t=fabs(MatrixA[i*index+j]);if(t>d){d=t;is=i;}}if(d+1.0==1.0)l=0;if(l==0){cout<<"fail"<<endl;return(0);}d=MatrixA[k*index+k];if(d==0){m++;d=MatrixA[(k+m)*index+k];is=k+m;}if(is!=k){for(j=k;j<=index-1;j++){p=k*index+j;q=is*index+j;t=MatrixA[p];MatrixA[p]=MatrixA[q];MatrixA[q]=t;}t=sums[k];sums[k]=sums[is];sums[is]=t;}d=MatrixA[k*index+k];for(j=k;j<=index-1;j++){ p=k*index+j;MatrixA[p]=MatrixA[p]/d;}sums[k]=sums[k]/d;for(i=k+1;i<=index-1;i++){for(j=k+1;j<=index-1;j++){p=i*index+j;MatrixA[p]=MatrixA[p]-MatrixA[i*index+k]*MatrixA[k*index+j];}sums[i]=sums[i]-MatrixA[i*index+k]*sums[k];}}d=MatrixA[(index-1)*index+index-1];if(fabs(d)+1.0==1.0){cout<<"fail"<<endl;return(0);}solu[index-1]=sums[index-1]/d; //回代过程for(i=index-2;i>=0;i--){t=0.0;for(j=i+1;j<=index-1;j++)t=t+MatrixA[i*index+j]*solu[j];solu[i]=sums[i]-t;}}int main() //主函数{double a[]={2,-0.5,-0.5,0, -0.5,2,0,-0.5, -0.5,0,2,-0.5, 0,-0.5,-0.5,2};double b[4]={0,3,3,0};Linequ equl(4);equl.setLinequ(a,b);equl.printL();if(equl.Solve())equl.showX();elsecout<<"Fail"<<endl;return 0;}运行结果:。

高斯消元法解线性方程组(C++实现)

高斯消元法解线性方程组(C++实现)

高斯消元法解线性方程组(C++实现)最近在学数值分析,正好学到求解线性方程组。

就自己动手简单实现了一下。

关于本算法的原理可以在《数值分析》第5版(李庆扬编),对应于该书的P145页,详细讲解了公式。

因本人时间有限,暂时不详细编辑公式,等空闲了再来重新补充。

简要的说明下该算法的应用吧,高斯消元法在线性代数那门课肯定学过了,对于一般简单的3、4阶线性方程组,还可以进行纸上的笔运算,但是当数目过多,算起来就比较吃力了,所以借助于计算机实现。

如果很多的数学软件里都有矩阵的求解的函数,如mathematic 和matlab,因本人对这些软件不熟悉,所以也没去去尝试使用。

对于非奇异矩阵并且主对角线上的元素不为0。

就可以用高斯消元法来求解。

我直接用简单的C++编程方式,有点类C风格,并没有运用C++的奇淫技巧,由于本人技术不成熟,时间有限,就暂时用简单的实现。

等空闲了,一定把奇淫技巧运用上去。

先贴代码吧!#include<iostream>using namespace std;const int n = 3;void gaussin(double a[n][n], double b[n]){//判断能否用高斯消元法,如果矩阵主对角线上有0元素存在是不能用的for (int i = 0; i < n; i++)if (a[i][i] == 0){cout << "can't use gaussin meathod" << endl;return;}int i, j, k;double c[n]; //存储初等行变换的系数,用于行的相减//消元的整个过程如下,总共n-1次消元过程。

for (k = 0; k < n - 1; k++){//求出第K次初等行变换的系数for (i = k + 1; i < n; i++)c[i] = a[i][k] / a[k][k];//第K次的消元计算for (i = k + 1; i < n; i++){for (j = 0; j < n; j++){a[i][j] = a[i][j] - c[i] * a[k][j];}b[i] = b[i] - c[i] * b[k];}}//解的存储数组double x[n];//先计算出最后一个未知数;x[n - 1] = b[n - 1] / a[n - 1][n - 1];//求出每个未知数的值for (i = n - 2; i >= 0; i--){double sum = 0;for (j = i + 1; j < n; j++){sum += a[i][j] * x[j];}x[i] = (b[i] - sum) / a[i][i];}cout << " the solution of the equations is:" << endl;cout << endl;for (i = 0; i < n; i++)cout <<"x"<<i+1<<"="<< x[i] << endl;}1. 我们进行判断主对角线元素是否有0值,如果有0值就不能用这个方法了。

用高斯消元法求解线性代数方程组

用高斯消元法求解线性代数方程组

用高斯消元法求解线性代数方程组12341115-413-2823113-21041513-21719x x x x ⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦ 1111X *⎡⎤⎢⎥⎢⎥=⎢⎥⎢⎥⎣⎦(X*是方程组的精确解)1 高斯消去法1.1 基本思想及计算过程高斯(Gauss )消去法是解线性方程组最常用的方法之一,它的基本思想是通过逐步消元,把方程组化为系数矩阵为三角形矩阵的同解方程组,然后用回代法解此三角形方程组得原方程组的解。

为便于叙述,先以一个三阶线性方程组为例来说明高斯消去法的基本思想。

⎪⎩⎪⎨⎧=++II =++I =++III)(323034)(5253)(6432321321321x x x x x x x x x 把方程(I )乘(23-)后加到方程(II )上去,把方程(I )乘(24-)后加到方程(III )上去,即可消去方程(II )、(III )中的x 1,得同解方程组⎪⎩⎪⎨⎧=+-II -=-I =++III)(20223)(445.0)(64323232321x x x x x x x将方程(II )乘(5.03)后加于方程(III ),得同解方程组: ⎪⎩⎪⎨⎧-=-II -=-I =++III)(42)(445.0)(6432332321x x x x x x由回代公式(3.5)得x 3 = 2,x 2 = 8,x 1 = -13。

下面考察一般形式的线性方程组的解法,为叙述问题方便,将b i 写成a i , n +1,i = 1, 2,…,n 。

⎪⎪⎩⎪⎪⎨⎧=++++=++++=+++++++1,3322111,223232221211,11313212111n n n nn n n n n n n n n n a x a x a x a x a a x a x a x a x a a x a x a x a x a(1-1)如果a 11 ≠ 0,将第一个方程中x 1的系数化为1,得)1(1,1)1(12)1(121+=+++n n n a x a x a x其中)0(11)0()1(1aa aijj=, j = 1, …, n + 1(记ij ij a a =)0(,i = 1, 2, …, n ; j = 1, 2, …, n + 1)从其它n –1个方程中消x 1,使它变成如下形式⎪⎪⎩⎪⎪⎨⎧=++=++=++++++)1(1,)1(2)1(2)1(1,2)1(22)1(22)1(1,1)1(12)1(121n n n nn n n n n n n n a x a x a a x a x a a x a x a x(1-2)其中n i a m a aij i ij ij ,,2)1(1)1( =⋅-=,1,,3,211)1(11+==n j a a m i i由方程(1-1)到(1-2)的过程中,元素11a 起着重要的作用,特别地,把11a 称为主元素。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

河北工业大学计算机软件技术基础(VC)课程设计报告
学院管理班级管理104班姓名杨立宝 __
学号 101707____ 成绩 __ ____
一、题目:
求线性代数方程组的解(高斯消去法)(C13)
二、设计思路
1、总体设计
1)分析程序的功能
第一:编写输入程序,通过键盘先输入对应的已知量及函数的大小n和系数a[i]和得数b[i]。

第二:编写中间程序,通过函数的调用先定义线性代数方程,然后通过程序求出方程的梯形矩阵系数,并最终得出结果。

第三编写输出程序,输出最终结果。

2)系统总体结构:设计程序的组成模块,简述各模块功能。

模块一:各函数的具体内容
A:三个输入函数,分别输入n,一维数组,二维数组。

即输入已知量。

B:中间运算函数,计算是使得方程系数所成的矩阵成梯形矩阵,未知数的结果。

即计算中间变量及结果。

C:最后输出函数,输出最后计算结果。

模块二:各函数原型的声明
a写头文件。

b变量声明:存放输入数据的数组的声明,存放中间变量的数组的声明,存放运算结果的数组的声明。

分别存放对应数据。

c输入有关操作的文字
d函数调用,在运算中自动调用对应的函数解决对应问题。

模块三:主函数
2、各功能模块的设计:说明各功能模块的实现方法
模块一:各个函数的声明,直接声明。

模块二:各函数都通过for循环来实现各个数组之间的基本运算。

3、设计中的主要困难及解决方案
在这部分论述设计中遇到的主要困难及解决方案。

1)困难1
函数调用是怎么用?
解决方案:
仔细阅读课本,以及同学之间的讨论,和老师的帮助。

4、你所设计的程序最终完成的功能
1)说明你编制的程序能完成的功能
输入线性代数的系数后,运行程序即可得到梯形矩阵和结果。

2)准备的测试数据及运行结果
三、程序清单
如果是使用一个文件完成的程序,只需列出程序代码。

如果是使用多文件完成的程序,首先说明程序中的代码存放在哪些文件中,说明文件名(例如:本程序包含first.cpp、second.cpp、third.cpp和all.h四个文件);然后依次给出每个文件名及该文件清单,例如:
#include <iostream.h>
const N= 10 ;//设定矩阵大小范围
/*
* 使用已经求出的x,向前计算x(供getx()调用)
* double a[][] 系数矩阵
* double x[] 方程组解
* int i 解的序号
* int n 矩阵大小
* return 公式中需要的和
*/
double getm(double a[N][N], double x[N], int i, int n)
{
double m = 0;
int r;
for(r=i+1; r<n; r++)
{
m += a[i][r] * x[r];
}
return m;
}
/*
* 解方程组,计算x
* double a[][] 系数矩阵
* double b[] 右端项
* double x[] 方程组解
* int i 解的序号
* int n 矩阵大小
* return 方程组的第i个解
*/
double getx(double a[N][N], double b[N], double x[N], int i, int n) {
double result;
if(i==n-1) //计算最后一个x的值
result = double(b[n-1]/a[n-1][n-1]);
else //计算其他x值(对于公式中的求和部分,需要调用getm()函数) result = double((b[i]-getm(a,x,i,n))/a[i][i]);
return result;
}
void main()
{
//double a[N][N] = {{2},{1,3,2},{1,2,2}};
//double b[N] = {4,6,5};
double a[N][N]; //系数矩阵
double b[N]; //右端项
double x[N]; //方程组解
int i,j,k;
int n=N; //矩阵大小
/*用户手工输入矩阵*/
cout<<"请输入系数矩阵的大小:"; cin>>n;
cout<<"请连续输入矩阵值:";
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
cin>>a[i][j];
}
cout<<"请输入右端项:";
for(i=0; i<n; i++)
{
cin>>b[i];
}
/*显示原始矩阵*/
cout<<"\n原始矩阵\n";
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
cout<<a[i][j]<<"\t";
cout<<"\t\t"<<b[i]<<"\n"; }
cout<<"\n\n";
/*进行高斯消去*/
for(j=0; j<n-1; j++)
{
for(i=j+1; i<n; i++)
{
double m = (double)(a[i][j]/a[j][j]); for(k=j; k<n; k++)
{
a[i][k] = a[i][k]-m*a[j][k];
}
b[i] = b[i]-m*b[j];
}
}
/*显示处理后矩阵*/
cout<<"高斯消去后矩阵\n";
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
cout<<a[i][j]<<"\t";
cout<<"\t\t"<<b[i]<<"\n";
}
/*回代方式解方程组*/
for(i=n-1; i>=0; i--)
{
x[i] = getx(a,b,x,i,n);
}
/*显示方程组解*/
cout<<"\n\n方程组解\n";
for(i=0; i<n; i++)
{
cout<<"x"<<i+1<<"="<<x[i]<<"\n";
}
}
(说明:程序清单中一定要有注释。

程序清单部分的行间距设为1行即可)
四、对该设计题目有何更完善的方案
1、对自己完成程序进行自我评价。

设计过程中遇到很多问题,但经过和同学讨论,以及老师的解答和查阅资料加上我的努力最终写出了程序。

五、收获及心得体会
1、通过本次课程设计,自己在哪些方面的能力有所提高。

通过对该程序的编写,使我对数组,for循环以及函数的调用有了深刻的认识,锻炼了自己对c++更深一步的了解。

2、收获和心得体会。

明确的知道了数组,for循环以及函数的调用有的运用。

明白了编程是一种严谨的工作,锻炼了自己的思维能力,并将努力培养自己严谨的思维。

日期:2011年6月23日。

相关文档
最新文档