一.问题分析:高斯消去法解线性方程组主要面对的问题是矩阵的运算,所以可以定义一个矩阵类Matrix类作为基类,然后由矩阵类Matrix类派生出一个线性方程组类LinearEqu类。

二.矩阵功能分析:(1)Matrix类处理n*n的方阵,方阵用一个一维数组存放,矩阵类Matrix的数据成员包括数组的首地址和矩阵长度n,函数成员有设置矩阵的值setMatrix()和显示矩阵printMatrix()。(2)LinearEqu类除了由矩阵Matrix继承过来的存放矩阵A的成员之外,还包括存放解向量X和方程右端向量b的数组的首地址。LinearEqu类的主要操作有方程组设置setLinearEqu(),显示printLinearEqu(),求解solve()及输出方程组的解printSolution()

注:Matrix类只对矩阵进行处理,不掺杂任何方程思想,LinearEqu类利用矩阵类来求解方程

三.画出UML图

四.代码

Matrix.h文件

#ifndef _MATRIX_H_
#define _MATRIX_H_
class Matrix{
public:Matrix(int size = 2);~Matrix();void setMatrix(const double* values);//矩阵赋初值void printMatrix() const;//显示矩阵int getSize() const{ return size; }//得到矩阵大小double &element(int i, int j){ return elements[i*size + j]; }double element(int i, int j) const{ return elements[i*size + j]; }//取矩阵的第i行第j列的元素
private:int size;double* elements;//矩阵存放数组首地址
};
#endif

Matrix.cpp文件,实现Matrix.h中声明的函数

#include"Matrix.h"
#include<iostream>
using namespace std;Matrix::Matrix(int size /*= 2*/) :size(size){//Matrix类的构造函数的实现elements = new double[size*size];//动态内存分配
}Matrix::~Matrix(){//矩阵Matrix的析构函数delete[] elements;//内存释放
}void Matrix::setMatrix(const double* values){//矩阵赋初值for (int i = 0; i < size*size; i++)elements[i] = values[i];
}void Matrix::printMatrix() const{//显示矩阵cout << "The Matrix is:" << endl;for (int i = 0; i < size; i++){for (int j = 0; j < size; j++)cout << element(i, j) << " ";cout << endl;}
}

LinearEqu.h文件

#ifndef _LINEAREQU_H_
#define _LINEAREQU_H_
#include"Matrix.h"
class LinearEqu :public Matrix{
public:LinearEqu(int size = 2);~LinearEqu();void setLinearEqu(const double* a, const double* b);//方程赋值(设置线性方程组)//a表示的是系数矩阵,b表示的是右端矩阵bool solve();//全选主元高斯消去法求解方程void printLinearEqu() const;//显示方程void printSolution() const;//显示方程的解
private:double* sums;//方程右端向量double* solution;//方程的解
};
#endif

LinearEqu.cpp文件,实现LinearEqu.h中声明的函数

