C# アルゴリズム アプリケーションでのガウス消去法の実装

C# アルゴリズム アプリケーションでのガウス消去法の実装
C# アルゴリズム アプリケーションでガウス消去法を実装するにはどうすればよいでしょうか?工学の学習では線形方程式の解法によく遭遇します。以下は、C# アルゴリズム アプリケーションでのガウス消去法の実装コードです。
  1. //プログラム名: GaussP1.cs  
  2. // メイン関数: ガウス消去法を使用して線形方程式を解く 
  3. // 知らせ:  
  4. // このプログラムは中間プロセスを詳細に提供しているため、デバッグ中に問題解決プロセスを分析でき、教育に適しています。  
  5. // 実際の計算に適した別のプログラムは GuassP1.pas と呼ばれます。  
  6.  
  7. using System; // System名前空間をインポートする 
  8.  
  9. 名前空間GaussP1
  10. {
  11.   公共 クラスプログラム
  12. {
  13.     公共 静的  void Main( string [] args) // メイン関数 
  14. { // メイン関数の開始 
  15.        // プログラムを簡略化するために、この例では方程式系が完全な解を持つ場合のみを考慮し、他のケースは判断しません。  
  16.        // nは線形方程式の数、配列aは拡張行列です。デバッグの便宜上、nと 
  17.        // 配列 a に値を割り当てます。実際に使用する場合は、その値をキーボードから読み取る必要があります。  
  18.       整数n = 3;
  19.       倍精度浮動小数点数型(double ) [,] a = {{2, -1, 3, 1}, {4, 2, 5, 4}, {1, 2, 0, 7}};
  20.       ダブル[] x =新しい ダブル[名詞]
  21.  
  22. ガウス(n,a,x);
  23.  
  24.        // 方程式系の解を出力する 
  25. Console.WriteLine( "方程式系の解は次のとおりです:" );
  26.        for ( int i = 0; i < n; i++) Console.Write( "x({0})={1,8:F3} " , i, x[i]);
  27. コンソールに行を書き込む
  28. }
  29.  
  30.      // ガウス消去法を使用して線形方程式の解を求める 
  31.     公共 静的  voidガウス( int n, double [,] a, double [] x)
  32. {
  33.       ダブルd;
  34.  
  35. Console.WriteLine( "ガウス消去法による方程式の解法の中間プロセス" );
  36. Console.WriteLine( "================================" );
  37. Console.WriteLine( "中間プロセス" );
  38. Console.WriteLine( "拡張行列:" );
  39. printArray(n, a); Console.WriteLine();
  40.         
  41.        // 排除 
  42.        ( int k = 0; k < n; k++)の場合
  43. {
  44. Console.WriteLine( "ステップ {0}" , k + 1);
  45. Console.WriteLine( "初期行列:" );
  46. printArray(n, a); Console.WriteLine();
  47.  
  48. selectMainElement(n, k, a); // メイン要素を選択する 
  49. Console.WriteLine( "メイン要素を選択した後の行列:" );
  50. printArray(n, a); Console.WriteLine();
  51.  
  52.          // (int j = k; j <= n; j++ )の場合、a[k, j] = a[k, j] / a[k, k];  
  53.          // 次の2つの文をこの文に変更すると、最初のループの後にプログラムが失敗するため、  
  54.          // その後、a[k,k]=1となり、a[k,k]の値が変化するため、次の文ではdが最初に使用されます。  
  55.          //a[k,k]の値を保存する 
  56. d = a[k, k];
  57.          ( int j = k; j <= n; j++ )の場合、 a[k, j] = a[k, j] / d;
  58. Console.WriteLine( "{0} 行目の a[{0},{0}] を 1 に変換した後の行列: " , k + 1);
  59. printArray(n, a); Console.WriteLine();
  60.  
  61.          // ガウス消去法とジョルダン消去法の主な違いはこのステップにあります。ガウス消去法はk+1から 
  62.          // は n までループしますが、ジョルダン消去法は 1 から n までループし、途中で行 k をスキップします。  
  63.          ( int i = k + 1; i < n; i++)の場合
  64. {
  65. d = a[i, k]; // 変数dを使用してa[i,k]の値を保存する原理は、上記のコメントで説明したものと同じです。  
  66.             ( int j = k; j <= n; j++)の場合、a[i, j] = a[i, j] - d * a[k, j];
  67. }
  68.  
  69. Console.WriteLine( "消去後の行列: " );
  70. printArray(n, a); Console.WriteLine();
  71. }
  72.  
  73.        // バックジェネレーション 
  74. x[n - 1] = a[n - 1, n];
  75.        ( int i = n - 1; i >= 0; i--)の場合
  76. {
  77. x[i] = a[i, n];
  78.          ( int j = i + 1; j < n; j++)の場合、 x[i] = x[i] - a[i, j] * x[j];
  79. }
  80. }
  81.  
  82.      // メイン要素を選択 
  83.     公共 静的  void selectMainElement( int n, int k, double [,] a)
  84. {
  85.        // k番目の列の主要素とその行番号を見つける 
  86.        double t, mainElement; // mainElementはメイン要素の値を保存するために使用されます 
  87.        int l; // メイン要素の行番号を保存するために使用されます 
  88.  
  89.        // k行目からn行目までのk列目の主要素を探し、主要素mainElementと行番号lを書き留めます。  
  90. mainElement = Math.Abs​​(a[k, k]); // 注意: 絶対値を取ることを忘れないでください 
  91. 1 = k;
  92.        ( int i = k + 1; i < n; i++)の場合
  93. {
  94.          (mainElement < Math.Abs​​(a[i, k])の場合)
  95. {
  96. mainElement = Math.Abs​​(a[i, k]);
  97. l = i; // メイン要素が配置されている行番号に注意してください 
  98. }
  99. }
  100.  
  101.        // l はメイン要素が配置されている行です。行 l を行 k と交換します。各行の最初の k 要素はすべて 0 なので、交換する必要はありません。  
  102.       もし(l != k)
  103. {
  104.          ( int j = k; j <= n; j++)の場合
  105. {
  106. t = a[k, j]; a[k, j] = a[l, j]; a[l, j] = t;
  107. }
  108. }
  109. }
  110.  
  111.      // 行列を印刷する 
  112.     公共 静的  void printArray( int n, double [,] a)
  113. {
  114.        ( int i = 0; i < n; i++)の場合
  115. {
  116.          for ( int j = 0; j <= n; j++ ) Console.Write( "{0,10:F6} " , a[i, j]);
  117. コンソールに行を書き込む
  118. }
  119. }
  120. }
  121. }

