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. MySQL服务的构成(二)

    一.什么是实例 这里的实例不是类产生的实例对象,而是Linux系统下的一种机制 1.MySQL的后台进程+线程+预分配的内存结构. 2.MySQL在启动的过程中会启动后台守护进程,并生成工作线程,预分 ...

  2. drf框架 - 视图家族 | GenericAPIView | mixins | generics | viewsets

    视图家族 view:视图 generics:工具视图 mixins:视图工具集 viewsets:视图集 学习曲线: APIView => GenericAPIView => mixins ...

  3. 201871010110-李华《面向对象程序设计(java)》第6-7周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  4. springboot2.0整合logback日志(详细)

    <div class="post"> <h1 class="postTitle"> springboot2.0整合logback日志(详 ...

  5. graalvm native image 试用

    graalvm 提供的native 模式,可以加速应用的启动,不同可以让应用不再依赖jvm 运行时环境,但是 也有一些限制 参考 https://github.com/oracle/graal/blo ...

  6. 列表:list

    #_*_coding:utf-8_*_#作者:王佃元#日期:2019/12/7'''数据类型整数字符串列表.元组name = 'wuchao'name = 'jinxin'name = 'xiaohu ...

  7. Problem C. 欧皇 ————2019.10.12

    题目: 再次感激土蛋 #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ll C[][]; voi ...

  8. 常见的概率分布类型(二)(Probability Distribution II)

    以下是几种常见的离散型概率分布和连续型概率分布类型: 伯努利分布(Bernoulli Distribution):常称为0-1分布,即它的随机变量只取值0或者1. 伯努利试验是单次随机试验,只有&qu ...

  9. Kafka问题总结

    kafka问题总结 kafka如何保证数据可靠性和数据一致性 Kafka Rebalance机制分析 Kafka的用途有哪些?使用场景如何? Kafka中的ISR.AR又代表什么?ISR的伸缩又指什么 ...

  10. 项目中常用的js方法封装---自留

    1.输入一个值,返回其数据类型 type = para => { return Object.prototype.toString.call(para).slice(8,-1) } 2.冒泡排序 ...