线性代数辅助程序

参加了一个程序设计大赛,有点数学建模的模式,差不多是校级的,而且看之前的题目都是比较简单,有的就是我们的实验题或者课设题目,所以还是想水一水的(万恶之源***)

题目是这样的

题目
请开发一个《线性代数》课程学习辅助软件,自主设计界面,现实以下功能:
(1)计算两个矩阵的加法、减法、乘法功能
(2)求方阵的行列式
(3)求方阵的逆矩阵

具体要求如下:
(1)界面简洁,操作简便。
(2)程序源代码格式正确,符合编码规范(编程语言不限),有适当注释。
(3)编写程序设计文档。
(4)编写程序安装、执行说明文档。 

看题目比较好实现,而且当初学线代的时候我就考虑过实现求行列式的想法,但是老师说的是行列式超过多少阶就不好算了,然后毕竟学软件的,编程实现一下起步美滋滋,然后就参加了、然后就参加了、然后就参加了!!!

最后老师给了40分   满分100分  看到结果真的是一脸懵逼,我真的不理解老师是怎么评的分(一个大大的问号脸)



刚开始就决定用C++写,1、我比较熟悉,实现起来简单2、不用安装各种插件,使用起来也很方便3、大部分大学生都是学过C的,所以C++很多代码大家也都能看得懂

时间给了3天好像,第一天晚上搭了整体框架,第二天实现主要功能,第三天细节优化

矩阵的加法、减法和乘法直接裸敲的。行列式刚开始都忘了啥是行列式了,然后就开始百度学习了,O(∩_∩)O哈哈~

行列式、伴随矩阵、逆矩阵还有初等行变换,上三角矩阵,完美的印证了我都给忘了,但是看了一下也是可以很快的想起来,知道了怎么回事了就开始写代码,刚开始肯定是没有思路的,不知道怎么实现求矩阵行列式,然后就找相关播客,找到一篇实现既简单还看着比较高大上的博客 传送门


//计算矩阵的行列式
//将行列式转换为上三角行列式计算起来方便
//考虑到转换过程中可能会遇到分数的计算,从而产生误差
//决定使用求最大公约数中的辗转相除法进行化简
//求两个数的最大公约数时运用辗转相除法一定可以化简为
//一个整数和0的形式,而且过程中全是整数的运算
//下面简单证明辗转相除法
// 设 m = n*a+b; 求证 gcd(m,n) = gcd(n,b);
// 设 x 为 m和n的最大公约数 则m%x = 0 && n%x = 0
//因此n*a%x = 0 从而(m-n*a)% x = 0; m - n*a = b b%x = 0
//所以gcd(n,b) = x

 1     printf("请输入一个整数表示矩阵的阶\n");
 2     scanf("%d",&n);
 3     printf("请输入矩阵\n");
 4     for(int i = 1; i <= n; i++)
 5     {
 6         for(int j = 1; j <= n; j++)
 7         {
 8             scanf("%d",&answer[i][j]);
 9         }
10     }
11     for(int i = 1; i <= n; i++)//i 表示行
12     {
13         for(int j = i+1; j <= n; j++)//j表示列
14         {
15             int x = i,y = j;   //x,y表示相互运算的两行
16             while(answer[y][i])//行列互换表示与主对角线对称的元素
17             {
18                 //ans 表示商
19                 long long ans = answer[x][i]/answer[y][i];
20                 for(int k = i; k <= n; k++)
21                 {
22                     //每一次都交换第x行
23                     answer[x][k] = answer[x][k] - answer[y][k]*ans;
24                 }
25                 swap(x,y);
26             }
27             //最后没有交换成原始的模样说明
28             //奇数次交换,整个行列式要取反
29             if(x!=i)
30             {
31                 for(int k = i; k <= n; k++)
32                 {
33                     swap(answer[x][k],answer[y][k]);
34                 }
35                 flag*=-1;
36             }
37         }
38         if(answer[i][i] == 0)
39         {
40             flag = 0;
41             break;
42         }
43         temp *= answer[i][i];
44     }
45     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);// 控制颜色的,不用看
46     printf("矩阵的行列式为\n");
47     if(flag == 0)
48     {
49         printf("0\n");
50     }
51     else if(flag == -1){
52         temp = -temp;
53         cout<<temp<<endl;
54     }
55     else
56     {
57         cout<<temp<<endl;
58     }
59     printf("\n");

核心算法就在这了,哎,气的我肝疼,比嘲讽我的帅气更令我桑心就是讽刺我的代码了。。。

基本思路就是将矩阵转化成上三角行列式,然后对角线乘起来就行了,怕老师看不懂这个算法,我还写了详细的注释。

正常点的初等行变换转换成上三角都要与某一行作运算,大多数时候都是将某一行+-上参考行的几分之几,这里涉及分数,所以就会产生误差,于是这就用到了辗转相除法(没想到辗转相除法不止可以求GCD还能这样用,见识了)

这是收获最大的一个程序了,因为这样算出来的行列式误差为0,相信在计算数学中这是最理想的结果了。

然而我已无力吐槽。。。各位大佬,告辞了您嘞!



微信公众号搜索 田长宏

