当前位置:
首页 > temp > 简明python教程 >
-
C#程序计算N阶行列式的值及N元一次方程组
用了挺长时间自行完成了C#程序计算N阶行列式的值及N元一次方程组。由于自己没有在网上查阅其他资料,所以只能硬着头皮用最朴素的思想和基础的算法进行编程。在给出代码之前,我先简单发表一些自己的粗鄙之见。。。
1.数学思想:有了线性代数中高斯提供的公式,我们很容易就能得到N阶方程的解的统一计算方法:即xn=Dn/D。其中D是系数矩阵的行列式值,Dn是用每个方程的结果分别代替系数矩阵中的每列值,所得新的行列式的值。 那么我们的关键问题就是(1)如何计算一个N阶行列式的值(2)如何得到N个新的行列式。下面就对这两个关键问题进行探讨。
2.问题一:如何计算N阶行列式的值。我没有选用网上的一些诸如“加边法”等一些方法。选用了N阶行列式最基本的计算公式。即求任意一行或列的所有元素乘以他们的余子式,进行降阶,最后在二阶用主对角线之积减副对角线之积进行计算。朴素的思想有着“易理解,难操作或性能低”的特点。选用这种方法的本质就是:递归。
3.问题二:问题二相对问题一而言更好解决,对每列进行遍历,用方程值组代替列组,创建新的行列式放到问题一的函数中计算即可。
下面附上代码:
static void Main() { bool tap = true; while (tap) { //输出标题并输入阶数 Console.SetCursorPosition(48, 3); Console.WriteLine("解N元一次方程组"); Console.Write("请输入N元方程组的阶数(未知数的个数):"); int n = Convert.ToInt32(Console.ReadLine()); //依次输入每行方程的系数和结果 double[,] Xishu = new double[n, n]; double[] zhi = new double[n]; double[] EachLineResult = new double[n]; Console.WriteLine("请依次输入每行的系数数和结果数:"); Console.WriteLine(); for (int i = 0; i < n; i++) { Console.WriteLine("请输入第{0}行的系数值和结果值", i + 1); for (int j = 0; j < n; j++) { Xishu[i, j] = Convert.ToDouble(Console.ReadLine()); } Console.WriteLine("请输入第{0}行的结果值", i + 1); zhi[i] = Convert.ToDouble(Console.ReadLine()); } //计算行列式的值和用结果值代替系数的行列式的值 double result = Hanglieshi(n, Xishu); //测试用句1: Console.WriteLine("计算出行列式的结果为:{0}", result); if (result == 0) Console.WriteLine("此方程无解!");//行列式值为0,方程无解 else { for (int i = 0; i < n; i++) { double[,] TempXishu = new double[n, n]; for (int ii = 0; ii < n; ii++) { for (int jj = 0; jj < n; jj++) { TempXishu[ii, jj] = Xishu[ii, jj]; } } EachLineResult[i] = Rexishu(i, TempXishu, zhi, n); //测试用句2: Console.WriteLine("第{0}个结果行列式的值为:{1}",i+1,EachLineResult[i]); } //输出每一个结果的值 Console.WriteLine(); Console.WriteLine("{0}元一次方程组的解集如下:", n); for (int i = 0; i < n; i++) { Console.WriteLine("X{0}:{1}", i + 1, EachLineResult[i] / result); } } Console.WriteLine(); Console.WriteLine("你是否要继续计算?回答:是或不是"); string choice = Console.ReadLine(); while (choice != "是"&& choice != "不是") choice = Console.ReadLine(); if (choice == "是") { Console.Clear(); } else tap = false; } //计算行列式函数:利用递归和行列式的数学计算式计算。时间复杂度为O(n三次方),性能较低。 double Hanglieshi (int N,double [,] xishu) { double Mo = 0; if (N == 0) return 0; else if (N == 1) return xishu[0, 0]; else if (N == 2) return xishu[0, 0] * xishu[1, 1] - xishu[0,1] * xishu[1,0]; else { for (int i = 0; i < N; i++) { double[,] NewXishu = new double[N - 1, N - 1]; for(int j = 0; j < N - 1; j++) { int mark = 0; for (int k = 0; k <N-1; k++) { if (k == i) { NewXishu[j, k] = xishu[j + 1, mark + 1]; mark++; } else NewXishu[j, k] = xishu[j + 1, mark]; //Console.WriteLine("k的值为:{0}\tmark的值为:{1}\t数组的值为:{2}",k,mark,NewXishu[j,k]); mark++; } } //Console.WriteLine("这是第{0}次循环",i+1); if(i%2==0) Mo += xishu[0,i]*Hanglieshi(N - 1, NewXishu); else Mo -= xishu[0, i] * Hanglieshi(N - 1, NewXishu); } return Mo; } } /*创建新的数组让方程结果值代替列值,时间复杂度为O(n)主要问题在空间复杂度上,传 参时,需要把原数组复制,所以要O(n三次方)。注意:正常函数传参是按值传参,函数内形参不 改变函数外部实参的值。但是数组比较特殊,会被更改。 */ double Rexishu(int lieshu,double [,]xishu,double[]Zhi,int Size) { Console.WriteLine(); for (int i = 0; i <Size; i++) { xishu[i, lieshu] = Zhi[i]; } double resulti=Hanglieshi(Size,xishu); return resulti; } }
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数