• 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(48, 3); 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 = 0; i < n; i++)
                    {
                        Console.WriteLine("请输入第{0}行的系数值和结果值", i + 1);
                        for (int j = 0; j < n; j++)
                        {
                            Xishu[i, j] = Convert.ToDouble(Console.ReadLine());
                        }
                        Console.WriteLine("请输入第{0}行的结果值", i + 1);
                        zhi[i] = Convert.ToDouble(Console.ReadLine());
                    }
    
                    //计算行列式的值和用结果值代替系数的行列式的值
                    double result = Hanglieshi(n, Xishu);
                    //测试用句1: Console.WriteLine("计算出行列式的结果为:{0}", result);
                    if (result == 0) Console.WriteLine("此方程无解!");//行列式值为0,方程无解
                    else
                    {
                        for (int i = 0; i < n; i++)
                        {
                            double[,] TempXishu = new double[n, n];
                            for (int ii = 0; ii < n; ii++)
                            {
                                for (int jj = 0; 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 = 0; i < n; i++)
                        {
                            Console.WriteLine("X{0}:{1}", i + 1, 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 = 0;
                    if (N == 0) return 0;
                    else if (N == 1) return xishu[0, 0];
                    else if (N == 2) return xishu[0, 0] * xishu[1, 1] - xishu[0,1] * xishu[1,0];
                    else
                    {
                        
                        for (int i = 0; i < N; i++)
                        {    
                            double[,] NewXishu = new double[N - 1, N - 1];
                            for(int j = 0; j < N - 1; j++)
                            {
                                int mark = 0;
                                for (int k = 0; k <N-1; k++)
                                {
                                    
                                    if (k == i) { NewXishu[j, k] = xishu[j + 1, mark + 1]; mark++; }
                                    else NewXishu[j, k] = xishu[j + 1, mark];
                                    //Console.WriteLine("k的值为:{0}	mark的值为:{1}	数组的值为:{2}",k,mark,NewXishu[j,k]);
                                    mark++;
                                }
                            }
                            //Console.WriteLine("这是第{0}次循环",i+1);
                            if(i%2==0)
                                Mo += xishu[0,i]*Hanglieshi(N - 1, NewXishu);
                            else
                                Mo -= xishu[0, i] * Hanglieshi(N - 1, NewXishu);
                        }
                        return Mo;
                    }
                }
                /*创建新的数组让方程结果值代替列值,时间复杂度为O(n)主要问题在空间复杂度上,传
                参时,需要把原数组复制,所以要O(n三次方)。注意:正常函数传参是按值传参,函数内形参不
                改变函数外部实参的值。但是数组比较特殊,会被更改。 */
                double Rexishu(int lieshu,double [,]xishu,double[]Zhi,int Size)
                {
                    Console.WriteLine();
    
                    for (int i = 0; i <Size; i++)
                    {
                        xishu[i, lieshu] = Zhi[i];
                    }
                    double resulti=Hanglieshi(Size,xishu);
                    return resulti;
                }
    
            }
  • 相关阅读:
    ZoneJS 的原理与应用
    RxJS 中的观察者和迭代器模式
    前端三大框架:数据绑定与数据流
    Angular 的前世今生
    验证Kubernetes YAML的最佳实践和策略
    GitOps初阶指南:将DevOps扩展至K8S
    如何使用Istio 1.6管理多集群中的微服务?
    5个规则,确保你的微服务优化运行
    使用Thanos实现Prometheus指标联邦
    丢弃掉那些BeanUtils工具类吧,MapStruct真香!!!
  • 原文地址:https://www.cnblogs.com/fangexuxiehuihuang/p/11644103.html
Copyright © 2020-2023  润新知