C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++】連立一次方程式を行列形式で表現するプログラムの作り方


本記事では、連立一次方程式を行列形式で表現するC++プログラムを紹介します。n個の変数を含むn本の一次方程式からなる連立方程式は、係数行列A・変数ベクトルx・定数ベクトルbを用いて「Ax = b」という形にまとめて表せます。このプログラムでは、ユーザーが入力した変数の個数と各係数を読み込み、それを見やすい行列形式で標準出力に表示します。

アルゴリズム

処理の流れは以下のとおりです。

開始
  1) 変数の個数 n と、各変数の係数を入力として受け取る。
  2) 行列 matrix[n][n] と定数配列 constant[n][1] を宣言する。
  3) 二重ループ(i = 0〜n-1、j = 0〜n-1)で各変数の係数を
     行列の要素として順に読み込む。
  4) ネストしたforループを使って行列形式を表示する。
終了

C++による実装例

#include <iostream>
using namespace std;

int main(void) {
    char variable[] = { 'x', 'y', 'z', 'd' };

    cout << "方程式に含まれる変数の個数を入力してください: ";
    int n;
    cin >> n;

    cout << "\n各方程式の係数を ax + by + cz + ... = d の形式で入力してください:\n";

    int matrix[n][n];
    int constant[n][1];

    // 係数と右辺の定数を入力
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> matrix[i][j];
        }
        cin >> constant[i][0];
    }

    // 行列形式で表示
    cout << "行列形式の表現は次のとおりです:" << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout << " " << matrix[i][j];
        }
        cout << " " << variable[i];
        cout << " = " << constant[i][0];
        cout << "\n";
    }
    return 0;
}

実行結果

方程式に含まれる変数の個数を入力してください: 3
各方程式の係数を ax + by + cz + ... = d の形式で入力してください:
1 2 3 4
5 6 7 9
8 5 2 1
行列形式の表現は次のとおりです:
1 2 3 x = 4
5 6 7 y = 9
8 5 2 z = 1

解説

上記の入力例は、次の連立一次方程式に対応しています。

1x + 2y + 3z = 4
5x + 6y + 7z = 9
8x + 5y + 2z = 1

これを行列形式 Ax = b で書き表すと、係数行列A・変数ベクトルx・定数ベクトルbはそれぞれ次のようになります。

      | 1 2 3 |         | x |         | 4 |
A =   | 5 6 7 |     x = | y |     b = | 9 |
      | 8 5 2 |         | z |         | 1 |

プログラムは、各行ごとに係数を空白区切りで出力し、行末に対応する変数名(x、y、z…)と等号、右辺の定数を続けて表示することで、この形を実現しています。

注意点:可変長配列(VLA)について

サンプルコード中の int matrix[n][n] は、実行時にサイズが決まる可変長配列(VLA)です。VLAはC99では標準機能ですが、ISO C++規格には含まれておらず、GCCやClangでは拡張機能として動作します。移植性を重視する場合は、std::vector<std::vector<int>> を利用するか、new / delete[] による動的メモリ確保を検討してください。


  1. 接続行列を使ってグラフを表現するC++プログラムの解説

    接続行列(インシデンス行列)とはグラフの接続行列(インシデンス行列)は、グラフをメモリ上に格納するためのもうひとつの表現方法です。隣接行列と異なり、接続行列は正方行列ではありません。そのサイズは V × E で表されます。ここで V はグラフの頂点数、E は辺の数です。この行列では、各行に頂点が配置され、各列に辺が配置されます。ある辺 e {u, v} に対しては、列 e のうち頂点 u と頂点 v に対応する位置に「1」がマークされます。これにより、「どの頂点がどの辺に接続しているか」という情報を直感的に把握できます。接続行列の計算量とメモリ使用量接続行列による表現では、構築時に O(V ×

  2. 隣接行列を使ってグラフを表現するC++プログラムの解説

    グラフの隣接行列(Adjacency Matrix)とは、サイズが V × V の正方行列のことです。ここでの V はグラフ G の頂点数を表します。行列の行と列にはそれぞれ頂点が対応しており、頂点 i から頂点 j への辺が存在する場合は、i 行 j 列の要素に「1」(重み付きグラフの場合は非ゼロの値)を格納します。辺が存在しない場合は、その位置には「0」が入ります。 隣接行列表現の計算量 隣接行列は計算時に O(V2) の記憶領域を必要とします。グラフが最大数の辺を持つ場合でも最小数の辺しか持たない場合でも、必要なメモリ量は同じです。つまり、辺の数に依存せず常に V × V 分の領域を確