return array($x, $y, $z);
}
// Детерминант трехмерной матрицы
function determinant($m)
{
return $m[0][0] * ($m[1][1] * $m[2][2] - $m[2][1] * $m[1][2]) -
$m[0][1] * ($m[1][0] * $m[2][2] - $m[2][0] * $m[1][2]) +
$m[0][2] * ($m[1][0] * $m[2][1] - $m[2][0] * $m[1][1]);
}
?>
Напоминаем, что если детерминант матрицы равен 0, это означает, что система уравнений линейно зависима и получить единственное решение невозможно.
При решении систем с более чем тремя переменными, следует прибегать к более сложным алогиритмам. Одним из таких алгоритмов является метод Гаусса-Жордана, который часто используют и при ручном вычислении систем линейных уравнений. Ниже приведена возможная реализация для все той же системы с тремя неизвестными, но в отличие от представленного выше скрипта, здесь можно увеличивать количество неизвестных в системе.
<?php
//$a-это исходная матрица 3*3
$a = array(array(0,1,1), array(1,0,1), array(1,1,0));
for ($k=1;$k<=3;$k++)
{
for ($i=1;$i<=3;$i++)
{
for ($j=1;$j<=3;$j++)
{
if ($i==$k and $j==$k) $b[$i][$j]=1/$a[$i][$j];
if ($i==$k and $j!=$k) $b[$i][$j]=-$a[$i][$j]/$a[$k][$k];
if ($i!=$k and $j==$k) $b[$i][$j]=$a[$i][$k]/$a[$k][$k];
if ($i!=$k and $j!=$k) $b[$i][$j]=$a[$i][$j]-$a[$k][$j]*$a[$i][$k]/$a[$k][$k];
}
}
$a=$b;
}
echo "<pre>";
print_r($a);
?>
В этом примере есть деление на элементы матрицы, но некоторые равны нулю и что тогда делать? По моим подсчётам матрица на выходе должна иметь вид:
array(
array(-0.5, 0.5, 0.5),
array(0.5, -0.5, 0.5),
array(0.5, 0.5, -0.5)
)'
Нашёл ещё один способ. Он был на С++ написан, но переписал его на РНР:
Но, опять же, там есть деление на элементы матрицы, а у нас есть равные нулю(((
Немного функцию облагорожу (в PHP с памятью проще - можно не копировать результат из единичной матрицы в исходную), чтобы потом на тему можно было ссылаться (мой вариант неправильный результат с первым столбцом выдает - почему-то в обратном порядке его выводит)
<?php
function q($matrix)
{
$a = $matrix;
$e = array();
$count = count($a);
for($i = 0; $i < $count; $i++)
for($j = 0; $j< $count; $j++)
$e[$i][$j] = ($i==$j) ? 1 : 0;
За одно и перемножение матриц сюда заброшу, чтобы уж все в одном месте было (это для квадратных матриц, для прямоугольных нужно проверять, что там с границами циклов).
<?php
function multi($x, $y)
{
for($i = 0; $i < count($x[0]); $i++)
{
for($j = 0; $j < count($y[0]); $j++)
{
for($k = 0; $k < count($x[0]); $k++)
{
if(!isset($z[$i][$j])) $z[$i][$j] = 0;
$z[$i][$j] += $x[$i][$k] * $y[$k][$j];
}
}
}
return $z;
}
?>