Subido por laalpa2000

Entregable 2II

Anuncio
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
Descargar