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 ...
随机推荐
- MySQL读写分离之MyCAT
Mycat实现MySQL主从复制读写分离 MyCAT的安装及部署 1.部署jdk环境 MyCAT用Java开发,需要有JAVA运行环境,mycat依赖jdk1.7的环境 1)上传jdk [root@l ...
- BareTail(日志查看工具)
官网:http://www.baremetalsoft.com/baretail/index.php 在看log文件时,当日志有新增时,会自动滚动到最新的那一行,对于查看实时日志有作用.
- springmvc 整合 netty-socketio
1 maven <dependency> <groupId>com.corundumstudio.socketio</groupId> <artifactId ...
- idea下新建Spring Boot项目并配置启动
一.操作步骤 ①使用idea新建一个Spring Boot项目 ②修改pom.xml ③修改application.properties ④修改编写一个Hello Spring Boot的Contro ...
- android 判断是否真正连接到internet(通过检测网址,需要时间)
if (InetAddress.getByName("www.xy.com").isReachable(timeout)) { } else { }
- 重新学习Spring注解——声明式事务
36.声明式事务-环境搭建 37.声明式事务-测试成功 38.[源码]-声明式事务-源码分析 /** * 声明式事务: * * 环境搭建: * 1.导入相关依赖 * 数据源.数据库驱动.Spring- ...
- 异常CLRDBG_NOTIFICATION_EXCEPTION_CODE( 0x04242420)的抛出过程
新建一个c#控制工程,就用自动生成的代码,不用补任何代码,如下: using System; using System.Collections.Generic; using System.Linq; ...
- ESA2GJK1DH1K升级篇: 移植远程更新程序到STM32F103RET6型号的单片机,基于(GPRS模块AT指令TCP透传方式)
前言 上节实现远程更新是更新的STM32F103C8T6的单片机 GPRS网络(Air202/SIM800)升级STM32: 测试STM32远程乒乓升级,基于(GPRS模块AT指令TCP透传方式),定 ...
- 请简述get请求和post请求的区别
①get比post快 ②get体积小,post可以无限大 ③get在浏览器退回时无害,post会再次请求 ④get的url参数可见,post不可见 ⑤get请求数据放在url,post数据放在http ...
- 【luoguP1382】楼房
题目描述 离散化,线段树维护区间修改,发现询问都是单点的\(max\),不妨把标记留在点上,不用下传,查询时取个\(max\)就可以了 #include<algorithm> #inclu ...