#include"LinearEqu.h"
#include<iostream>
#include<cmath>
using namespace std;//用size调用基类构造函数
LinearEqu::LinearEqu(int size/*=2*/) :Matrix(size) {sums = new double[size];//动态内存分配solution = new double[size];
}LinearEqu::~LinearEqu(){delete[] sums;delete[] solution;
}//设置线性方程组
void LinearEqu::setLinearEqu(const double* a, const double* b){setMatrix(a);//调用基类函数for (int i = 0; i < getSize(); i++)sums[i] = b[i];
}//显示线性方程组
void LinearEqu::printLinearEqu() const{cout << "The Line eqution is:" << endl;for (int i = 0; i < getSize(); i++){for (int j = 0; j < getSize(); j++)cout << element(i, j) << " ";cout << "     " << sums[i] << endl;}cout << endl;
}//输出方程的解
void LinearEqu::printSolution() const{cout << "The Result eqution is:" << endl;for (int i = 0; i < getSize(); i++)cout << "x[" << i << "]=" << solution[i] << endl;
}//交换两个实数
inline void swap(double &v1, double &v2){double temp = v1;v1 = v2;v2 = temp;
}bool LinearEqu::solve(){//全选主元素高斯消去法求解方程int *js = new int[getSize()];//存储主元素所在列号的数组//选主元素for (int k = 0; k < getSize()-1; k++){int is;//主元素所在行号double max = 0;//所有元素的最大值for (int i = k; i < getSize(); i++){for (int j = k; j < getSize(); j++){double t = fabs(element(i, j));if (t > max){max = t;js[k] = j;is = i;}}}if (max == 0){delete[] js;return false;}else{//通过行列交换,把主元素交换到第k行第k列上if (js[k] != k)//主元素不在第k列上,交换一列for (int i = 0; i < getSize(); i++)swap(element(i, k), element(i, js[k]));if (is != k){//主元素不在第k行上,交换一行for (int j = k; j < getSize(); j++){swap(element(is, j), element(k, j));swap(sums[k], sums[is]);}}}//消去过程double major = element(k, k);for (int j = k + 1; j < getSize(); j++)element(k, j) /= major;sums[k] /= major;for (int i = k + 1; i < getSize(); i++){for (int j = k + 1; j < getSize(); j++)element(i, j) -= element(i, k)*element(k, j);//行之间的操作sums[i] -= element(i, k)*sums[k];}}//判断剩下的一个元素是否等于0(等于0则矩阵的秩不等于矩阵的行数,则无解)double d = element(getSize() - 1, getSize() - 1);if (fabs(d) < 1e-15){delete[] js;return false;}//求出解之前验证一下最终化简结果printMatrix();cout << "Output right end matrix:" << endl;for (int i = 0; i < getSize(); i++)cout << sums[i] << " ";cout << endl << endl;//回代过程solution[getSize() - 1] = sums[getSize() - 1] / d;for (int i = getSize() - 2; i >= 0; i--){double t = 0.0;for (int j = i + 1; j <= getSize() - 1; j++)t += element(i, j)*solution[j];//实际上不是单位矩阵solution[i] = sums[i] - t;}js[getSize() - 1] = getSize() - 1;//最后一行最后一列主元素就是本列for (int k = getSize() - 1; k >= 0; k--)if (js[k] != k) swap(solution[k], solution[js[k]]);delete[] js;return true;
}

主函数文件

