<?php
/****************************/
/* 逆行列の計算 */
/* 例: 2 1 */
/* 1 1 */
/* coded by Y.Suganuma */
/****************************/
/*
データの設定
*/
$eps = 1.0e-10;
$w = array(2);
$w[0] = array(2.0, 1.0, 1.0, 0.0);
$w[1] = array(1.0, 1.0, 0.0, 1.0);
/*
実行と出力
*/
$ind = gauss($w, 2, 2, $eps);
printf("\$ind = %d\n", $ind);
printf(" %f %f\n", $w[0][2], $w[0][3]);
printf(" %f %f\n", $w[1][2], $w[1][3]);
/******************************************/
/* 線形連立方程式を解く(逆行列を求める) */
/* $w : 方程式の左辺及び右辺 */
/* $n : 方程式の数 */
/* $m : 方程式の右辺の列の数 */
/* $eps : 逆行列の存在を判定する規準 */
/* return : =0 : 正常 */
/* =1 : 逆行列が存在しない */
/*******************************************/
function gauss(&$w, $n, $m, $eps)
{
$ind = 0;
$nm = $n + $m;
for ($i1 = 0; $i1 < $n && $ind == 0; $i1++) {
$y1 = 0.0;
$m1 = $i1 + 1;
$m2 = 0;
// ピボット要素の選択
for ($i2 = $i1; $i2 < $n; $i2++) {
$y2 = abs($w[$i2][$i1]);
if ($y1 < $y2) {
$y1 = $y2;
$m2 = $i2;
}
}
// 逆行列が存在しない
if ($y1 < $eps)
$ind = 1;
// 逆行列が存在する
else {
// 行の入れ替え
for ($i2 = $i1; $i2 < $nm; $i2++) {
$y1 = $w[$i1][$i2];
$w[$i1][$i2] = $w[$m2][$i2];
$w[$m2][$i2] = $y1;
}
// 掃き出し操作
$y1 = 1.0 / $w[$i1][$i1];
for ($i2 = $m1; $i2 < $nm; $i2++)
$w[$i1][$i2] *= $y1;
for ($i2 = 0; $i2 < $n; $i2++) {
if ($i2 != $i1) {
for ($i3 = $m1; $i3 < $nm; $i3++)
$w[$i2][$i3] -= $w[$i2][$i1] * $w[$i1][$i3];
}
}
}
}
return $ind;
}
?>