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(, ); 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 = ; i < n; i++)
{
Console.WriteLine("请输入第{0}行的系数值和结果值", i + );
for (int j = ; j < n; j++)
{
Xishu[i, j] = Convert.ToDouble(Console.ReadLine());
}
Console.WriteLine("请输入第{0}行的结果值", i + );
zhi[i] = Convert.ToDouble(Console.ReadLine());
} //计算行列式的值和用结果值代替系数的行列式的值
double result = Hanglieshi(n, Xishu);
//测试用句1: Console.WriteLine("计算出行列式的结果为:{0}", result);
if (result == ) Console.WriteLine("此方程无解!");//行列式值为0,方程无解
else
{
for (int i = ; i < n; i++)
{
double[,] TempXishu = new double[n, n];
for (int ii = ; ii < n; ii++)
{
for (int jj = ; 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 = ; i < n; i++)
{
Console.WriteLine("X{0}:{1}", i + , 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 = ;
if (N == ) return ;
else if (N == ) return xishu[, ];
else if (N == ) return xishu[, ] * xishu[, ] - xishu[,] * xishu[,];
else
{ for (int i = ; i < N; i++)
{
double[,] NewXishu = new double[N - , N - ];
for(int j = ; j < N - ; j++)
{
int mark = ;
for (int k = ; k <N-; k++)
{ if (k == i) { NewXishu[j, k] = xishu[j + , mark + ]; mark++; }
else NewXishu[j, k] = xishu[j + , mark];
//Console.WriteLine("k的值为:{0}\tmark的值为:{1}\t数组的值为:{2}",k,mark,NewXishu[j,k]);
mark++;
}
}
//Console.WriteLine("这是第{0}次循环",i+1);
if(i%==)
Mo += xishu[,i]*Hanglieshi(N - , NewXishu);
else
Mo -= xishu[, i] * Hanglieshi(N - , NewXishu);
}
return Mo;
}
}
/*创建新的数组让方程结果值代替列值,时间复杂度为O(n)主要问题在空间复杂度上,传
参时,需要把原数组复制,所以要O(n三次方)。注意:正常函数传参是按值传参,函数内形参不
改变函数外部实参的值。但是数组比较特殊,会被更改。 */
double Rexishu(int lieshu,double [,]xishu,double[]Zhi,int Size)
{
Console.WriteLine(); for (int i = ; i <Size; i++)
{
xishu[i, lieshu] = Zhi[i];
}
double resulti=Hanglieshi(Size,xishu);
return resulti;
} }

C#程序计算N阶行列式的值及N元一次方程组的更多相关文章

  1. 基于上三角变换或基于DFS的行(列)展开的n阶行列式求值算法分析及性能评估

    进入大一新学期,看完<线性代数>前几节后,笔者有了用计算机实现行列式运算的想法.这样做的目的,一是巩固自己对相关概念的理解,二是通过独立设计算法练手,三是希望通过图表直观地展现涉及的两种算 ...

  2. 计算n阶行列式的模板

    之前在学习计数问题的时候也在网上找了很多关于行列式的资料 但是发现很多地方都只介绍2\3阶的情况 一些论文介绍的方法又看不懂 然后就一直耽搁着 今天恰好出到这样的题目 发现标算的代码简介明了 还挺开心 ...

  3. 求n阶方阵的值(递归)

    若有n*n阶行列式A,则: |A|=A[1][1]*M[1][1]+A[1][2]*M[1][2]+...A[1][n]*M[1][n]:其中M[1][i] 表示原矩阵元素A[1][i]的代数余子式: ...

  4. 线代: N阶行列式

    线性变换 将 (x, y) 变成 (2 x + y, x - 3 y) 就叫做线性变换, 这就是矩阵乘法, 用于表示一切线性变换. 几何上看, 把平面上的每个点 (x, y) 都变到 (2 x + y ...

  5. n阶行列式计算----c语言实现(完结)

    花了半天时间,写了这个n阶行列式计算的程序,应该算是比较优美吧,有很多地方多次做了优化,程序占用内存不是很大,要是说小吧,也不合适,因为里边有一个递归,而且递归的深度还比较深.时间复杂度具体没有细看, ...

  6. 编程计算2×3阶矩阵A和3×2阶矩阵B之积C。 矩阵相乘的基本方法是: 矩阵A的第i行的所有元素同矩阵B第j列的元素对应相乘, 并把相乘的结果相加,最终得到的值就是矩阵C的第i行第j列的值。 要求: (1)从键盘分别输入矩阵A和B, 输出乘积矩阵C (2) **输入提示信息为: 输入矩阵A之前提示:"Input 2*3 matrix a:\n" 输入矩阵B之前提示

    编程计算2×3阶矩阵A和3×2阶矩阵B之积C. 矩阵相乘的基本方法是: 矩阵A的第i行的所有元素同矩阵B第j列的元素对应相乘, 并把相乘的结果相加,最终得到的值就是矩阵C的第i行第j列的值. 要求: ...

  7. 编写程序,计算当n=10000,20000,30000...100000时,π的值.求π的近似公式 π=4*(1-1/3+1/5-1/7+1/9-1/11+1/13-...+1/(2n-1)-1/(2n+1))

    该程序是求的 π 近似值,所以随着 i 的增大,值会无线接近于 3.1415926... 代码示例 : package judgment;/** * 编写程序,计算当n=10000,20000,300 ...

  8. U66785 行列式求值

    二更:把更多的行列式有关内容加了进来(%%%%%Jelly Goat奆佬) 题目描述 给你一个N(n≤10n\leq 10n≤10)阶行列式,请计算出它的值 输入输出格式 输入格式: 第一行有一个整数 ...

  9. TOJ4537: n阶行列式

    4537: n阶行列式  Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 28       ...

随机推荐

  1. Linux学习之路-基础入门 20191104

    1.计算机组成 2.开发接口标准 ABI--(Application Binary Interface) ABI描述了应用程序与OS之间的底层接口,允许编译好的目标代码在使用兼容ABI的系统中无需改动 ...

  2. shell 脚本中 while 只执行一次

    实例代码 while read line ; do ssh -p20002 $line -o StrictHostKeyChecking=no xxxxxxxxx done < ip.txt w ...

  3. LengthFieldBasedFrameDecoder

    LengthFieldBasedFrameDecoder 详解 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -31[ 博客园 总入口 ] 文章目录 LengthFieldBasedFr ...

  4. 云服务器ECS(Elastic Compute Service),知识点

    资料 网址 什么是云服务器ECS https://help.aliyun.com/document_detail/25367.html?spm=a2c4g.11186623.6.544.4e1e376 ...

  5. 《浅谈我眼中的express、koa和koa2》好文留存+笔记

    原文 :三英战豪强,思绪走四方.浅谈我眼中的express.koa和koa2 一.回调大坑怎么解决呢? 1.es5可以利用一下第三方库,例如 async 库, 2.或者单纯使用 connect中间件  ...

  6. UEditor在开发环境中正常运作,但是部署到Tomcat中却无法使用

    背景 ​ SpringBoot项目,在 JSP 中使用 UEditor 问题 ​ UEditor 在开发环境中正常运作,但是导致部署到 Tomcat 中却无法使用 原因 在开发环境中,路径不够严谨,多 ...

  7. idea开发工具

    IDEA简介 IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境.IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支 ...

  8. ESA2GJK1DH1K升级篇: 远程升级准备工作: 安装Web服务器

    前言 大家可以安装Apache,Tomcat,nginx 等Web服务器软件,这篇文章安装 OpenResty 作为Web服务器软件,该软件安装在云端电脑,如果想 安装到自己本地电脑实现该功能,可使用 ...

  9. linux定时器的实现方法

    Linux提供定时器机制,可以指定在未来的某个时刻发生某个事件,定时器的结构如下: struct timer_list { struct list_head list; unsigned long e ...

  10. 归并排序 MergeSort

    今天第一次看懂了严奶奶的代码( ̄▽ ̄)~*,然后按照厌奶那的思路进行了一波coding,稍加调试后即可跑起来. 学习链接:排序七 归并排序.图解排序算法(四)之归并排序 merge函数:将两个有序序列 ...