后台回复 线代程序即可获取源码,你想要的资源我都有   (#^.^#)



线性代数辅助程序

原文地址:https://www.cnblogs.com/--lr/p/10015030.html

时间: 2024-10-16 00:55:39

线性代数辅助程序的相关文章

手机小游戏辅助程序的实现

这两天玩了一个微信的小游戏,想到以前的跳一跳可以通过模拟按键和截取屏幕的方式做辅助程序,所以想针对这个小游戏也做个机器人自动玩,虽然结果是失败的,但是也学到了点东西. 1.做这种小游戏机器人的关键点有两个,一个是模拟按键,一个是截取屏幕.模拟按键很简单,直接调用以下命令即可在安卓手机上任意一个坐标点击一次,部分手机记得在开发者选项里开启允许模拟点击 adb shell input tap x y 2.图像识别起初想和跳一跳一样,用adb shell来截图,但是发现这种方式速度太慢了,大概3秒一张

.NET开发一个微信跳一跳辅助程序

昨天微信更新了,出现了一个小游戏"跳一跳",玩了一下 赶紧还蛮有意思的 但纯粹是拼手感的,玩了好久,终于搞了个135分拿了个第一名,没想到过一会就被朋友刷下去了,最高的也就200来分把,于是就想着要是开发个辅助就好了,于是简单想了一下最高游戏 先来说下这个游戏的界面和规则: 先看看界面 规则:按住屏幕 按一定时间松开就可以跳跃,跳跃到前方的图案中得1分,图按中间得2分(连续多个中间累加2分,比如第一个2分 第二个4分 第三个6分 最高累计32分) 其它规则不说明了 整理了下实现原理,其

跳一跳辅助程序(拿来主义)

感谢博主提供了手动跳. github大佬们提供了自动跳 手动跳很累,而且有时候会掉下来.还是自动跳好. 首先你需要一个python开发环境,需要numpy PIL matplotlib这三个包的支持.如果没有pip,可以到这里手动下载 然后是一个adb,这个是android开发包的一个程序,可以到这里下载,(需要免费的可以给我留言,或者自己下载SDK) 然后就是代码了.直接复制运行.我慢慢会补充代码的说明(毕竟伸手党懒) #coding:utf-8 import os import PIL,nu

展翅鸟辅助程序

本程序可以在忘记密码的情况下帮助进入系统设置,具体使用自己看吧!居然还有某些人把这个当广告贴的,我只能呵呵了!不想多说了,自己下载吧.解压密码:heihu.blog.51cto.com

【辅助程序】练手小程序:记录外网动态IP地址

练手小程序 程序作用:对IP实时记录: 1.定时获取外网IP,存储在本地文件中: 编写思路: 1)收集获取外网的API接口 http://bbs.125.la/thread-13838979-1-1.html 2)定时执行 http://blog.csdn.net/imzoer/article/details/8699083/ 4)记录本地文件 1 # -*- coding: utf-8 -*- 2 # -*- coding: gbk -*- 3 # Date: 2016/4/27 4 # Cr

微信_跳一跳辅助程序_Python_(带GitHub项目地址)

1.安装Python(推荐3.6) https://www.python.org/downloads/2.在github上下载脚本 [github项目地址](https://github.com/wangshub/wechat_jump_game) 3.安装ADB+配置PATH[adb全称Android Debug Bridge调试桥:PC与手机的链接工具] http://adbshell.com/downloads4.链接手机(限安卓)或安卓模拟器 DOS窗口输入adb devices验证设备

.net开发 微信小游戏跳一跳辅助程序

一次巧合我看到了一篇关于微信小游戏跳一跳的辅助开发源码,链接:http://mp.weixin.qq.com/s/qGpoHNEf1A2AlofKFVdE2w 然后我试着下载下来跑一遍看能不能运行,显然是不能的,我总结了让能跑起来的几个步骤. 1.adb 环境变量配置 在网上下载 adb工具 1.0.32版本(比这个高或低的版本的可能连接不上),解压到某个文件夹下: 右击计算机——属性——高级系统设置——环境变量: 弹出”环境变量“对话框,单击”新建“一个环境变量. 在新建系统变量里,配置变量名

JAVA实现跳一跳辅助程序之虎啸龙吟

前序: 今天有幸,看到2位博主的文章,在此表示感谢.自己也动手实现了一下. 实现原理 请参考博主 https://www.cnblogs.com/dongkuo/p/8285162.html 另感谢博主 http://www.cnblogs.com/litblank/p/8267526.html  提供的基础部分代码,免去了我自己再写一边的麻烦. 由于第一篇是python 实现,楼主是JAVA出生,想通过java实现,刚好在评论中看到了 第二位博主的java实现连接,但是自己用博主的代码,测试发

Netty入门二:开发第一个Netty应用程序

    既然是入门,那我们就在这里写一个简单的Demo,客户端发送一个字符串到服务器端,服务器端接收字符串后再发送回客户端. 2.1.配置开发环境 1.安装JDK 2.去官网下载jar包 (或者通过pom构建) 2.2.认识下Netty的Client和Server 一个Netty应用模型,如下图所示,但需要明白一点的是,我们写的Server会自动处理多客户端请求,理论上讲,处理并发的能力决定于我们的系统配置及JDK的极限. Client连接到Server端 建立链接发送/接收数据 Server端