#include<iostream>
#include"LinearEqu.h"
using namespace std;
int main(){double a[] = {//方程系数矩阵0.2368, 0.2471, 0.2568, 1.2671,0.1968, 0.2071, 1.2168, 0.2271,0.1581, 1.1675, 0.1768, 0.1871,1.1161, 0.1254, 0.1397, 0.1490};double b[] = { 1.8471, 1.7471, 1.6471, 1.5471 };//方程右端项LinearEqu equ(4);//定义一个四元方程组对象equ.setLinearEqu(a, b);//设置方程组equ.printLinearEqu();//输出方程组if (equ.solve())equ.printSolution();elsecout << "Fail" << endl;return 0;
}

五. 结果

六,分析

其实该方法并不是我们平常手算矩阵解方程组的思路,这个是按照高斯消去法的逻辑将方程组矩阵一步步的转化,但是最后并没有转化为单位矩阵,而是转化为了逻辑上的阶梯矩阵,然后进一步求出解,图中红色即为最终化成的矩阵

高斯消去法解线性方程组C++实现相关推荐

  1. 高斯消去法解线性方程组的fortran程序实现

    高斯消去法解方程组的fortran程序实现 许多实际问题的解决,常常要化为求解线性代数方程组:例如,用最小二乘法处理测量结果和用差分法求解偏微分方程时,都会得到线性方程组:同时,很多物理学的问题最后也 ...

  2. 列主元高斯消去法解线性方程组——C语言实现

    原理 高斯消去法 的基本原理就是用初等变换将用行的,逐次消去未知数的方法,把原来的方程组,化为与其等价的上三角方程组. 设有线性方程Ax=B\boldsymbol{A}\boldsymbol{x}=\ ...

  3. matlab解方程实验,MATLAB实验一解线性方程组的直接法

    MATLAB实验一解线性方程组的直接法 实 验 报 告 课程名称 数值分析 实验项目 解线性方程组的直接法 专业班级 姓 名 学 号 指导教师 成 绩 日 期 月 日 一. 实验目的 1. 掌握程序的 ...

  4. 数值计算(一)之解线性方程组(高斯消去法,列选主元消去法,全选主元消去法,杜立特尔分解,克洛特分解,乔里斯基分解)

    解线性方程组即解一个多元一次方程组,例如 目录 消去法 分解法 消去法 原理 没有学过高级的解法也没关系,凭借我们初高中的知识足以解决这个问题 这是一个多元一次方程组,拥有n个未知量,也有n方程 我们 ...

  5. Java实现的LU分解,高斯消去法求线性方程组的解

    LU分解在本质上是高斯消元法的一种表达形式.实质上是将A通过初等行变换变成一个上三角矩阵,其变换矩阵就是一个单位下三角矩阵.这正是所谓的杜尔里特算法(Doolittle algorithm) 重点内容 ...

  6. 【数理知识】《数值分析》李庆扬老师-第5章-解线性方程组的直接方法

    第4章 回到目录 第6章 第5章-解线性方程组的直接方法 5.1 引言与预备知识 5.2 高斯消去法 5.3 矩阵三角分解法 5.4 向量和矩阵的范数 5.5 误差分析 5.1 引言与预备知识 5.2 ...

  7. matlab算线性方程解,MATLAB计算方法3解线性方程组计算解法.pptx

    第三章线性方程组数值解法解线性方程组 §3.1 直接法一. Gauss 消去法设 有消 元: 用Matlab实现顺序Gauss消去法在Matlab程序编辑器中输入:function x=nagauss ...

  8. 解线性方程组的python实现(1)——高斯主元消去法

    解线性方程组的python实现1--高斯主元消去法 1. 高斯(顺序)主元消去法 1.1 消去过程 1.2 回代过程求解 实现代码 2 列主元消去法 实现代码 3 高斯-约旦(Gauss-Jordan ...

  9. 高斯列主元消去法解线性方程组

    最近在看惯导的东西,然后想要用C++解惯导控制方程,然后就重头把C++解方程组这方面的知识回顾了一下,首先就是高斯列主元消去法,这个方法还算实用,这里以3*3的矩阵为例,里面注释很详细,各位小白可以参 ...

最新文章

  1. 启动 nginx 时报错:error while loading shared libraries:
  2. dockone上2015.08 Docker有价值文章
  3. sql-labs page2(21~38) 解题过程记录
  4. 设计模式之_动态代理_05
  5. 文本多标签分类python_Scikitlearn多标签分类
  6. 设计模式(14)-Flyweight Pattern
  7. tensorflow没有这个参数_TensorFlow入门笔记(五) : 神经网络参数与TensorFlow变量
  8. LR录制脚本后,中文显示的是乱码,怎么解决?
  9. VR定位:Outside-in与Inside-out对比
  10. Excel批量核实输入的银行卡号信息是否正确!
  11. 通达信接口服务如何委托下单?
  12. 为湖北带货,1.2亿人围观!朱广权联手李佳琦隔空直播卖出4014万
  13. 2017第二十八届国际制冷、空调、供暖、通风及食品冷冻加工展览会会刊(参展商名录)
  14. JAVA行为模式——策略模式
  15. VTD_IO-ROS(2)—发送驾驶员控制信息
  16. springboot1:项目启动
  17. 丰田生产方式的看板原理和负反馈分析
  18. 河南省“第三届金盾信安杯“部分WP
  19. Solidworks钣金展开实例设计视频教程
  20. 异地过年,我要用它看春晚!- Qt趣味开发之基于QtAV的电视播放器

热门文章

  1. oracle vm 鼠标切换,VirtualBox的Linux虚拟机文本模式和图形模式的切换问题
  2. CF1379C Choosing flowers
  3. c语言插值法编程,Lagrange插值的C语言编程.pdf
  4. 7.1 RAID(独立冗余磁盘阵列)
  5. 学大伟业 Day 1 培训总结
  6. 第七届蓝桥杯 2016年省赛真题(Java 大学C组)
  7. 斗地主洗牌发牌——排序版
  8. 一起读Apache ServiceComb
  9. 男人:别光着上身睡觉
  10. 博客内容导航——你想要的我都有!