|
|
|
|
|
для: DEM
(03.01.2012 в 19:23)
| | За одно и перемножение матриц сюда заброшу, чтобы уж все в одном месте было (это для квадратных матриц, для прямоугольных нужно проверять, что там с границами циклов).
<?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;
}
?>
|
| |
|
|
|
|
|
|
|
для: DEM
(03.01.2012 в 23:14)
| | Немного вашу функцию облагорожу (в 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;
for($i = 0; $i < $count; $i++)
{
$tmp = $a[$i][$i];
for($j = $count - 1; $j >= 0; $j--)
{
$e[$i][$j] /= $tmp;
$a[$i][$j] /= $tmp;
}
for($j = 0; $j < $count; $j++)
{
if($j != $i)
{
$tmp = $a[$j][$i];
for($k = $count - 1; $k >= 0; $k--)
{
$e[$j][$k] -= $e[$i][$k]*$tmp;
$a[$j][$k] -= $a[$i][$k]*$tmp;
}
}
}
}
return $e;
}
?>
|
| |
|
|
|
|
|
|
|
для: DEM
(04.01.2012 в 01:57)
| | Ага, тоже вручную посчитал, и ваш, и мой алгоритмы дают одно и тоже на простейшей двухмерной матрице. | |
|
|
|
|
|
|
|
для: DEM
(03.01.2012 в 23:14)
| | Взял, как Вы и сказали массив $b равный единице и постаивл, что бы возвращала матрицу $a. Всё посчиталось правильно.
СПАСИБО БОЛЬШОЕ!!!! :) | |
|
|
|
|
|
|
|
для: DEM
(04.01.2012 в 01:26)
| | Суть в том, что вы можете подставить вместо $b единицы и в ходе решения должна появится обратная матрица и она вроде появляется, только их перемножение с исходной не дает единичную. | |
|
|
|
|
|
|
|
для: cheops
(04.01.2012 в 01:37)
| | У меня такое условие задачи:
Есть файл вида:
2 4
1 5
2 7
2 8
3 1
1 7
Это координаты точек (только целые). Надо составить матрицу из расстояния от одной точки до других (первый ряд от первой точки, второй - от второй и т.д.), и ещё добавляется один ряд и столбец в которых элементы равны 1 (кроме диагонального, он равен единице)
Значения там могут быть какие угодно (только не повторяющиеся). В матрице которую я привёл были значения точек:
2 1
2 2
и с ней надо делать всякую фигню, но вот застопорился с ОБРАТНОЙ МАТРИЦЕЙ, всё остальное легко делается... | |
|
|
|
|
|
|
|
для: DEM
(04.01.2012 в 01:28)
| | >А у моей матрицы все элементы диагонали будут всегда равны 0
Это значения не имет, главное, чтобы детерминант не был равен 0, а метод Гаусса он же строки складывает и вычитает, там от этих нулей в первом же проходе ничего не останется.
Дайте вашу матрицу, если не сложно. | |
|
|
|
|
|
|
|
для: DEM
(04.01.2012 в 01:26)
| | Эээ... там на хитрость идут, используют все переменные равные 1, поэтому в нормальном алгоритме их даже вычислять не надо.
Слушайте, вы наверное недавно алгебру слушали, правильно я помню, что умножение матрицы на обратную дает единичную матрицу (это собственно и к абзацу выше)? Помоему ни у вас ни у меня ни фига не обратная матрица, перемножаю и матрицы и обратную матрицу на коэффициенты - фигня получается... а должны получаться исходные данные. Ведь метод Гаусса он там не совсем обратную матрицу кажется делает, он делает матрицу треугольной, за счет чего можно быстро получить детерминант, а можно вообще без него...
Вам в любом случае сначала нужно вычислить детерминант - если он 0 дальше считать нет смысла, если он отличен от нуля - обратная матрица есть обязательно, я в принципе с этого и начал, да вот у несло меня в другую степь...
Надо наверное систему попроще брать - двумерную, вычислять вручную и смотреть где и что происходит, а потом уже обощать на трехмерную. | |
|
|
|
|
|
|
|
для: cheops
(04.01.2012 в 01:17)
| | И у Вас там есть условие:
if($a[$icol][$icol] == 0) return "Матрица сингулярна";
|
А у моей матрицы все элементы диагонали будут всегда равны 0 | |
|
|
|
|
|
|
|
для: cheops
(04.01.2012 в 01:17)
| | а как мне узнать параметр $b? У меня же просто матрица, а не уравнения... | |
|
|
|
|