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;
            }

        }

?

转载请注明:九层楼 » C#程序计算N阶行列式的值及N元一次方程组

喜欢 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址