1 Problema: resolver un sistema de ecuaciones lineales a 11 x 1 + a 12 x 2 +... + a 1n x n = b 1 a 21 x 1 + a 22 x 2 +... + a 2n x n = b 2... a n1 x 1 + a n2 x 2 +... + 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
2 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 1 0 1 a 23 a 24 b 2 0 0 1 a 34 b 3 0 0 0 1 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 )
3 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)=
4 //lectura de datos int n=U.readInt(“n?”); double[][]a=new double[n][n]; double[]b=new double[n]; for(int i=0; i
5 //triangularizar matriz for(int i=0; i
6 //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
7 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
8 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);
9 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);
10 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
11 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);
12
13 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) )
14 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
15 //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
16 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);
17 Uso: //matriz identidad double[][]I=new double[N][N];//ceros for(int i=0; i