A continuación, mostraré como obtener la solución a un sistema de ecuaciones lineales por el método de Gauss. Pero claro, no necesitamos calculadoras ni lápices ni papel… todo lo hará nuestro script de PHP.
Crearemos primero una interfaz sencilla, para conocer primero el numero de filas y columnas, y después los valores de la matriz. Ojo, si es un sistema común, se sobreentiende que el número de filas es menor por uno al número de columnas. De manera que la matriz siempre debe quedar del orden (n,n+1).
Código de la interfaz inicial XHTML:
<form action="gauss.php" method="post">
<fieldset>
<legend>Orden de la matriz</legend>
<table>
<tr>
<td><p>Numero de filas</p></td>
<td><p><input name="Matriz[filas]” /></p></td>
</tr>
<tr>
<td><p>Numero de columnas</p></td>
<td><p><input name=”Matriz[columnas]” /></p></td>
</tr>
<tr>
<td colspan=”2″>
<p><input type=”submit” value=” Crear matriz “></p>
</td>
</tr>
</fieldset>
</form>
Una vez establecido el orden de la matriz, continuamos leyendo los valores la misma. Para esto, cacharemos los valores en un archivo PHP y crearemos dinamicamente una tabla con campos de texto para introducir los valores de la matriz. El archivo se llama en este caso gauss.php.
<?php
$filas = $_POST['Matriz']['filas'];
$columnas = $_POST['Matriz']['columnas'];
?>
<form action=”gaussiana.php” method=”post”>
<table>
<?php for($i = 1; $i <= $filas; $i++ ) { ?>
<tr>
<?php for($j = 1; $j <= $columnas; $j++ ) { ?>
<td>
<input type=”text” name=”A[<?php echo $i ?>][<?php echo $j ?>]“/>
</td>
<?php } ?>
</tr>
<?php } ?>
<tr>
<td colspan=”<?php echo $columnas ?>”>
<p><input type=”submit” class=”submit” value=” Resolver matriz”
></p>
</td>
</tr>
</table>
<input type=”hidden” name=”filas” value=”<?php echo $filas ?>”/>
<input type=”hidden” name=”columnas” value=”<?php $columnas ?>”/>
</form>
Desde el form del archivo anterior llamamos a otro archivo que se llama gaussiana.php, ahi llegarán todos los valores de la matriz. Desde ahí mismo también instanciaremos nuestra clase que será la que resuelva la matriz.
En este archivo debe haber una inclusión al archivo donde vayamos a poner la clase -en caso de tenerla aparte- de manera que, minimamente, gaussiana.php debe contener:
<?php
$A = $_POST['A'];
$filas = $_POST['filas'];
$columnas = $_POST['columnas'];
$method = new Gauss();
$method->setRows( $filas );
$method->setCols( $columnas );
$method->setMatrix( $A );
$method->getGaussSolution();
?>
Ahora sí, viene lo bueno: la clase que resuelve la matriz. Tiene 3 propiedades, 3 métodos set, el método de solución y un método de impresión:
class Gauss {
private $filas;
private $columnas;
private $matriz;
/**
* Establece el número de filas de la matriz
* @param int filas
* @return void
*/
public function setRows( $filas ){
$this->filas = $filas;
}
/**
* Establece el número de columnas de la matriz
* @param int columnas
* @return void
*/
public function setCols( $columnas ){
$this->columnas = $columnas;
}
/**
* Establece la matriz a la que se aplicará el método de solución
* @param array matriz
* @return void
*/
public function setMatrix( $matriz ){
$this->matriz = $matriz;
}
/**
* Obtiene la solución de la matriz por el método de Gauss
* @param void
* @return void
*/
public function getGaussSolution(){
$this->mostrarMatriz();
for($x = 1; $x <= $this->filas; $x++){
$pivote = $this->matriz[$x][$x];
for($i = $x; $i <= $this->filas; $i++ ){
for($j = $x; $j <= $this->columnas; $j++ ){
if($i == $x) {
$this->matriz[$i][$j] /= $pivote;
continue;
} elseif( $j == $x && $i != $x ){
$aux = $this->matriz[$i][$j] * (-1);
}
$this->matriz[$i][$j] =
$this->matriz[$x][$j] * $aux
+ $this->matriz[$i][$j];
}
$this->mostrarMatriz();
}
}
for($x = 4; $x > 0; $x–){
$pivote = $this->matriz[$x][$x];
for($i = $x-1; $i > 0; $i– ){
for($j = $x; $j <= $this->columnas; $j++ ){
if( $j == $x ){
$aux = $this->matriz[$i][$j] * (-1);
}
$this->matriz[$i][$j] =
$this->matriz[$x][$j] * $aux
+ $this->matriz[$i][$j];
}
$this->mostrarMatriz();
}
}
}
/**
* Imprime la matriz en una tabla
* @param void
* @return void
*/
private function mostrarMatriz(){
echo ‘<table>’;
for($i = 1; $i <= $this->filas; $i++ ){
echo ‘<tr>’;
for($j = 1; $j <= $this->columnas; $j++ ){
echo ‘<td>’;
echo ‘<p>’.$this->matriz[$i][$j].’</p>’;
echo ‘</td>’;
}
echo ‘</tr>’;
}
echo ‘</table>’;
}
}
Es todo… parece que no pero, estoy seguro que a más de uno le va a servir… así como a mi.