Professional Documents
Culture Documents
/**
* <p>Title: Matrices Dispersas
* <p>Description: Realiza las operaciones basicas con matrices</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: UMSNH</p>
* @author Dr. Felix Calderon Solorio
* @version 1.0
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class Nodo
{
float dato;
int col;
Nodo sig;
Nodo (float d, int r, Nodo s)
{
dato = d;
col = r;
sig = s;
}
}
class Lista
{
Nodo inicio;
Nodo fin;
Lista ()
{
inicio = fin = null;
}
void agrega(float d, int r)
{
Nodo aux = new Nodo(d, r, inicio);
inicio = aux;
if(fin == null) fin = aux;
}
}
class MatrizD
{
Lista []a;
int n, m;
MatrizD(int nr, int nc)
{
int i;
n = nr;
m = nc;
a = new Lista[n];
int i, j;
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
e = elemento(i,j);
if(e != null) salida += e.dato;
else
salida += 0.0;
salida += "\t";
}
salida += "\n";
}
System.out.println(salida);
}
// *******************************************************************
static public void suma (MatrizD resul, MatrizD m1, MatrizD m2)
{
int i, j;
float suma;
int nr, nc;
nr = m1.n; nc = m1.m;
if(m1.n != m2.n || m1.m != m2.m || resul == null || nr != resul.n || nc !=
resul.m)
{
JOptionPane.showMessageDialog(null, "Error sums: las dimesiones de la matr
iz no son iguales",
"ERROR", JOptionPane.INFORMATION_MESSAGE);
return;
}
if(resul == null || nr != resul.n || nc != resul.m) return;
for(i=0; i<nr; i++)
for(j=0; j<nc; j++)
{
suma = m1.valor(i,j) + m2.valor(i,j);
resul.agrega(suma, i, j);
}
}
// *******************************************************************
static public void resta (MatrizD resul, MatrizD m1, MatrizD m2)
{
int i, j;
float suma;
int nr, nc;
nr = m1.n; nc = m1.m;
if(m1.n != m2.n || m1.m != m2.m || resul == null || nr != resul.n || nc !=
resul.m)
{
JOptionPane.showMessageDialog(null, "Error resta: las dimesiones de la mat
riz no son iguales",
"ERROR", JOptionPane.INFORMATION_MESSAGE);
return;
}
for(i=0; i<nr; i++)
for(j=0; j<nc; j++)
{
suma = m1.valor(i,j) - m2.valor(i,j);
resul.agrega(suma, i, j);
}
}
// *******************************************************************
static public void multiplica (MatrizD resul, MatrizD m1, MatrizD m2)
{
int i, j, k;
float suma;
int nr, nc;
nr = m1.n; nc = m2.m;
if(m1.m != m2.n || resul == null || nr != resul.n || nc != resul.m)
{
JOptionPane.showMessageDialog(null, "Error multiplica: las dimesiones de l
a matriz no son iguales",
"ERROR", JOptionPane.INFORMATION_MESSAGE);
return;
}
for(i=0; i<nr; i++)
for(j=0; j<nc; j++)
{
suma = 0;
for(k=0; k<m1.m; k++)
suma += m1.valor(i,k) * m2.valor(k,j);
resul.agrega(suma, i, j);
}
}
// *******************************************************************
static public void multiplica (MatrizD resul, float fac, MatrizD a)
{
int i, j;
int nr, nc;
nr = a.n;
nc = a.m;
if(resul == null || nr != resul.n || nc != resul.m)
{
JOptionPane.showMessageDialog(null, "Error multiplica: las dimesiones de l
a matriz no son iguales",
"ERROR", JOptionPane.INFORMATION_MESSAGE);
return;
}
for(i=0; i<a.n; i++)
for(j=0; j<a.m; j++)
resul.agrega(a.valor(i,j)*fac, i, j);
}
// *******************************************************************
public static void transpuesta(MatrizD at, MatrizD a) {
int nr, nc, i, j;
nr = a.m; nc = a.n;
if( at == null || nr != at.n || nc != at.m)
{
JOptionPane.showMessageDialog(null, "Error transpuesta: las dimesiones de
la matriz no son iguales",
"ERROR", JOptionPane.INFORMATION_MESSAGE);
return;
}
for (i = 0; i < nr; i++)
for (j = 0; j < nc; j++)
at.agrega(a.valor(j,i),i,j);
}
// *******************************************************************
public static void Gradiente_conjugado(MatrizD A, MatrizD x, MatrizD b)
{
if(A.n != A.m || A.n != x.n || A.n != b.n)
{
JOptionPane.showMessageDialog(null,
"Error Grafinte_conjugado: las dimesiones de la matriz no son iguales"
,
"ERROR", JOptionPane.INFORMATION_MESSAGE);
return;
}
float alpha, beta, rr0, rr1;
int MaxIter = A.n;
MatrizD rr
MatrizD pAp
= new MatrizD(1,1);
= new MatrizD(1,1);
MatrizD
MatrizD
MatrizD
MatrizD
MatrizD
MatrizD
=
=
=
=
=
=
Ap
r
rT
p
aux1
aux2
new
new
new
new
new
new
MatrizD(A.n, 1);
MatrizD(A.n, 1);
MatrizD(1, A.n);
MatrizD(A.n, 1);
MatrizD(1, A.n);
MatrizD(A.n, 1);
MatrizD.multiplica(Ap, A, x);
MatrizD.resta(r, Ap, b);
MatrizD.transpuesta(aux1, r);
MatrizD.multiplica(rr, aux1, r);
rr0 = rr.valor(0,0);
MatrizD.multiplica(p, -1f, r);