Problema: resolver un sistema de ecuaciones lineales a 11 x 1 + a 12 x a 1n x n = b 1 a 21 x 1 + a 22 x a 2n x n = b 2... a n1 x 1 + a n2 x a nn x n = b n Ejemplo a 11 x 1 + a 12 x 2 + a 13 x 3 + a 14 x 4 = b 1 a 21 x 1 + a 22 x 2 + a 23 x 3 + a 24 x 4 = b 2 a 31 x 1 + a 32 x 2 + a 33 x 3 + a 34 x 4 = b 3 a 41 x 1 + a 42 x 2 + a 43 x 3 + a 44 x 4 = b 4
Algoritmo 1º construir matriz con coeficientes a ij 2º triangularizar: dejar matriz con ceros en esquina inferior izquierda: Dividir c/elemento de 1ª fila por a 11 (a 11 queda con 1) Multiplicar 1ª fila por a 21 y restar de fila 2 (a 21 será 0) Repetir proceso para resto de las filas Ejemplo: 1 a 12 a 13 a 14 b a 23 a 24 b a 34 b b 4 3º Sustituir en orden inverso x 4 = b 4 x 3 = (b 3 – a 34 *x 4 ) x 2 = (b 2 – a 23 *x 3 – a 24 *x 4 ) x 1 = (b 1 – a 12 *x 2 – a 13 *x 3 – a 14 *x 4 )
Solución en Java: diálogo n? a(1,1)? a(1,2)? … a(1,n)? b(1)? a(2,1)? … a(2,n)? b(2)? … a(n,1)? … a(n,n)? b(n)? x(1)=... x(n)=
//lectura de datos int n=U.readInt(“n?”); double[][]a=new double[n][n]; double[]b=new double[n]; for(int i=0; i<n; ++i) { for(int j=0; j<n; ++j) a[i][j]=U.readDouble( "a("+(i+1)+","+(j+1)+")?"); b[i]=U.readDouble("b("+(i+1)+")?"); }
//triangularizar matriz for(int i=0; i<n; ++i){ //dividir fila i por 1º de fila i double primeroi = a[i][i]; for(int j=i; j<n; ++j) a[i][j] /= primeroi; b[i] /= primeroi; //fila j=fila j - fila i * 1º de fila j for(int j=i+1; j<n; ++j){ double primeroj = a[j][i]; for(int k=i; k<n; ++k) a[j][k] -= a[i][k]*primeroj; b[j] -= b[i]*primeroj; }
//calculo de resultados double[]x=new double[n]; for(int i=n-1; i>=0; --i) { double suma=0; for(int j=i+1; j<n; ++j) suma += x[j]*a[i][j]; x[i] = (b[i]-suma); U.println("x("+(i+1)+")=" + x[i]); }
Solución Matlab “a la Java” A=[…; …; … ]; %matriz de coeficientes B=[nº, nº, …,nº]; %vector de resultados %triangularizar for i=1:n primeroi=a(i,i); for j=i:n a(i,j)=a(i,j)/primeroi; end b(i)=b(i)/primeroi; for j=i+1:n primeroj=a(j,i); for k=i:n a(j,k) = a(j,k) – a(i,k)*primeroj; end b(j) = b(j) – b(i)*primeroj; end
Solución Matlab “a la Java” %calcular resultados x=zeros(1,n); for i=n:-1:1 suma=0; for j=i+1:n suma=suma+x(j)*a(i,j); end x(i)=(b(i)-suma); end disp(x);
Solución en Matlab “a la Java-Matlab” %triangularizar for i=1:n a(i,i:n)=a(i,i:n)/a(i,i); b(i)=b(i)/a(i,i); for j=i+1:n k=i:n; a(j,k)=a(j,k)- a(i,k)*a(j,i); b(j) = b(j) – b(i)*a(j,i); end %calcular resultados x=zeros(1,n); for i=n:-1:1 suma=sum( x(i+1:n).* a(i,i+1:n) ); x(i)=(b(i)-suma); end disp(x);
Solución “a la Matlab” A=[…; … ; … ]; %matriz de coeficientes a(i,j) B=[nº; nº ; …;nº]; %vector-columna de b(i) X=inv(A)*B; Explicación A*X = B inv(A)*A*X = inv(A)*B pero inv(A)*A=I(1 en diagonal) X = inv(A)*B
Invertir una matriz de 2 x 2 A=[ nº nº ; nº nº ]; %matriz de 2 x 2 inv2(A) %inv2(x) inversa de matriz cuadrada de 2x2 function i=inv2(x) i=1/det2(x) * [x(2,2), –x(1,2); -x(2,1), x(1,1)]; %det2(x): determinante de matriz cuadrada de 2x2 function d=det2(x) d=x(1,1)*x(2,2) – x(1,2)*x(2,1);
Ejercicio a=b*c; es la instrucción para multiplicar dos matrices en Matlab. Escriba en Java las instrucciones que logren el mismo objetivo, es decir, en que cada a(i,j) se calcula como sum( b(i,:).* c(:,j) )
int filas=b.length, cols=c[0].length, n=c.length; if(b[0].length != n) U.abortar(“dimensiones incompatibles”); double[][]a=new double[filas][cols]; for(int i=0; i<filas; ++i) for(int j=0; j<cols; ++j) for(int k=0; k<n; ++n) a[i][j] += b[i][k] * c[k][j];
//función que multiplica 2 matrices static public double[][] producto( double[][]x,double[][]y) { int filas=x.length, cols=y[0].length, n=y.length; if(x[0].length != n) U.abortar(“dimensiones incompatibles”); double[][]a=new double[filas][cols]; for(int i=0; i<filas; ++i) for(int j=0; j<cols; ++j) for(int k=0; k<n; ++n) a[i][j] += x[i][k]+y[k][j]; return a; }
Uso: double[][]b=new double[M][N]; double[][]c=new double[N][P];... double[][]a=producto(b,c); double[][]d=new double[N][N];... double[][]cuadrado=producto(d,d);
Uso: //matriz identidad double[][]I=new double[N][N];//ceros for(int i=0; i<N; ++i) I[i][i]=1; double[][]x=producto(a,I); //resultado? //invertir matriz double[][]inversa=inv(a); double[][]x=producto(a,inversa); //resultado?