Métodos Numéricos I Entregable I Laura Alcázar Palacios 1 Primer ejercicio El código es MaxPivot[b_, etapa_] := Module[{l, lista}, l = Dimensions[b]; lista = Table[b[[i, etapa]], {i, etapa, l[[1]]}]; (*Lista con candidatos a pivote*) lista = Abs[lista]; Ordering[lista, -1][[1]] + etapa - 1 ] {{0, 2, 1, 2}, {11, 0, 1, 3}, {3, 1, -4, 2}, {-4, 0, 1, 1}} // MatrixForm MaxPivot[{{0, 2, 1, 2}, {11, 0, 1, 3}, {3, 1, -4, 2}, {-4, 0, 1, 1}}, 3] GaussPivote[b_] := Module[{t, mres, r, i, a, fpiv}, t = Dimensions[b]; mres = b; For[k = 1, k < l[[1]], k++, (*k es mi variable etapa*) (*Fila con pivote*) fpiv = MaxPivot[mres, k]; (*Permutar filas*) a = mres[[k]]; mres[[k]] = mres[[fpiv]]; mres[[fpiv]] = a; (*Formar 0 bajo el pivote*) For[i = k + 1, i <= l[[1]], i++, r = -mres[[i, k]]/mres[[k, k]]; mres[[i]] = mres[[i]] + r*mres[[k]]; ](*Fin For 2*) 1 ];(*Fin For 1*) mres (*Matriz triangular deseada*) ] (*Comprobación*) B = {{0, 2, 1, 2}, {1, 0, 1, 3}, {3, 1, -4, 2}, {-4, 0, 1, 1}}; B // MatrixForm GaussPivote[B] // MatrixForm En este ejercicio lo que hacemos es programar una función, llamada GaussPivote que aplique, sobre una matriz dada, el método de Gauss con algoritmo de pivoteo parcial y devuelva la matriz triangular resultante. Partimos del algoritmo descrito en los ejercicios previos al entregable (pseudocódigo GaussSimple) ejercicio 4, en cada etapa k seleccionar, de entre los elementos situados bajo el k-ésimo elemento diagonal, aquel cuyo valor absoluto sea mayor. Se intercambiará la fila correspondiente por la fila k-ésima (haciendo ceros en cada fila i = k + 1, . . . , n). 2 Segundo Ejercicio Primera parte: SolTriangular[A_, b_] := Module[{x, l, s}, l = Length[b]; x = ConstantArray[0, l]; x[[l]] = b[[l]]/A[[l, l]]; For[i = l - 1, i >= 1, i--, s = Sum[A[[i, j]]*x[[j]], {j, i + 1, l}]; x[[i]] = (b[[i]] - s)/A[[i, i]]; ]; x ] SolGaussPivote[A_, b_] := Module[{Mx, d, l}, Mx = Transpose[A]; AppendTo[Mx, b]; Mx = Transpose[Mx]; (*matriz ampliada*) l = Dimensions[Mx]; Mx = GaussPivote[ Mx]; (*Matriz ampliada resuelta mediante pivot parcial*) d = Flatten[ 2 Take[Transpose[Mx], -1]]; (*Segundo miembro modificado*) Mx = Transpose[Drop[Transpose[M], -1]]; (*Matriz de los coeficientes modificada TRASPUESTA*) Print["El resultado es: ", SolTriangular[Mx, d]] ] Llamamos SolGaussPivote a la función que aplique, sobre una matriz dada, el método de Gauss mediante pivoteo parcial que hemos usado en la actividad anterior. Esta función tomará dos parámetros: la matriz del sistema (A) y el vector segundo miembro (b) y devolverá un vector que represente la solución, x, del sistema de ecuaciones A*x = b. Segunda parte: a = {{1, -1, 0, 1}, {-1, 1, 1, 2}, {-4, 4, 0, -1}, {1, 2, 4, 2}}; b = {0, -1, 0, -1}; a // MatrixForm b // MatrixForm SolGaussPivote[a, b] LinearSolve[a, b] Utilizamos la función SolGaussPivote para resolver el sistema de ecuaciones, y luego lo comprobamos Tercera parte: Q Q p p = {{0, 16, 32}, {-24, 40, 24}, {32, 16, 0}}; // MatrixForm = {32, -16, 0}; // MatrixForm SolGaussPivote[Q, p] LinearSolve[Q, p] Solve[16 y + 32 z == 32 && -24 x + 40 y + 24 z == -16 && 32 x + 16 y == 0, {x, y, z}] Det[Q] Inverse[Q].p Buscamos un sistema de tres ecuaciones con tres incógnitas que no pueda resolverse mediante el método de Gauss simple (sin pivoteo) pero sı́ mediante el método de Gauss con pivoteo parcial. 3 Después hacemos tres comprobaciones y vemos que es cierto y que además la solución es correcta Cuarta parte: H = HilbertMatrix[15]; b = ConstantArray[1, 15]; SolGaussPivote[H, b] Lo que hacemos es fabricar la matriz de Hilbert y luego le aplicamos la función SolGaussPivote 4