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# アルゴリズム

ブログ    
ブログ    
ブログ    

推薦する

コグニティブコンピューティングによる運用・保守は効果的でしょうか?

[51CTO.com からのオリジナル記事] 人工知能は最近とても人気があります。人々の焦点は、A...

ソフトウェア開発プロセスは、路上でのスマートカーの安全な運行を保証するものである。

2021年に入り、自動車の道路事故率を減らし、運転プロセスの快適性を向上させる先進運転支援システム...

トレンドにおける危険とチャンス: 生成 AI の黄金期をどう捉えるか?

ChatGPTは今年9月末に音声チャットと画像認識機能を追加しました。テキスト駆動型と比較して、C...

...

データサイエンスに必須の Python パッケージ 10 個

[51CTO.com クイック翻訳] データサイエンスに対する人々の関心は過去 5 年間で大幅に高ま...

...

顔認識技術の応用に関する法的規制

新興技術の発展とビジネス、公共福祉、社会統治などの分野におけるその応用をどのように促進、保護、規制す...

...

...

...

Python 転移学習: 機械学習アルゴリズム

機械学習は、非常に幅広い領域をカバーする人工知能の人気のあるサブフィールドです。その人気の理由の 1...

今年の機械学習研究で最もホットな分野は何ですか?幾何学的ディープラーニングの最大の勝者、Redditは混乱に陥っている

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

...

ドキュメントの分類が複雑すぎますか? MITとIBMは協力してこの問題を解決した

[[286340]] 【画像出典:venturebeat オーナー:venturebeat 】この記...

...