C#程式計算N階行列式的值及N元一次方程組

来源:https://www.cnblogs.com/fangexuxiehuihuang/archive/2019/10/09/11644103.html
-Advertisement-
Play Games

C#程式計算N階行列式的值及N元一次方程組 用了挺長時間自行完成了C#程式計算N階行列式的值及N元一次方程組。由於自己沒有在網上查閱其他資料,所以只能硬著頭皮用最朴素的思想和基礎的演算法進行編程。在給出代碼之前,我先簡單發表一些自己的粗鄙之見。。。 1.數學思想:有了線性代數中高斯提供的公式,我們很容 ...


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}\tmark的值為:{1}\t數組的值為:{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;
            }

        }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文主要講解Spring的基礎環境搭建以及演變由來,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 實驗環境:WIN7虛擬機 軟體:VC6 首先在VC6裡面寫一個空函數Fun(); F7編譯運行一下,沒有出錯,接著在函數處使用F9下斷點,使程式運行到Fun函數時停下。 接著F5開始運行這個程式 程式停在了Fun函數處,反彙編進去進行逆向分析 可以看到程式停在Fun函數的入口處,這裡的call就是F ...
  • 摘要 在 "詳解http報文" 一文中,詳細介紹了http報文的文本結構。那麼作為服務端,web容器是如何解析http報文的呢?本文以jetty和undertow容器為例,來解析web容器是如何處理http報文的。 在前文中我們從概覽中可以瞭解到,http報文其實就是一定規則的字元串,那麼解析它們, ...
  • composer是什麼 composer是PHP的插件依賴管理工具,我個人感覺和java的Maven、Gradle很類似。 Windows OS下安裝composer 參考: https://www.php.cn/php weizijiaocheng 400785.html https://blog ...
  • 聊起中斷,大家可能最熟悉的例子就是線程休眠。下麵就是一個線程休眠的 demo,在這個例子中,當我們調用 方法,該方法將會拋出一個需要捕獲的中斷異常,這裡捕獲該異常並直接返回。 java for (int i = 0; i An interrupt is an indication to a thre ...
  • 使用Mybatis查詢客戶端信息 前面的例子使用了預設的jdbc配置來動態從資料庫查詢客戶端信息,下麵來改用更加靈活的mybatis來實現,改用mybatis,首先pom中換成mybatis的依賴: 然後新建一個實體類,並實現查詢需要的 ClientDetails 介面: 由於介面預設需要實現的方法 ...
  • 類型和變數 [C#類型和變數(原文參考官方教程)]https://docs.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/types-and-variables C#有兩種類型: 1. 值類型 1. 簡單類型 2. 枚舉類型 格式為 enum E ...
  • 委托 1. C# 中的委托類似於 C 或 C++ 中指向函數的指針。委托表示引用某個方法的引用類型變數,運行時可以更改引用對象。 2. 特別地,委托可以用於處理事件或回調函數。並且,所有的委托類都是從 System.Delegate 類繼承而來。 聲明委托的語法規則:(被委托所引用的方法需有相同的參 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...