C# アルゴリズム アプリケーションのガウス消去法を実装したプログラムの実行結果:

ガウス消去法を用いて連立方程式を解く中間過程

中間プロセス

拡張マトリックス:

2.000000 -1.000000 3.000000 1.000000

4.000000 2.000000 5.000000 4.000000

1.000000 2.000000 0.000000 7.000000

ステップ1

初期マトリックス:

2.000000 -1.000000 3.000000 1.000000

4.000000 2.000000 5.000000 4.000000

1.000000 2.000000 0.000000 7.000000

主要素を選択した後のマトリックス:
4.000000 2.000000 5.000000 4.000000

2.000000 -1.000000 3.000000 1.000000

1.000000 2.000000 0.000000 7.000000

最初の行のa[1,1]の後の行列は1に変換される

1.000000 0.500000 1.250000 1.000000

2.000000 -1.000000 3.000000 1.000000

1.000000 2.000000 0.000000 7.000000

除去後のマトリックス

1.000000 0.500000 1.250000 1.000000

0.000000 -2.000000 0.500000 -1.000000

0.000000 1.500000 -1.250000 6.000000

ステップ2

初期マトリックス:

1.000000 0.500000 1.250000 1.000000

0.000000 -2.000000 0.500000 -1.000000

0.000000 1.500000 -1.250000 6.000000

主要素を選択した後のマトリックス:

1.000000 0.500000 1.250000 1.000000

0.000000 -2.000000 0.500000 -1.000000

0.000000 1.500000 -1.250000 6.000000

