C#程序计算N阶行列式的值及N元一次方程组
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元一次方程组的更多相关文章
- 基于上三角变换或基于DFS的行(列)展开的n阶行列式求值算法分析及性能评估
进入大一新学期,看完<线性代数>前几节后,笔者有了用计算机实现行列式运算的想法.这样做的目的,一是巩固自己对相关概念的理解,二是通过独立设计算法练手,三是希望通过图表直观地展现涉及的两种算 ...
- 计算n阶行列式的模板
之前在学习计数问题的时候也在网上找了很多关于行列式的资料 但是发现很多地方都只介绍2\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]的代数余子式: ...
- 线代: N阶行列式
线性变换 将 (x, y) 变成 (2 x + y, x - 3 y) 就叫做线性变换, 这就是矩阵乘法, 用于表示一切线性变换. 几何上看, 把平面上的每个点 (x, y) 都变到 (2 x + y ...
- n阶行列式计算----c语言实现(完结)
花了半天时间,写了这个n阶行列式计算的程序,应该算是比较优美吧,有很多地方多次做了优化,程序占用内存不是很大,要是说小吧,也不合适,因为里边有一个递归,而且递归的深度还比较深.时间复杂度具体没有细看, ...
- 编程计算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列的值. 要求: ...
- 编写程序,计算当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 ...
- U66785 行列式求值
二更:把更多的行列式有关内容加了进来(%%%%%Jelly Goat奆佬) 题目描述 给你一个N(n≤10n\leq 10n≤10)阶行列式,请计算出它的值 输入输出格式 输入格式: 第一行有一个整数 ...
- TOJ4537: n阶行列式
4537: n阶行列式 Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByteTotal Submit: 28 ...
随机推荐
- elastalert基本配置说明
elastalert 配置语法: 简单rule规则: es_host,es_port:查询elasticsearch集群 name: 规则的唯一名称.如果相同,则elastalert不会启动. typ ...
- Linux shell while循环语句
for :明确循环次数 while :不确定循环换次数 while循环 (1) while CONDITION:do statement statement < ...
- linux函数深入探索——open函数打开文件是否将文件内容加载到内存空间
转自:https://blog.csdn.net/qq_17019203/article/details/85051627 问题:open(2)函数打开文件是否将文件内容加载到内存空间 首先,文件打开 ...
- OpenLDAP 安装教程
OpenLDAP 安装教程 本文原始地址:https://sitoi.cn/posts/48217.html 在centos7上安装OpenLDAP 环境准备 两台虚拟机 node01 IP:192. ...
- Java面试题:HashMap和HashTable的区别
HashMap和HashTable的区别是面试时面试官经常问的问题,在回答的时候可以选择重点做回答,区别主要有下面几点:key和value的取值范围不同HashMap和HashTable都是基于哈希表 ...
- Vyos的基本配置
修改用户密码 Enter configuration mode configure Set password set system login user [username] authenticati ...
- [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 ...
- 机器学习-MNIST数据集-神经网络
#设置随机种子 seed = 7 numpy.random.seed(seed) #加载数据 (X_train,y_train),(X_test,y_test) = mnist.load_data() ...
- attribute和property的区别是什么?
attribute property 标签属性 对应html 对象属 ...
- 直接插入排序与缩小增量插入排序(希尔排序ShellSort)
直接插入排序 要理解shell排序,首先要把直接插入排序的基础打扎实. 学习资料:白话经典算法系列之二 直接插入排序的三种实现.直接插入排序 根据我的思路,直接插入排序设置3重循环. 循环1:对 i= ...