3

PHPで解決するグレード1の連立方程式があります。方程式は変数より多いが、方程式は変数より少ないわけではない。

システムは次のようになります。n 式、m 変数、変数は x[i] で、'i' は 1 から m までの値を取ります。システムには解決策がある場合とない場合があります。m は最大 100、n は最大 5000 (千) です。

これらの連立方程式を数千ほど解く必要があります。速度が問題になるかもしれませんが、今のところ PHP で書かれたアルゴリズムを探しています。

a[1][1] * x[1] + a[1][2] * x[2] + ... + a[1][m] * x[m] = number 1
a[2][1] * x[1] + a[2][2] * x[2] + ... + a[2][m] * x[m] = number 2
...
a[n][1] * x[1] + a[n][2] * x[2] + ... + a[n][m] * x[m] = number n

それを行うことができる Cramer ルールがあります。係数の正方行列を 1 つ作成し、(行列の行列式を計算することによって) Cramer 規則でシステムを解決し、未使用の方程式の値をチェックする必要があります。私は自分でCramerを試すことができると信じていますが、より良い解決策を探しています.

これは計算科学の問題です 。 http://en.wikipedia.org/wiki/Computational_science#Numerical_simulations 私の問題を解決するための複雑なアルゴリズムがいくつかあることは知っていますが、どれがそれを実行し、どれが最適かはわかりません私の場合。アルゴリズムは、デモンストレーションを伴う理論だけでなく、私をよりよく使用します.

私の質問は、グレード 1 の線形方程式系を解決するために PHP で記述された何らかのクラス、スクリプト、コードを知っている人はいますか? あるいは、API や Web サービスを試すこともできます。

ありがとうございました

4

4 に答える 4

2

まさにこれが必要でしたが、行列式関数が見つからなかったので、自分で作成しました。そしてCramerルール機能も。多分それは誰かを助けるでしょう。

/**
 * $matrix must be 2-dimensional n x n array in following format
 * $matrix = array(array(1,2,3),array(1,2,3),array(1,2,3))
 */
function determinant($matrix = array()) {
    // dimension control - n x n
    foreach ($matrix as $row) {
        if (sizeof($matrix) != sizeof($row)) {
            return false;
        }
    }
    // count 1x1 and 2x2 manually - rest by recursive function
    $dimension = sizeof($matrix);
    if ($dimension == 1) {
        return $matrix[0][0];
    }
    if ($dimension == 2) {
        return ($matrix[0][0] * $matrix[1][1] - $matrix[0][1] * $matrix[1][0]);
    }
    // cycles for submatrixes calculations
    $sum = 0;
    for ($i = 0; $i < $dimension; $i++) {
        // for each "$i", you will create a smaller matrix based on the original matrix
        // by removing the first row and the "i"th column.
        $smallMatrix = array();
        for ($j = 0; $j < $dimension - 1; $j++) {
            $smallMatrix[$j] = array();
            for ($k = 0; $k < $dimension; $k++) {
                if ($k < $i) $smallMatrix[$j][$k] = $matrix[$j + 1][$k];
                if ($k > $i) $smallMatrix[$j][$k - 1] = $matrix[$j + 1][$k];
            }
        }
        // after creating the smaller matrix, multiply the "i"th element in the first
        // row by the determinant of the smaller matrix.
        // odd position is plus, even is minus - the index from 0 so it's oppositely
        if ($i % 2 == 0){
            $sum += $matrix[0][$i] * determinant($smallMatrix);
        } else {
            $sum -= $matrix[0][$i] * determinant($smallMatrix);
        }
    }
    return $sum;
}
/**
 * left side of equations - parameters:
 * $leftMatrix must be 2-dimensional n x n array in following format
 * $leftMatrix = array(array(1,2,3),array(1,2,3),array(1,2,3))
 * right side of equations - results:
 * $rightMatrix must be in format
 * $rightMatrix = array(1,2,3);
 */
function equationSystem($leftMatrix = array(), $rightMatrix = array()) {
    // matrixes and dimension check
    if (!is_array($leftMatrix) || !is_array($rightMatrix)) {
        return false;
    }
    if (sizeof($leftMatrix) != sizeof($rightMatrix)) {
        return false;
    }
    $M = determinant($leftMatrix);
    if (!$M) {
        return false;
    }
    $x = array();
    foreach ($rightMatrix as $rk => $rv) {
        $xMatrix = $leftMatrix;
        foreach ($rightMatrix as $rMk => $rMv) {
            $xMatrix[$rMk][$rk] = $rMv;
        }
        $x[$rk] = determinant($xMatrix) / $M;
    }
    return $x;
}
于 2016-12-08T12:44:16.313 に答える
1

ウィキペディアには、方程式を表す行列を縮小された行階層形式に縮小するための疑似コードが必要です。マトリックスがその形式になったら、行をたどって解決策を見つけることができます。

コードを書く労力を節約できる保守されていない PEAR パッケージがあります。

もう 1 つの問題は、「広い」システム (方程式よりも多くの変数があり、通常は多くの可能な解がある) と「狭い」システム (変数よりも多くの方程式があり、通常は解がない) のどちらを主に見ているのかということです。狭いシステムでは、代わりに最小二乗法などの線形回帰手法を使用することでメリットが得られる場合があります。

于 2012-06-21T13:00:32.563 に答える
0

ここに JAMA に基づく本当に優れたパッケージがあります: http://www.phpmath.com/build02/JAMA/docs/index.php

私はそれを単純な線形から非常に複雑な多重線形回帰まで使用しました (その上に独自の Backwards Stepwise MLR 関数を記述します)。非常に包括的で、うまくいけばあなたが必要とすることをします。

確かに、速度は問題と見なすことができます。しかし、BSMLR 計算の結果を相互参照すると、SPSS は適切に機能し、一致しました。

于 2012-06-21T13:48:54.677 に答える