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. elastalert基本配置说明

    elastalert 配置语法: 简单rule规则: es_host,es_port:查询elasticsearch集群 name: 规则的唯一名称.如果相同,则elastalert不会启动. typ ...

  2. Linux shell while循环语句

    for :明确循环次数 while :不确定循环换次数 while循环 (1) while CONDITION:do       statement       statement       < ...

  3. linux函数深入探索——open函数打开文件是否将文件内容加载到内存空间

    转自:https://blog.csdn.net/qq_17019203/article/details/85051627 问题:open(2)函数打开文件是否将文件内容加载到内存空间 首先,文件打开 ...

  4. OpenLDAP 安装教程

    OpenLDAP 安装教程 本文原始地址:https://sitoi.cn/posts/48217.html 在centos7上安装OpenLDAP 环境准备 两台虚拟机 node01 IP:192. ...

  5. Java面试题:HashMap和HashTable的区别

    HashMap和HashTable的区别是面试时面试官经常问的问题,在回答的时候可以选择重点做回答,区别主要有下面几点:key和value的取值范围不同HashMap和HashTable都是基于哈希表 ...

  6. Vyos的基本配置

    修改用户密码 Enter configuration mode configure Set password set system login user [username] authenticati ...

  7. [Javascript] Creating an Iterator from an Array

    Every Array has a function which you can use to create an iterator. This function can only be access ...

  8. 机器学习-MNIST数据集-神经网络

    #设置随机种子 seed = 7 numpy.random.seed(seed) #加载数据 (X_train,y_train),(X_test,y_test) = mnist.load_data() ...

  9. attribute和property的区别是什么?

          attribute                                       property 标签属性 对应html                       对象属 ...

  10. 直接插入排序与缩小增量插入排序(希尔排序ShellSort)

    直接插入排序 要理解shell排序,首先要把直接插入排序的基础打扎实. 学习资料:白话经典算法系列之二 直接插入排序的三种实现.直接插入排序 根据我的思路,直接插入排序设置3重循环. 循环1:对 i= ...