Witam, tworzę aplikację do pracy licencjackiej w której ważną rolę odgrywa odwracanie macierzy o dowolnym rozmiarze (oczywiście kwadratową). Poniżej zamiszczam mój pomysł, jakkolwiek nie jest on idealny ale już cos. Główny problem to wywalanie błędu Division by zero. często zdarza się że wyznacznik jest ekstremalnie bliski zeru, jednak zakres tybu zmiennej tego nie obejmuje i nie wystarcza wprowadzenie sprawdzania cz wartośc jest różna od zera.
Kod:
<?php
// pobieranie z bazy danych macierzy zaczcyna od drugiej kolumny bo pierwsza to in
deks wierszy
$kwerenda = 'select k1';
for($i=2;$i<=$size;$i++)
{
$kwerenda=$kwerenda.', k'.$i;
}
$kwerenda=$kwerenda.' from XTX'.$gen.';';
$i=1;
{
$t=0;
for($j=1;$j<=$size;$j++)
{
//echo $array[$t];
$A[$i][$j]=$array[$t];
$t=$t+1;
}
$i=$i+1;
}
// uzupełnianie tablicy o macierz jednostkową
for($i=1;$i<=$size;$i++)
{
for($j=$size+1;$j<=$size*2;$j++)
{
$c=$j-$size;
if ($i<>$c)
{
$A[$i][$j]=0;
}
if ($i==$c)
{
$A[$i][$j]=1;
}
}
}
// uproszczone odwracanie na podstawie eliminacja Gaussa-Jordana
for($x=1;$x<=$size;$x++)
{
$Akw=$A[$x][$x];
for($j=$x;$j<=$size*2;$j++)
{
$A[$x][$j]=$A[$x][$j]/$Akw;
}
for($i=1;$i<=$size;$i++)
{
$Akw=$A[$i][$x];
for($j=1;$j<=$size*2;$j++)
{
if($i<>$x)
{
$A[$i][$j]=$A[$i][$j]-$Akw*$A[$x][$j];
}
}
}
}
// wyniki do nowej tabeli
for($i=1;$i<=$size;$i++)
{
for($j=1;$j<=$size;$j++)
{
$kwerenda='UPDATE XTXodw'.$gen.' SET k'.$j.'='.$A[$i][$j+$size].' where w='.$i.';';
}
}
?>