2行目のa[2,2]の後の行列は1に変換される。

1.000000 0.500000 1.250000 1.000000

0.000000 1.000000 -0.250000 0.500000

0.000000 1.500000 -1.250000 6.000000

除去後のマトリックス

1.000000 0.500000 1.250000 1.000000

0.000000 1.000000 -0.250000 0.500000

0.000000 0.000000 -0.875000 5.250000

ステップ3

初期マトリックス:

1.000000 0.500000 1.250000 1.000000

0.000000 1.000000 -0.250000 0.500000

0.000000 0.000000 -0.875000 5.250000

主要素を選択した後のマトリックス:

1.000000 0.500000 1.250000 1.000000

0.000000 1.000000 -0.250000 0.500000

0.000000 0.000000 -0.875000 5.250000

3行目のa[3,3]の後の行列は1に変換される。

1.000000 0.500000 1.250000 1.000000

0.000000 1.000000 -0.250000 0.500000

0.000000 0.000000 1.000000 -6.000000

除去後のマトリックス

1.000000 0.500000 1.250000 1.000000

0.000000 1.000000 -0.250000 0.500000

0.000000 0.000000 1.000000 -6.000000

連立方程式の解は次のようになります。

x(1)=9.000 x(2)=-1.000 x(3)=-6.000

これで、C# アルゴリズム アプリケーションでのガウス消去法の実装の紹介は終わりです。C# アルゴリズムのアプリケーションとガウス消去法の実装を理解するのに役立つことを願っています。

<<:  C# バイナリ ツリー トラバーサル アルゴリズムの実装の簡単な分析

>>:  大根畑の問題を解決する C# アルゴリズム

ブログ    

推薦する

米軍はドローンに対処するための新たな方法を考案した。ドローンの群れを破壊するマイクロ波兵器を開発するのだ。

【環球時報記者 徐陸明】6月17日、「国防ニュース」ウェブサイトの報道によると、最新の軍事予算文書...

ML Ops: データ品質が鍵

ML Ops は AI 分野における比較的新しい概念であり、「機械学習操作」として説明できます。モデ...

...

Googleが複数の機能を発表:皮膚疾患の特定、衣服の試着シミュレーション

Googleは6月15日、旅行計画、衣料品の買い物、皮膚異常の特定などをカバーする一連の新しい検索ア...

李開復氏独占インタビュー:10年後には人間の仕事の50%がAIに置き換えられる

「人工知能は急速に発展し、10年以内に人間の仕事の50%がAIに置き換えられるだろう」。シノベーショ...

米メディア記事:米中AI競争は東南アジアにとって何を意味するのか?

2月7日、アメリカの外交政策ウェブサイトは「米中人工知能競争は東南アジアにとって何を意味するのか?...

香港大学の黄凱斌氏:6G時代のエッジインテリジェンス、シャノンとチューリングの出会い

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

...

Stack Overflow が ChatGPT に対抗し、VS Code と連携する独自開発の生成 AI ツールをリリース

数日前、Stack Overflow コミュニティのトラフィックが大幅に減少したというニュースがあり...

マイクロソフト、データセンターに十分なAIチップが供給されない場合、サービスが中断すると警告

7月29日のニュース、海外メディアの報道によると、マイクロソフトは投資家に対し、グラフィックス・プロ...

「中国の新世代人工知能開発報告書2020」:中国はよりオープンな姿勢で人工知能の発展を推進

「中国の新世代人工知能開発報告書2020」(中国語版と英語版)が本日、浦江イノベーションフォーラムで...

2020年末レビュー: AIの失敗トップ10

これは、Synced の年末総集編「AI の失敗」の第 4 弾です。私たちの目標は、AI 研究を非難...

機械は人間に取って代わるでしょうか?人工知能技術の倫理的リスクを解明する

現在の人工知能技術の発展は、主にコンピュータを媒体として活用し、自動化技術の発展を促進しています。デ...

...

人工知能がメモリ相互接続の進化を推進

人工知能(AI)や自動車用チップの複雑さが徐々に増し、エッジ処理の割合も増加するにつれて、ストレージ...