12 Marzo 2008

Método de Gauss en PHP

Por Abel

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.


Technorati tags: , , , , , ,


Entradas posiblemente relacionadas:


Este artículo fue escrito el 12 de Marzo de 2008 y se encuentra en la(s) categoría(s) de Programacion. Puedes seguir las respuestas a esta entrada a traves del Feed RSS. También puedes dejar un comentario, o hacer un trackback desde tu propio blog.

Actualmente hay 6 comentarios para “Método de Gauss en PHP”

Deja el tuyo.

  1. 1

    godie:
    Marzo 23rd, 2008

    esta bien facil solo intentelo xD

    aggrreee loco

  2. 2

    Nelson:
    Abril 21st, 2008

    Hola, estube tratando de correr el pogramaica y me encuentro con un problema, es que cuando me tendria que mostar la matriz resuelta no me muestra nada, osea gaussiana.php no me muestra nada. Otro duda es; yo a la classe la tengo aparte, hice la inclucion pero quiero saber si esta bien. Gracias espero una respueta

  3. 3

    Abel:
    Abril 22nd, 2008

    Hola Nelson, pues no sé cuál podría ser el error contigo. Si estás ejecutando el método getGaussSolution() ahí está la llamada al método que hace la impresión de la matriz.

    Falta que expliques si el PHP está tirando algún error o si el error es de semántica.

  4. 4

    Nelson:
    Abril 22nd, 2008

    Hola, Abel, gracias por responder, yo segui los pasos tal cual vos indicaste para utilizarlo. Solo que cree otro archivo aparte para poner la el codigo de la clase que vos das y lo llame: “Classgauss.php”
    En el archivo “gaussiana.php” puse el codigo que indacas en el post y le agregue un: include(”ClassGauss.php”), solo eso agregue al codigo de gaussiana.php; Ahora bien, ejecuto y pongo los rangos de la matrz, luego los valores y cuando le doy en Resolver matriz, pasa a la pantalla siguiente pero me la muestra en blanco, ni datos ni la tabla dibujada, solo todo en blanco.
    Bueno Abel desde ya graias por responderme, y espero que esta informacion te aya servido para mandarme un nuva repuesta.

  5. 5

    rachinopopo:
    Mayo 13th, 2008

    Gracias amigo me ha servido de guía para un programa similar, mmm pero tengo un error con tu programa, lo que sucede es que no veo el resultado, pero eta bueno. Gracias, espero y pongas mas codigos, se te agradecen.

  6. 6

    Abel:
    Mayo 13th, 2008

    Eres el segundo que dice que no ve el resultado… :S no sé que pasará, quizás tuve algún error a la hora pasar de los archivos fuentes a aquí…

    Voy a checarlo a ver qué es… pero de verdad sí funciona, de eso estoy satisfecho :)

Deja un comentario

  • Ventana al cosmos

  • La Sombra de la Tierra

  • Publicidad