連立方程式の解を計算するプログラム

このページでは「連立方程式の解を計算するプログラム」を紹介しています。

連立方程式の解法について

a11・x1 + a12・x2 ・・・ a1n・xn = b1
a21・x1 + a22・x2 ・・・ a2n・xn = b2
・
・
・
am1・x1 + am2・x2 ・・・ amn・xn = bn

上のように連立方程式を表したときに、 下のような係数を抽出して作った係数行列を使用して、 プログラムで連立方程式が計算できます。

a11 a12 ・・・ a1n b1
a21 a22 ・・・ a2n b2
・
・
・
am1 am2 ・・・ amn bn

コード

Javaでガウス・ジョルダン法を用いて連立方程式の解を計算するプログラムです。

計算クラス(Calculator.java)

計算を行うクラスです。係数行列が2次元配列と2次元のリストの両方で計算ができるように 引数の型を変えてオーバーロードしたメソッドを用意してみました。

import java.util.ArrayList;
import java.util.List;

/**
 * 計算クラス
 */
public class Calculator {

	/**
	 * 連立方程式を計算する
	 * @param coefficientMatrix m行n列の係数行列
	 * @return 結果
	 */
	public List<Double> systemOfEquations(Listt<List<Double>> coefficientMatrix) {
		int n = coefficientMatrix.size();
		int m = coefficientMatrix.get(0).size();
		
		double[][] matrix = new double[n][];

		for (int i = 0; i < n; i++) {
			double[] row = new double[m];

			for (int j = 0; j < m; j++) {
				row[j] = coefficientMatrix.get(i).get(j);
			}
			matrix[i] = row;
		}
		return systemOfEquations(matrix);
	}

	/**
	 * 連立方程式を計算する
	 * @param coefficientMatrix m行n列の係数行列
	 * @return 結果
	 */
	public List<Double> systemOfEquations(final double[][] coefficientMatrix) {
		List<Double> result = new ArrayList<>();
		double[][] matrix = coefficientMatrix;
		int n = matrix.length;
		int m = matrix[0].length;

		for (int k = 0; k < n; k++) {
			double p = matrix[k][k];

			for (int j = k; j < m; j++) {
				matrix[k][j] = matrix[k][j]/p;
			}

			for (int i = 0; i < n; i++) {
				if (i != k) {
					double d = matrix[i][k];

					for (int j = k; j < m; j++) {
						matrix[i][j] = matrix[i][j] - d * matrix[k][j];
					}
				}
			}
		}

		for (int i = 0; i < n; i++) {
			result.add(matrix[i][n]);
		}

		return result;
	}
}

動作確認用クラス

動作確認用のクラスです。

import java.util.ArrayList;
import java.util.List;

public class SampleTest {

	public static void main(String[] args) {
		// 2次元配列の係数行列データ
		double[][] matrix1 = {
			{2.0, 3.0, 1.0, 4.0},
			{4.0, 1.0, -3.0, -2.0},
			{-1.0, 2.0, 2.0, 2.0}
		};

		// 2次元のリストの係数行列データ
		ListListt<List<Double>> matrix2 = new ArrayList<>();

		for (int i = 0; i < matrix1.length; i++) {
			List<Double> row = new ArrayList<>();

			for (int j = 0; j < matrix1[i].length; j++) {
				row.add(matrix1[i][j]);
			}
			matrix2.add(row);
		}

		// 計算して表示
		Calculator calc = new Calculator();
		printResult(calc.systemOfEquations(matrix1));
		printResult(calc.systemOfEquations(matrix2));
	}

	public static void printResult(List<Double> result) {

		for (int i = 0; i < result.size(); i++) {
			System.out.println(String.format("x%d = %f", i+1, result.get(i)));
		}
		System.out.println("");
	}
}

実行結果

実行すると以下のように表示されます。

x1 = 2.000000
x2 = -1.000000
x3 = 3.000000

x1 = 2.000000
x2 = -1.000000
x3 = 3.000000

戻る

Copyright (C) 2016 計算プログラムのコード. All Rights Reserved. Loarding…