• 基于QT开发的线性代数初学者的矩阵计算器设计


    资源下载地址:https://download.csdn.net/download/sheziqiong/85788074
    资源下载地址:https://download.csdn.net/download/sheziqiong/85788074
    一、 题目

    一个适用于线性代数初学者的矩阵计算器

    开发软件

    Visual Studio 2019,Qt5.14.2,Qt VS Tools (version 2.7.1)

    课题要求

    面向对象。

    单元测试。

    模型部分

    验证

    主要流程

    开发流程及算法介绍

    从 0.0 版本到 4.0 版本均为在 VS 上编写好矩阵计算器计算部分的算法。

    版本为之前写过的两个独立程序(求逆、求有唯一解的线性方程组)

    版本完成了以下部分的计算代码:

    矩阵基本运算(加、减、乘),初等行变换(交换两行,将一行乘上某个实数,将一行的几倍加到另一行上)、求行列式,求逆矩阵,求解有唯一解的线性方程组。

    补充说明:

    求行列式的方法是将其化成上三角行列式

    求逆矩阵用的方法是初等变换法(高斯消元法)

    求解有唯一解的线性方程组是将常数列矩阵左乘上系数矩阵的逆

    版本完成了以下部分的计算代码:

    求矩阵的行最简形,求矩阵的秩,求矩阵的标准形补充说明:

    求行最简形的算法:

    首先找到每行第一个不为 0 的数的下标,按每行的下标给行进行排序(下标小的在上),并将每行乘上第一个不为 0 的数的倒数,目的是化成如下图所示的形式。

    然后找到每列第一个不为 0 的数的下标定义为 start

    从第 1 行开始到矩阵的最后一行第 m 行结束(跳过 start 行),用第 start 行通过初等行变换将第 j 行第 i 列(i 为对列的循环变量)的数化为 0。重复上述操作,就将第 1 列除 start 行之外的数全部化为 0。

    而后对每一列重复上述操作,若某列全为 0 则跳过。

    第二列:

    第三列:

    第…列最终结果:

    求标准形:

    把行最简形矩阵转置后再求一次行最简形,再转置回来

    版本重载了分数的四则运算,并编写了约分函数

    版本新增功能:支持求解有无穷解的线性方程组增广矩阵及求解结果如下图所示:

    算法思路:首先求得增广矩阵的行最简形,如下图:

    由图可知,x1,x2 为非自由元,x3,x4 为自由元,在矩阵类的成员变量中将非自由元的下标和自由元的下标存放在两个数组中。

    特解为将所有自由元取 0,非自由元取 1 得到的解,即最后一列的数对应放置到解向量中的非自由元下标的位置

    而通解的解向量为将所有自由元依次取 1,未取到则为 0,非自由元取 1 得到的解。即在行最简形中将取到的自由元那一列乘上-1(移到等式右边)在将那一列的数对应放置到解向量中的非自由元下标的位置,取到的自由元下标位置放置“1”。

    从 5.0 版本到 6.0 版本均为矩阵计算器在 Qt 中的实现主界面简介

    红色框使用 tool box 控件,用于选择运算功能,各个运算功能通过 pushButton 实现选择。

    黄色框为矩阵的显示部分,使用 tabWidget 控件实现各个矩阵的切换,在 tabWidget 的每一页中使用 tableWidget 显示矩阵,最大可显示 10*10 的矩阵。

    ans 为矩阵运算的结果(除了初等行变换运算将直接改变原矩阵)蓝色框为分数形式计算和小数形式计算的选择界面,使用 radioButton 控件进行选择,在进行任何输入和计算之前需先选择计算形式。

    绿色框为行列式和秩的结果显示界面,使用 lineEdit 控件进行显示。

    黑色框为线性方程组求解结果的输出界面,使用 textEdit 控件进行显示。

    各个对话框界面采用 lineEdit 控件进行数据的输入和读取,各对话框界面分别如下:

    类的继承关系:主程序:

    基类:QMainWindow matrix_calculator

    各对话框

    基类:QDialog

    qdialog1 qdialog2 qdialog3 power qdialog4 qdialog5 qdialog6 matrix_calculator 是 qdialog1, qdialog2, qdialog3,power, qdialog4, qdialog5, qdialog6 的父类

    版本分数运算功能的实现:

    分数运算功能的实现分为三个主要部分:

    分数的输入与读取,分数运算,分数的输出

    输入形式为: 13/22 或者含有负数的 -9/4 或者只有整数算法:查找输入的 QString 中有没有”/”,如果有,利用 indexOf 函数找到”/”的下标,再利用 left,right 函数和 toInt 函数读取分子和分母。

    输出部分:

    如果分子能被分母整除,约分函数会将分母化为 1,此时直接输出分子即可。

    如果不能,构造 QString s=分子 +”/”+ 分母,输出 s。

    版本报错功能通过 QMessagebox 中的 critical 函数实现,报错框界面如下:

    样例测试

    矩阵加法、减法、乘法样例:用于运算的矩阵:

    运算结果:

    加法:

    减法:

    乘法:

    转置:(矩阵 1 的转置)次方:

    (矩阵 1 的三次方)

    求逆矩阵:

    求行列式和秩:

    求解线性方程组(唯一解):

    无穷解:

    上述矩阵的行最简形:

    标准形:

    初等行变换的演示见求行最简形算法的讲解。

    开发中遇到的问题与收获

    new 创建二维动态数组时,输出和析构函数会出问题,多次调试无果,考虑到实际应用时手算的矩阵阶数不会很大,故选定 10*10 矩阵为矩阵大小。

    注意用于迭代的中间量要及时置零

    对浮点数进行加减运算后,如需再次进行乘除操作,需

    提前用

    if(fabs(num)<pow(10,-12)){ num=0

    }

    进行置零,以避免自己除自己时将一个实际上为 0 的数变为 1

    更改某个类的头文件和源文件时注意应更改当前文件夹内的文件,否则在文件中进行的更改将无法运用。

    用 extern 声明全局类对象时记得用 new 初始化全局类对象

    在.ui 文件中,控件名修改后不按回车键,即使按保存,控件名仍然为原来的名字

    修改头文件及对应的源文件时,注意两个文件是否在同一项目中

    未知 bug

    在读取输入的分数时有如下三种方式:

    第二种是逻辑上正确的,但在调试过程中发现,若分数前有负号,right 函数会错误截取字符串。

    资源下载地址:https://download.csdn.net/download/sheziqiong/85788074
    资源下载地址:https://download.csdn.net/download/sheziqiong/85788074

  • 相关阅读:
    Selenium元素定位神器工具谷歌浏览器插件-SelectorsHub介绍、安装和使用
    CentOS发生ping百度失败以及连接不到网关的问题解决
    Qt listWidget 详细分析
    动态顺序表C++实现
    MySQL 的数据目录
    操作系统·进程同步
    最短路径专题3 最短距离-多边权
    [卧龙凤雏]睡眠排序和随机排序
    Vue官方文档(48): vuex的基本使用
    分布式架构 服务容器化Docker
  • 原文地址:https://blog.csdn.net/newlw/article/details/125473623