X - CEIUCAWeb

Anuncio
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Párrafo Preliminar
Las páginas que siguen intentan servir de guía para el estudio de un primer curso de Métodos Numéricos, en el
sentido clásico de recurrir a linealizar métodos que tratan generalmente con variables continuas –usualmente
discretizadas- (tratando de prestar atención a las limitaciones inherentes a la representación numérica de los
mismos).
La implementación efectiva de los algoritmos está orientada al entorno Matlab, y muchos ejemplos y ejercicios son
planteados (y muchas veces resueltos) en dicho entorno. Sin embargo, su uso fluido, está sobreentendido –ya que
este no es un manual de Matlab-, y remitimos a la bibliografía sugerida en el curso y/o a la documentación propia del
mismo, para cualquier duda o explicación sobre este.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Aritmética de punto flotante
Debido a las dificultades para trabajar con una representación numérica que abarque a todos los números reales, es
habitual el uso de sistemas en los que se puede representar –y operar con sus elementos– un subconjunto finito de
IR. Los más frecuentes son los de aritmética de punto flotante:
Fijada una base de numeración b (generalmente b = 2, pero para operar a mano muchas veces daremos ejemplos
con b = 10), se representan exactamente aquellos números cuya expresión con base b es de la forma:
x = ±0.a1 a 2 ...a m ⋅ b p con a1 ≠ 0, a j ∈ {0,1,..., b} para j = 2,..., m , r ≤ p ≤ R donde r y R son números enteros, ó x = 0
(la representación del 0 se hace aparte). Se pide que a1 ≠ 0 para evitar el que haya distintas representaciones de un
mismo número (ya que por ejemplo: 23 = 0.23000 ⋅ 10 2 = 0.02300 ⋅ 10 3 = 0.00023 ⋅ 10 5 ; pidiendo a1 ≠ 0 solo es válida
la primera representación: 23 = 0.23000 ⋅ 10 2 .
En binario es particularmente elegante, ya que como a1 ≠ 0 debe ser a1 = 1 (y a j = 0, ó a j = 1, para j = 2,..., m ), por
lo que el “0.1” inicial se presupone siempre, de modos que sólo hace falta guardar en memoria el contenido de m-2
bits para los dígitos 1 ó 0 de a 2 ,..., a m , junto a un bit adicional para el signo, y se suelen elegir r y R de modo que
R − r = 2 k − 1 , de modo que haya 2 k exponentes posibles para la base 2, y ello se puede guardar entonces con k
bits (sin desperdiciar combinaciones), frecuentemente R = 2 k −1 y r = −(2 k −1 − 1) , por ejemplo r = -31, R = 32 (y por lo
tanto − 31 ≤ p ≤ 32 ). O sea que cualquier número de la forma x = ±0.a1 a 2 ...a m ⋅ 2 p con a1 ≠ 0 y a j ∈ {0,1} para j > 2
se representa con exactamente m-1 + k bits.
Escribamos algunos de los números de punto flotante con alguna elección de b,m,r y R para observar sus
características: Si b es 10, m es 3, r es -4 y R es 5, podemos representar exactamente los siguientes número
positivos (y además sus opuestos y el 0) –a la izquierda en punto flotante, y a la derecha en notación usual):
0.100 ⋅10 −4 = 0.0000100 

0.101 ⋅10 −4 = 0.0000101 
−7
 diferencia entre números consecutivos : 0.0000001 = 10
...

−4
0.999 ⋅10 = 0.0000999
0.100 ⋅10 −3 = 0.0001000 

0.101 ⋅10 −3 = 0.0001010 
−6
 diferencia entre números consecutivos : 0.000001 = 10
...

−3
0.999 ⋅10 = 0.0009990
…
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
…


0.101 ⋅101 = 1.01 
−2
 diferencia entre números consecutivos : 0.01 = 10
...

1
0.999 ⋅10 = 9.99
0.100 ⋅101 = 1
…
…
0.100 ⋅10 5 = 10000 

0.101 ⋅10 5 = 10100 
2
 diferencia entre números consecutivos : 100 = 10
...

5
0.999 ⋅10 = 99900
Notamos que la distancia entre números consecutivos va aumentando cuando aumenta el rango decimal de números
considerados.
Los mil primeros números representables –entre el menor número positivo representable exactamente:
-llámémoslo “min” = 0.100 ⋅10 −4 = 0.0000100 - y el milésimo: 0.100 ⋅ 10 −3 = 0.0001000 distan uno del otro en
0.0000001 (un diezmillonésimo)
Los últimos mil números representables están separados de 100 en 100 (10000, 10100, …, 99800, 99900).
Precisamente 99900 es el mayor número representable. Lllamémoslo “max” = 99900.
Los números entre 0.100 ⋅10 −4 = 0.0000100 y 0.999 ⋅105 = 99900 se redondean al número representable más
próximo.
De esta manera, en esta aritmética de punto flotante, si bien, por ejemplo, los números 74500 = 0.745 ⋅ 10 5 y
23 = 0.230 ⋅ 10 2 son representables exactamente, no lo es su suma. De hecho, si por abuso de notación denotamos
con + el resultado en punto flotante de la suma de dos números, entonces “ 74500 + 23 = 74500 ”. En efecto,
realmente es 74500 + 23 = 74523 = 0.74523 ⋅ 10 5 , que no es representable exactamente, estando entre
0.745 ⋅ 10 5 = 74500 y 0.746 ⋅ 10 5 = 74600 que sí son representables. Y el más cercano a 74523 es el menor de ellos:
0.745 ⋅ 10 5 = 74500 , y por ello en esta aritmética de punto flotante es: “ 74500 + 23 = 74500 ”. El menor número
positivo que, representable en aritmética de punto flotante que sumado a 74500 no da como resultado 74500 es 100,
o sea 0.100 ⋅ 10 2 = 100 . Se dice que 100 es el épsilon de máquina de 74500. De hecho es el épsilon de máquina de
todos los números representables entre 10000 y 99900.
De análoga manera, 0.0000001 = 10 −7 es el épsilon de máquina de 0.100 ⋅10 −4 = 0.0000100 y de todos los números
entre 0.100 ⋅10 −4 = 0.0000100 y 0.999 ⋅ 10 −4 = 0.0000999 . Por su parte, el épsilon de máquina del 1 (y de todos los
números entre 1 = 1.00 = 0.100 ⋅ 101 y 9.99 = 0.999 ⋅ 101 es 0.01 = 0.100 ⋅ 101 .
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Los números comprendidos entre “min” y “max” se redondean al número representable más próximo: Por ejemplo
0.3472 ⋅ 10 2 = 34.72 se redondea a 0.347 ⋅ 10 2 = 34.7 , y 0.3478 ⋅ 10 2 = 34.78 se redondea a 0.348 ⋅ 10 2 = 34.8 ,
igualmente 34.749, 34.7499, 34.7499999, etc se redondean a 34.7, y en cambio 34.7501, 34.750001, 34.7500001, etc,
se redondean a 34.8. Por simetría, 34.75 se redondea a 34.8 (es decir hacia arriba) –así la mitad de los dígitos x
después del fin de la mantisa representada –en este caso “0.347x-” se redondean hacia abajo (0,1,2,3,4) y la otra
mitad hacia arriba (5,6,7,8,9).
El error absoluto de redondeo al asignar a un número el representable más próximo depende de en qué rango está,
de modo que si estamos entre 10000 y 99900, podemos cometer un error de redondeo de hasta
1
⋅ 100 = 50
2
unidades, por ejemplo 24350 = 0.2435 ⋅ 10 5 se redondea por 24400 = 0.244 ⋅ 10 5 con un error de 50, que
evidentemente es la mitad del épsilon de máquina para el rango de 10000 a 99900.
Por su parte, el error absoluto al redondear 24.35 = 0.2435 ⋅ 10 2 por 24.4 = 0.244 ⋅ 10 2 es
1
⋅ 0.1 = 0.05 que
2
evidentemente es la mitad del épsilon de máquina para el rango de 10.0 a 99.9.
Sin embargo el error relativo es el mismo en ambos casos. Si, para normalizar, calculamos los errores relativos al
1
1
⋅ 100
⋅ 0.1
1
2
2
menor número del rango (10000 en el primer caso, 10.0 en el segundo), este es
=
= 0.01 , es decir la
10000
10
2
mitad del épsilon de máquina del 1. Es decir que el épsilon de máquina del 1 es una característica de la aritmética de
punto flotante considerada, y no depende del rango de valores en que esté el número a redondear (siempre que esté
entre “min” y “max”).
Por eso, al épsilon de máquina del 1 lo llamamos directamente épsilon de máquina (propiamente dicho).
Una operación que da un resultado mayor que “max” (o menor que “-max”), se dice un sobreflujo, y debe indicarse de
alguna manera. En Matlab, por ejemplo, se retorna Inf (por infinito).
Por ejemplo:
>>1.7*10^308+1.7*10^308
ans =
Inf
Una operación que da un número positivo entre “min” y 0 (o un negativo entre “-min” y 0) se dice un subflujo. Los
subflujos no siempre son anunciados. En Matlab se devuelve 0 sin ninguna advertencia.
Por ejemplo:
>> 10^-323-0.8*10^-323
ans =
0
En Matlab, las constantes importantes de la aritmética de punto flotante pueden obtenerse invocando “realmax” (lo
que llamamos “max”), “realmin” (lo que llamamos “min”), eps (el épsilon de máquina propiamente dicho, es decir el
de 1). La función eps() da el épsilon de máquina de un numero cualquiera.
Ejercicio
Con la aritmética de punto flotante mencionada arriba calcule:
i)
40+(60+10000)
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
ii)
(40+60)+10000
¿Qué conclusiones puede sacar de ello?
Normas vectoriales y matriciales
La mayoría de los problemas que somos capaces de tratar numéricamente, lo son, total o parcialmente, mediante
linealización. Es decir que en algún punto se aproximan por un modelo lineal.
Es por eso que en muchos paquetes numéricos se recurre a librerías de algoritmos de álgebra matricial. En particular
Matlab es esencialmente una interfaz para acceder a las librerías LINPACK y EISPACK.
Algunas cuestiones que en álgebra lineal exacta están definidas con precicón son algo más borrosas en álgebra
lineal numérica.
Por ejemplo:
A=[1 1+eps;1+eps 1+2*eps]; (donde eps es el épsilon de máquina) es una matriz de rango 1, porque las filas de la
matriz son l.i. El determinante de la matriz es:
1 * (1+2*eps)- (1+eps)*(1+eps) = 1+2*eps-1-2*eps-2*eps^2 = -2*eps^2 ≠ 0.
Pero numéricamente: >> (1+eps)*[1 1+eps]-[1+eps 1+2*eps]
ans =
0 0
Es decir que las filas son numéricamente l.d.
Y de hecho el rango de la matriz (numéricamente, en Matlab) es 1.
Es entonces necesario poder medir cuándo dos vectores o matrices son “casi iguales”, “casi nulas”, “casi l.d.”.
Para ello introducimos métricas mediante normas vectoriales y matriciales.
En IR n ≅ IR nx1 ≅ IR 1xn están disponibles las normas p: ( a1 ,..., a n )
(a1 ,..., a n )
∞
p
(
p
= a1 + ... + a n
)
p 1/ p
para 1 ≤ p < ∞ , y
= max( a1 ,..., a n ) . La norma más frecuente es la euclídea (o usual), correspondiente a p = 2.
Se puede probar que todas las normas p son comparables entre sí (cada una mayora a algún multiplo positivo de
cualquier otra), pero para determinada cuestión una u otra puede ser más natural. La norma del vector fila o columna
X puede invocarse en Matlab con: norm(X,p) (naturalmente, como p = 2, es la usual, norm(X) es igual que
norm(X,2).
Para las matrices sólo se define A
p
= max AX , pero el cálculo efectivo en general es difícil (por la maximización),
X
p
=1
por lo que están disponibles solamente:
La norma 2: norm(A) ó norm(A,2).
La norma 1: norm(A,1) que resulta la mayor de las sumas de los valores absolutos de los elementos de las
columnas.
La norma ∞: norm(A,Inf) que resulta la mayor de las sumas de los valores absolutos de los elementos de las filas.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
La norma de Fröbenius: norm(A,’fro’), que consiste en la raíz cuadrada de la suma de los cuadrados de todos los
elementos de la matriz.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Descomposiciones matriciales
A continuación veremos que, en muchas circunstancias, es posible escribir una matriz como productos de matrices
que, en algún sentido son más sencillas o más manejables. E iremos viendo que propiedades de la matriz original
podemos abstraer de ellas y que aplicaciones podemos darle. De hecho, posiblemente ya conozcamos previamente
alguna descomposición. Por ejemplo, si la matriz cuadrada A, de n x n, tiene n autovectores linealmente
independiente, es posible escribir a A como: A = C * D * C −1 , donde D es una matriz diagonal, tal que los elementos
de la diagonal satisfacen que A * C j = D jj * C j , donde el escalar D jj es el j-ésimo elemento de la diagonal de D y el
vector (columna) es la j-ésima columna de C (por lo tanto las columnas de C son una base de autovectores de C).
Recordemos que a pesar de su importancia, la diagonalización de una matriz A = C * D * C −1
y
A 0

0 U
0 0

D =0 0
0 0

0 0

0 0
0 0 0
0 0 0
T 0 0
0 O 0
0 0 V
0 0 0
0 0 0
0
0
0
0
0
A
0
0

0
0

0
0 
0

L
 A
 A 
 
  
 U 
U  
 
T  
 T 
  
(con C =   O  ......... O  . 
 
V  
 V 
  
 E 
E 
  
  
 C n 
  C 1
) tiene el inconveniente de que no puede hallarse para todas las matrices cuadradas,
y ni si quiera definirse para las rectangulares.
Como sustituto existe la descomposición en Valores Singulares (SVD: Singular Value Decomposition):
Dada A ∈ R nxk , ∃ U ∈ R nxn , S ∈ R nxk y V ∈ R kxk tales que :
• U es ortogonal de nxn (o sea U −1 = U t = U ' pues en Matlab la traspuesta es la tilde vertical),
• V es ortogonal de kxk (o sea V −1 = V t = V ' )
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
• S es seudodiagonal de nxk
o,
 s11

0
0

0
0
S =
0

 .
 .

 .
0

0
.
0
0
0
.
0
0
.
0
0
.
0
0
0
.
0
.
.
.
.
 s11

0
(mismo tamaño de A) , o sea, S =  0

0
0

0 

0 
0 

 s11 0

0 
0 .
s nn 
si n>k ,
o
S = 0 0


0
0 0

. 
0 0


.

. 
0 
s11 , s 22 ,..., sii ,..... se llaman VALORES SINGULARES,
• A = U * S * V ' (o sea U * S * V
−1
ya que V ' = V
0 0 0
0
0 0
.
0 0
0
0 0
0 . 0
0 0 .
0
0
.
.
0 0 0 s nn
0 

0 0 0 
. 0 0 

0 . 0 
0 0 s nn 
.
.
.
.
.
.
.
.
0 0
0

.
.  si k>n ,

.
0 
0 0
si n=k ; con s11 ≥ s 22 ≥ .... ≥ 0
donde
vale que:
−1
, de forma análoga a la diagonalización).
Proposición: cond(U)=1 y cond(V)=1 .
(con Matlab el número de condición se calcula con el comando “cond”, y para U y V es 1 , ya que son matrices ortogonales).
Recordemos que el Número de Condición es el mayor factor por el que se pueden llegar a multiplicar los errores relativos al
aplicarle la matriz a un vector.
 s11
si n > k
 s kk
máximo valor singular 
cond ( A) := cond ( S ) =
o
=
mínimo valor singular s11
si k > n
 s nn
.
Si A es cuadrada, esto coincide con la definición anterior,
Si A es rectangular, la igualdad anterior cond ( A) := cond ( S ) se toma como la definición de cond(A) (y en cualquier caso,
numéricamente siempre se calcula así ).
Practicamos con el Matlab, y abrimos la aplicación “eigshow”, poniendo:
>> eigshow (en la ventana de comandos) así abre la aplicación con la primera matriz de una galería de matrices.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Observación:
>> eigshow (A)
con A una matriz de 2x2 , abre la aplicación con la matriz que le damos.
Default
eig/svd
con xe y perpendiculares siempre, hacemos un click allí para que quede
svd/eig
así grafica svd
Cuando Ax y Ay también son perpendiculares, allí tenemos el cambio de base de la svd, y las longitudes de Ax y Ay son s11 y s 22
(los valores singulares de la diagonal de S).
Ax
y
Ay (o viceversa representan la máxima dilatación o contracción, y por eso el cociente mide el mayor factor por el
que puede multiplicarse el error relativo al multiplicar por A, y por eso cond ( A) := cond ( S ) =
s11
.
s 22
En Matlab el comando “svd” trabaja como el comando”eig” (que da autovectores y autovalores ) recordemos:
>> eig (A)
da los Autovalores si A es cuadrada
λ1
.
.
diagonal de D
λn
análogamente:
>> svd (A)
da los Valores Singulares
s11
.
diagonal de S.
.
s kk (o s nn )
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
• • •


>> [Matriz 1 , Matriz 2]=eig(A) , donde Matriz 1=  • • • 
• • •


 λ1

0
Matriz 2=  0

0

0
da C= la matriz de autovectores (en columna) , y,
0

0
0 . 0 0  da D= matriz de Autovalores.

0 0 . 0

0 0 0 λn 
0 0 0
. 0 0
Análogamente,
• • •


>> [Matriz 1 , Matriz 2 , Matriz 3 ]=svd(A) , donde Matriz 1=  • • •  da U ∈ R nxn
• • •


 s11 0 0 0 0 


0 . 0 0 0 
0 0 . 0 0 


 s11 0 0 0 0 0 0 . . . 0 


0 0 0 . 0 
.
0 . 0 0 0 0 0
0 0 0 0 s 
kk 
Matriz 2 = 
o, S =  0 0 . 0 0
. .
.  da S= matriz de Valores Singulares


0 . . . 0 
0
0
0
.
0
.
.
.




. 
0 0 0 0 s
 .
0 0 . . . 0 
nn

 .

.


. 
 .
0 . . . 0 


Matriz 3 = V ∈ R kxk .
Planteamos un pequeño ejercicio consistente en tomar una matriz aleatoria de 9x5, hallar la svd y verificar las propiedades.
Su resolución sería:
>> A=randn(9,5)
>> [U,S,V]= svd (A)
da una matriz de 9x5 cuyos coeficientes están elegidos al azar con distribución normal estándar
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO


U =









S =









V =







>> U *U '
1 . 0


 0 . 0  la matriz identidad de 9x9 ¡!! Y así confirmamos la ortogonalidad de U.
0 . 1


>> V *V '
1 . 0


 0 . 0  la matriz identidad de 5x5 ¡!! Y así confirmamos la ortogonalidad de V.
0 . 1


>>cond(U)
1
verificamos que U tiene condición 1
>>cond(V)
1
verificamos que V tiene condición 1
>>cond(S)
……….
>>cond(A)
……….
>>S(1,1)/S(5,5)
…………
dan los tres igual!!!! Y así verificamos que cond ( A) := cond ( S ) =
máximo valor singular
.
mínimo valor singular
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
Ahora ingresemos una matriz (tipo) A
1.0000
1.0001
5.0005
100.0010
10.0001
7.0000
2.0000 4.0000
2.0002 4.0003
10.0009 20.0020
200.0030 400.0040
20.0002 40.0005
8.0000
9.0000
>> A=[1 2 4;1.0001 2.0002 4.0003;5.0005 10.0009 20.0020;100.001 200.003 400.004;10.0001 20.0002 40.0005;7 8 9]
A=
1.0000 2.0000 4.0000
1.0001 2.0002 4.0003
5.0005 10.0009 20.0020
100.0010 200.0030 400.0040
10.0001 20.0002 40.0005
7.0000 8.0000 9.0000
Y observamos que es de rango completo, poniendo:
>> rank(A)
3
Pero mirándola uno diría que las 5 primeras filas son “casi” l.d. (linealmente dependientes), es decir, que son “casi” múltiplos de
~
la primera, y que en este caso uno puede dar “a ojo” una matriz A próxima a A , pero de rango 2 :
2
4 
 1
 1
2
4 

10 20 
~  5
A=

100 200 400
 10 20 40 


8
9 
 7
En una matriz más grande eso podría ser útil, por ejemplo para comprimir la información (A tiene 18 coeficientes, pero para
~
recordar A sólo tengo que guardar 10 números): 1,2,4,1,5,100,10,7,8 y 9 pues:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
fila1
1 2 4



 ( fila1) × 1

 ( fila1) × 5



 ( fila1) × 100

 ( fila1) × 10


7 8 9


Pero hacerlo a ojo en una matriz más grande es difícil.
Observemos que:
>> svd (A)
ans =
461.3432
5.3119
0.0002
O sea que:
0
0 
461.3432

0
5.3119
0 


0
0
0.0002
S=

0
0
0 


0
0
0 


0
0
0 

También S de rango 3, de hecho rango(S)=rango(A) siempre!!
Más aún, internamente Matlab calcula el rango de cualquier matriz contando cuántos valores singulares (elementos de la
diagonal de S ) son ≠ 0 . (numéricamente es mucho más rápido que verificar independencia lineal de filas o columnas)
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Ahora es fácil encontrar una matriz “parecida” a S pero de rango 2 :
>> [U,S,V]= svd (A)
pongo en 0 el coeficiente 0.0002 que era “despreciable” respecto de 461.3432 y de 5.3119 .
>> S(3,3)= 0
0
461.3432

0
5.3119


0
0
Scambiada = 
0
0


0
0

0
0

Entonces:
>> Aaprox=U*Scambiada *V '
0
0
0

0
0

0
queda de rango 2 y lo verificamos haciendo:
>> rank(Aaprox)
2
y es “casi” igual a A.
Esta idea de mandar a 0 a los elementos de S que sean despreciables y obtener Aaprox haciendo U * S * V ' con la S retocada
sirve para una matriz cualquiera, aunque no sea fácil hacerlo “a ojo”.
Además, como las filas y columnas de ceros no aportan nada, sólo necesitamos guardar: (si decidimos conservar los primeros
“ele” valores singulares)
~
U =primeras “ele” columnas de U
s11 , s 22 ,..., sll (el cuadradito de S de ele x ele)
~
V = primeras “ele” columnas de V
~
~
~
Y de todos modos U (de nxl) * S (delxl)* V ' (de lxk)= Aaprox (de nxk) del mismo tamaño que A (de nxk) pero de rango l.
Enseguida programaremos una función que reciba como entrada A y l, y que devuelva la Aaprox de rango l, y otra función que
reciba A y ε con 0 ≤ ε ≤ 1 y devuelva l tal que sea el menor tal que: si j>l entonces s jj < ε .s11 , y lo usaremos para
comprimir imágenes.
********************************************************************************************************
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Primero armamos tres funciones de Matlab:
La primera recibe una matriz A y un número 0 ≤ ε ≤ 1 , y devuelve el índice del último valor singular (ordenados de mayor a
menor) tal que es mayor o igual que cierto número, veámoslo:
function ele=nivel(A, epsilon)
v=svd(A);
j=1;
while( j<=max(size(v)) && v(j)>=epsilon*v(1))
j=j+1;
end
ele=j‐1;
64
37
64
14
37
9
⇒ nivel(A, 0.1) es 4 ( porque
son ≥ 0.1 * 64 = 6.4 )
Por ejemplo, si A tiene valores singulares:
14 y
5
9
1.2
0.8
0.04
64
37
14
Y nivel(A, 0.01) es 7 ( porque
son ≥ 0.01 * 64 = 0.64 )
9
5
1.2
y 0.8
La siguiente función calcula la descomposición SVD pero reducida a una cantidad dada “ele” de valores singulares:
function [Ur,Sr,Vr]=svdr(A,ele)
[U,S,V]=svd(A);
Ur=U(:,1:ele);
Vr=V(:,1:ele);
Sr=S(1:ele,1:ele);
% primeras ele columnas de U
% primeras ele columnas de V
% primeras ele filas y columnas de S
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
La tercera función calcula la matriz de rango “ele” más próxima a una matriz A:
function Aap=aproxima(A, ele)
[Ur,Sr,Vr]=svdr(A, ele);
Aap=Ur*Sr*Vr';
2
4
7 
 1


20
40
70.02 
 10
 5 10.01
20
35 
.
Y ensayamos el funcionamiento en una matriz tipo: 
 − 2 − 4 − 8.003 − 14 
 7
5
3
1 

 2
4
3 
− 11

Dijimos que lo usaríamos para Compresión de Imágenes:
• Descargamos del lirweb el archivo con la imagen de prueba: lena.bmp en ….. mis documentos\MATLAB
• La importamos como una matriz de números reales (por defecto es tipo entero pero svd solo puede usarse con matrices de
tipo real) La instrucción”double” transforma los enteros en tipo punto flotante de doble precisión, ponemos:
>>L=double(imread('lena.bmp'));
>>image(uint8(L))
axis equal
(uint8 la vuelve a poner en tipo entero –para graficar es necesario‐)
16 → 16.000….0
47 → 47.000….0
etc.
Uint8 es por tipo entero (int = integer), sin signo “u” (de unsigned), de 8 bits (de 0 a 255 = 2 − 1 ).
8
En realidad L ∈ R 512 x 512 x 3 (o sea, que son 3 matrices
Es R G B por red‐green‐blue.
una para cada color, por ejemplo: la 1era es el rojo ) .
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> copia de L=L;
>> copia de L(: , : ,2) = copia de L(: , : ,2) * 0; 
 en copia de L mandamos a 0 las intensidades de verde y azul.
>> copia de L(: , : ,3) = copia de L(: , : ,3) * 0; 
>>image(uint8(copia de L))
axis equal
se ve como si tuviéramos anteojos rojos.
>>nivel(L(: ,:,1), 0.01)
% buscamos cuántos valores singulares son mayores al 1% del mayor en cada color
56
>>nivel(L(: ,:,2), 0.01)
81
>>nivel(L(: ,:,3), 0.01)
106
>>Lap(: ,:,1)=aproxima(L(: ,:,1), 56);
%Hicimos la cuenta que resulta que podríamos guardar la imagen con nivel de
precisión del 99% usando ≅ 30% del tamaño de los datos originales.
>>Lap(: ,:,2)=aproxima(L(: ,:,1), 81);
>>Lap(: ,:,3)=aproxima(L(: ,:,1), 106);
>>image(uint8(L))
axis equal
figure(2)
>>image(uint8(Lap))
axis equal
%Graficamos las 2 figuras y vemos que se parecen mucho, aunque vistas con el zoom se ve que
se perdió un poco de nitidez
Las descomposiciones matriciales que siguen, en lugar de usarse para analizar A en una base adecuada (como la svd y la
diagonalización), se usan para resolver sistemas lineales:
Factorización L‐U:
Dada A ∈ R nxn , ∃ L, U y P con L triangular inferior , U triangular superior y P de permutaciones tales que P*A=L*U (se
puede mencionar apenas que P y L corresponden a las operaciones al hacer Gauss y U es la triangular).
Entonces un sistema Ax=b se puede resolver así:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Esquema:
Ax=b ⇔
PAx=Pb ⇔
LUx=Pb
Y llamando w=Ux se resuelve: Lw=Pb (con L triangular inferior) y
obtenido w, resolviendo Ux=w (con U triangular superior) hallamos x.
Entonces proponemos hacer tres funciones:
Una que resuelva sistemas con matriz triangular inferior, la segunda que sigue que resuelva sistemas con matriz triangular
superior, y la tercera que resuelva un sistema cualquiera usando el esquema anterior.
Veamos la primera:
function x=resuelveL(L,c)
% para Lx=c
x(1,1)=c(1)/L(1,1);
for j=2:max(size(c))
x(j,1)=(c(j) ‐L(j,1: j‐1)*x(1: j‐1 ,1))/L(j,j);
end
********************************************************************************************************
Recordemos que la descomposición LU nos permite resolver un sistema con matriz cuadrada arbitraria, en un problema de
resolución de sistemas triangulares mediante: P ∗ A=L*U, por lo tanto:
El esquema es:
Ax=b ⇔
PAx=Pb ⇔
LUx=Pb
Y si w es solución de Lw=Pb (con L triangular inferior) entonces x es solución de Ux=w (con U triangular superior)
la misma x tal que Ax=b
y reescribiríamos la función que resuelve con matrices triangulares inferiores:
function x=resuelveL(L,c)
x(1,1)=c(1,1)/L(1,1);
for j=2:max(size(c))
x(j,1)=(c(j) ‐L(j,1: j‐1)*x(1: j‐1 ,1))/L(j,j);
end
Ahora podemos usar ésta función para resolver (también) sistemas triangulares superiores :
function x=resuelveU(U,w)
x=flipud(resuelveL(flipud(fliplr(U)),flipud(w)));
Y ahora un sistema cualquiera se resuelve mediante una función que aplique el esquema:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
function x=resuelve(A,b)
[L,U,P]=lu(A)
x=resuelveU(U, resuelveL(L,P*b));
La última línea corresponde al esquema de resolución por LU , y si, como ocurre muchas veces uno resuelve Ax = b1 ,
Ax = b2 , Ax = b3 ,…………………. con distintos b1 , b2 , b3 ,........... pero la misma A. Entonces vale la pena hacer:
[L,U,P]=lu(A) ; y guardar L,U y P , y para cada bi usar la línea : x=resuelveU(U, resuelveL(L,P* bi ));
Ejercicio:
a) Elegir una matriz aleatoria A grande (por ejemplo de 200 x 200 con randn) y un vector b fácil de verificar, por ejemplo:
 1 


 2 
 3 


b=(1:200)’ o sea: b =  .  . Hallar A ∗ x = b con las funciones anteriores y verifique (Ax debe dar =b)
 . 


 . 


 200 
b) Comparar el tiempo que demora resolver Ax = b1 ,…………., Ax = b20 para 20 vectores columnas al azar:
b j = randn(200,1) (con un ciclo for ) , por un lado resolviendo con éstas funciones pero sin guardar L , U y P, y por otro lado,
guardando L, U y P y ejecutando para cada bi la instrucción:
>> x=resuelveU(U, resuelveL(L,P*b))
Con
>> Tic
….
>> instrucciones
….
>> toc
Matlab devuelve el tiempo de CPU que demoran las instrucciones entre TIC y TOC.
Observación: cond(P)=1 y luego cond(P*A)=cond(A)=cond(L*U) ≤ cond(L) . cond(U).
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Otra factorización que permite resolver sistemas es la Q‐R:
Dada A ∈ R mxn , ∃ Q ∈ R mxm ortogonal (o sea Q −1 = Q t ), R ∈ R mxn triangular superior y P ∈ R nxn de permutaciones
tales que A*P=Q*R (obsérvese que ahora P multiplica a derecha – en LU era a izquierda).
Esto tiene aplicación para resolver sistemas cuadrados, pero también rectangulares (aunque por un rato no nos preocuparemos
por especificar qué significa “resolver” un sistema que no sea cuadrado).
{A ∗ x = b . Llamando x=P*z , tenemos
⇔ {APz = b ⇔ {QRz = b ⇔ {Rz = Q' ∗ b ( Q −1 = Q t ) luego obtengo z resolviendo el sistema con R
El esquema ahora sería así:
∴
{A.x = b
triangular superior, entonces:
Ejercicio:
x=P*z
Programar la resolución con qr
El esquema para resolver se puede programar así:
( Observación:
[Q,R,P]=qr(A) es la sintáxis de Matlab para hallar la descomposición QR )
function
x=resuelve_con_qr (A,b)
[Q,R,P]=qr(A) ;
z=resuelveU(R,Q’ *b) ;
x=P*z
la misma que ya programamos para sistemas triangulares superiores
Ej: Podemos probarlo con la misma A=randn(200,200) y b=(1:200)’ de antes.
Observación:
cond(Q)=1 y cond(P)=1 (por ser respectivamente ortogonal y de permutaciones).
Así que cond(A)=cond(R).
Aquí tenemos controlado el número de condición.
Ahora vamos a pensar en qué sentido podemos resolver un sistema no‐cuadrado.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Primer Caso: Más ecuaciones que incógnitas (sistema sobredeterminado)
Primer Ejemplo Motivador:
x
x1
x2
x3
.
.
xk
y
y1
y2
Dada una tabla:
y3
.
.
yk
y = ax + c tal que la distancia a los puntos de la tabla sea mínima:
Se pide:
Hallar la recta ~
 x1 1


 x 2 1
 . . .


 . .


 x k 1
 y1 
 
 y2 
a  
  = . . tendría solución exacta si los puntos estarían alineados
c  
 . 
 
 yk 
Ax=b
Como en general NO lo están, el sistema no tiene solución.
Idealmente sería Ax‐b=0 y por lo tanto, Ax − b
a
mínimos ” es x =   tal que
c
Ax − b
2
2
2
2
= 0 . Lo que entendemos como solución aproximada “de cuadrados
≥ 0 sea mínima.
¿Cómo hallamos esa solución de cuadrados mínimos en general ?
mín Ax − b
( Nótese que esto puede pedirse para un sistema con A ∈ R mxn con m>n )
‐Asociado o no al ejemplo motivador de la recta del mejor ajuste‐
Estamos buscando el mínimo de (Ax‐b) . (Ax‐b) siendo “.” el producto escalar.
Ahora, seguramente habrán visto en Cálculo Avanzado que:
d (u ( x).v( x)) du ( x)
dv( x)
.v( x) + u ( x).
=
dxi
dxi
dxi
Entonces:
2
2
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
columna i de A
d( )
d (( Ax − b).( Ax − b))
d ( Ax − b).( Ax − b)
=2
= 2.
. ( Ax − b) = 0 si es mínimo debe ser
=0
o fila i de A'
dxi
dxi
dxi
y debe ser 2. A’ * (Ax‐b)=0 ⇔ A’ * Ax‐A’b=0 ⇔ A’ * Ax=A’b
Entonces hay que resolver un sistema (que es cuadrado!!)
Entonces, si A’ * A tiene rango completo, una primera manera de resolver el problema es usar los métodos que teníamos para
resolver sistemas cuadrados para resolver A’ * Ax=A’ * b.
Ejercicio:
Con la tabla
x
y
0.21 16.3
1.5
54.0
2.8 95.5
5.1. 161.8
10.5. 328.1
20.1 615.2
a) Hallar la recta de cuadrados mínimos
b) Graficar la recta x/ ymc=ax+c con a y c hallados antes , y junto con los puntos de la tabla para ver si es verosímil.
c) Hallar la diferencia (en norma 2) entre la recta y los puntos :
y mc − y
2
********************************************************************************************************
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Recordemos que si tenemos un sistema sobredeterminado:
Ax=b con A ∈ R mxn , con m>n (más ecuaciones que
incógnitas) y A de rango completo, entonces la solución (aproximada) de cuadrados mínimos ( o sea, x ∈ R nx1 / Ax − b
mínima), coincide con la solución exacta del sistema compatible determinado: A’ * A*x=A’ * b.
Evidentemente, si Ax=b es determinado, la solución de cuadrados mínimos coincide con la solución exacta ( ya que es
Ax − b
2
= 0 que claramente es mínima).
Dijimos que hay varias formas entonces de hallar la solución:
• Con la función “resuelve” (que habíamos programado usando la descomposición LU ).
function x=resuelve(A,b)
[L,U,P]=lu(A);
w=resuelveL(L,P*b);
x=resuelveU(U,w);
function x=resuelveL(L,c)
x(1,1)=c(1,1)/L(1,1);
for j=2:max(size(c))
x(j,1)=(c(j,1)‐L(j,1:j‐1)*x(1:j‐1,1))/L(j,j);
end
function x=resuelveU(U,c)
x=flipud(resuelveL(flipud(fliplr(U)),flipud(c)));
• Con la función “resuelve qr” (que habíamos programado usando la descomposición QR )
( Observación:
[Q,R,P]=qr(A) es la sintáxis de Matlab para hallar la descomposición QR )
function
x=resuelve_con_qr (A,b)
[Q,R,P]=qr(A) ;
z=resuelveU(R,Q’ *b) ;
x=P*z
la misma que ya programamos para sistemas triangulares superiores
2
sea
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
• Observando que A’ * A*x=A’ * b tiene a A’ * A cuadrada e inversible (porque A es de rango completo y ∴ también lo son
a A’ ,y,
A’ * A ) y entonces x = ( A'*A) −1 * A'*b .
En general habíamos desaconsejado resolver sistemas Ax=b haciendo x = A −1 * b , aunque existiera A−1 , ya que el cálculo de
la inversa es costoso O ( N 3 ) en lugar de O ( N 2 ) para el método de Gauss – o sea, con LU‐.
Pero A’ * A es simétrica y definida positiva y ∴ existen algoritmos O ( N 2 ) para hallar la inversa (por ejemplo con Cholesky,
aunque no lo mencionaremos).
Además ( A'*A) −1 * A' tiene interés en sí misma. Es la pseudoinversa ( o inversa de Moore‐Penrose) y , aunque A es rectangular
y ∴ no tiene inversa, al menos resulta inversa a izquierda. En efecto: [( A'*A) −1 * A' ] * A = Id nxn . (recordemos que rg(A)=n
ya que , como el producto matricial es asociativo es [( A'*A) −1 * A' ] * A = ( A'*A) −1 * ( A'*A) = Id nxn .
En Matlab hay una función específica para hallar la pseudoinversa: pinv( ) (es decir, pinv(A)*A=Id )
Ejemplo, probemos una en Matlab:
>> A=[2 6 2;-3 -8 0;4 9 2]
A=
2 6 2
-3 -8 0
4 9 2
>> pinv(A)
ans =
-1.1429 0.4286 1.1429
0.4286 -0.2857 -0.4286
0.3571 0.4286 0.1429
>> pinv(A)*A
ans =
1.0000 -0.0000 -0.0000
0.0000 1.0000 0.0000
-0.0000 -0.0000 1.0000
Entonces tenemos al menos 4 formas de calcular la solución de cuadrados mínimos, y las ensayamos para una
matriz grande, donde se notara la eficiencia de las funciones ( y comparamos tiempos en Matlab con Tic – Toc ):
>> A=randn(1000,1000);
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> b=randn(1000,1);
>> tic
x=resuelve(A’*A,A’*b);
toc
0.3 seg
>> tic
x=resuelve qr(A’*A,A’*b);
toc
1.3 seg
>> tic
x=inv(A’*A)*A’*b;
toc
0.9 seg
>> tic
x=pinv(A)*b;
toc
18 seg
Si bien la última es la más corta de escribir es la menos eficiente.
Si tuviéramos que resolver 100 sistemas de éste tamaño, con la función resuelve demoramos 30 seg , y, con pinv demoramos
como media hora!!!!!!!!!!
Después resolvemos el ejemplo que había quedado pendiente:
Ej:
Con la tabla
x
y
0.21 16.3
1.5
54.0
2.8 95.5
5.1. 161.8
10.5. 328.1
20.1 615.2
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
a) Hallar la recta de cuadrados mínimos
b) Graficar la recta x/ ymc=ax+b con a y b hallados antes
y junto con los puntos de la tabla para ver si es verosímil.
c) Hallar la diferencia (en norma 2) entre la recta y los puntos :
Solución:
>> x=[0.21;1.5;2.8;5.1;10.5;20.1]
x=
0.2100
1.5000
2.8000
5.1000
10.5000
20.1000
>> y=[16.3;54.0;95.5;161.8;328.1;615.2]
y=
16.3000
54.0000
95.5000
161.8000
328.1000
615.2000
>> A=[x ones(6,1)]
A=
0.2100
1.5000
2.8000
5.1000
10.5000
20.1000
1.0000
1.0000
1.0000
1.0000
1.0000
1.0000
>> ab=resuelve(A'*A,A'*y)
y mc − y
2
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
ab =
30.1514
9.7523
>> ymc=ab(1)*x+ab(2)
o
>> yapr=ab(1)*x+ab(2)
ymc =
o
yapr=
16.0841
54.9793
94.1761
163.5242
326.3416
615.7947
>> plot(x,y, ' o ',x,ymc)
o
>> plot(x,y,' o ',x,yapr)
Pues:
 x1 1


 x 2 1
 . . .


 . .
 x 1
 6

 y1 
 
 y2 
a  
a
  = . . con   solución de cuadrados mínimos
c
c  . 
 
y 
 6
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
700
600
500
400
300
200
100
0
0
5
10
15
20
25
>> norm(ymc‐y)
o
>> norm(yapr‐y)
ans =
3.0294
>> norm(ymc‐y)/norm(y)
(para calcular el error relativo)
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
Si los datos tienen un aspecto no lineal
•
(por ejemplo:
•
•
•
•
•
• •
) a pesar de que es posible ajustar un modelo lineal, no parece muy adecuado.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Los criterios más importantes son la disposición de los puntos y lo que sepamos teóricamente acerca del modelo.
Veamos:
Ejercicio:
x
−4
−3
−2
−1
0
1
2
3
4
5
6
7
8
9
10
y
2.2
8.7
18.8
28.2
32.6
32.0
27.2
20.2
18.9
30.9
66.4
140.4
266.8
464.4
753.3
Esto lo generamos con : >> x=(‐4:10)';
>> y=0.1*x.^4‐3*x.^2+2*x+33+0.5*randn(size(x));
>> y=round(10*y)/10
(pero no se lo decimos!!!!)
Y se pide:
a) Ajustar un modelo lineal ax+b por cuadrados mínimos.
b) Ajustar un modelo cuadrático ax 2 + bx + c por cuadrados mínimos.
c) Ajustar un modelo cúbico ax 3 + bx 2 + cx + d por cuadrados mínimos.
d) Ajustar un modelo de orden 6, o sea, ax 6 + bx 5 + cx 4 + dx 3 + ex 2 + fx + g por cuadrados mínimos.
e) En cada caso calcular los errores relativos. Graficar en todos los casos.
Resolvemos:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> x=(‐4:10)';
>> x
x=
‐4
‐3
‐2
‐1
0
1
2
3
4
5
6
7
8
9
10
>> y=0.1*x.^4‐3*x.^2+2*x+33+0.5*randn(size(x))
y = 2.4001
8.4450
19.0078
28.4560
33.6451
32.4343
27.1954
19.4988
18.5901
30.4216
65.7980
140.2287
266.0718
464.8076
752.5975
>> y=round(10*y)/10
y=
2.4000
8.4000
19.0000
28.5000
33.6000
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
32.4000
27.2000
19.5000
18.6000
30.4000
65.8000
140.2000
266.1000
464.8000
752.6000
>> A=[x ones(size(x))]
A=
‐4 1
‐3 1
‐2 1
‐1 1
0 1
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 1
10 1
>> clin=resuelve(A'*A,A'*y)
clin =
34.8432
22.7704
>> ylin=clin(1)*x+clin(2)
ylin =
‐116.6025
‐81.7593
‐46.9161
‐12.0729
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
22.7704
57.6136
92.4568
127.3000
162.1432
196.9864
231.8296
266.6729
301.5161
336.3593
371.2025
>> norm(ylin‐y)
ans =
547.7645
>> norm(y)
ans =
939.7123
>> norm(ylin‐y)/norm(y)
ans =
0.5829
>> plot(x,y,'.',x,ylin)
(o sea, da 0.58… ‐ o sea un 58% inadmisible ¡!!!!)
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
800
700
600
500
400
300
200
100
0
-100
-200
-4
-2
0
2
4
6
8
10
Ahora Cuadrático!
>> A=[x.^2 A]
es lo mismo que >> A=[ x.^2 x ones(size(x))]
pero lo marcado ya estaba en A, así que abreviamos insertando sólo la columna faltante.
A=
16 ‐4 1
9 ‐3 1
4 ‐2 1
1 ‐1 1
0 0 1
1 1 1
4 2 1
9 3 1
16 4 1
25 5 1
36 6 1
49 7 1
64 8 1
81 9 1
100 10 1
>> ccuad=resuelve(A'*A,A'*y)
ccuad =
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
7.1278
‐7.9235
‐46.1316
>> ycuad=polyval(ccuad,x)
esto equivale a y=ccuad(1)*x^2+ccuad(2)*x+ccuad(3); pero está claro que con grados de
polinomios mayores es cada vez más largo de escribir. La función”polyval(a,x)” hace esa
tarea. Si : a = [a1 , a 2 ,......, a k , a k +1 ] entonces
poyval(a,x)
a1 * x ^ k + a 2 * x ^ k − 1 + ...... + a k * x + a k +1 ] .
OJO! Hay que completar los coeficientes si hiciera falta!
ycuad =
99.6071
41.7890
‐1.7734
‐31.0803
‐46.1316
‐46.9273
‐33.4675
‐5.7520
36.2190
92.4455
162.9277
247.6654
346.6587
459.9076
587.4121
>> norm(ycuad)
ans =
890.2821
>> norm(y)
ans =
939.7123
>> norm(ycuad‐y)
ans =
300.7606
equivale a :
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> norm(ycuad‐y)/norm(y)
ans =
0.3201
notemos que todavía es como 0.32
>> plot(x,y,'.',x,ycuad)
800
700
600
500
400
300
200
100
0
-100
-4
-2
0
2
4
6
Ahora va la Cúbica!
>> A=[x.^3
A=
‐64
‐27
‐8
‐1
0
1
8
27
64
125
216
343
512
729
1000
A]
16
‐4
9
‐3
4
‐2
1
‐1
0
0
1
1
4
2
9
3
16
4
25
5
36
6
49
7
64
8
81
9
100
10
1
1
1
1
1
1
1
1
1
1
1
1
1
1
>> ccubi=resuelve(A'*A,A'*y)
1
8
10
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
ccubi =
1.2033
‐3.7018
‐15.6246
41.9493
>> ycubi=polyval(ccubi,x)
ycubi =
‐31.7923
23.0177
48.7648
52.6688
41.9493
23.8262
5.5192
‐5.7520
‐2.7677
21.6920
74.8468
163.9164
296.1205
478.6789
718.8114
>> norm(ycubi)
ans =
935.7046
>> norm(y)
ans =
939.7123
>> norm(ycubi‐y)
ans =
86.6951
>> norm(ycubi‐y)/norm(y)
ans =
0.0923
o sea, 0.09
un 9 % inadmisible!!!
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> plot(x,y,'.',x,ycubi)
800
700
600
500
400
300
200
100
0
-100
-4
-2
0
2
4
6
8
Ahora va la Sexta!
>> A=[x.^6 x.^5 x.^4 A]
A=
4096
‐1024
256
‐64
16
‐4
1
729
‐243
81
‐27
9
‐3
1
64
‐32
16
‐8
4
‐2
1
1
‐1
1
‐1
1
‐1
1
0
0
0
0
0
0
1
1
1
1
1
1
1
1
64
32
16
8
4
2
1
729
243
81
27
9
3
1
4096
1024
256
64
16
4
1
15625
3125
625
125
25
5
1
46656
7776
1296
216
36
6
1
117649
16807
2401
343
49
7
1
262144
32768
4096
512
64
8
1
531441
59049
6561
729
81
9
1
1000000 100000
10000
1000
100
10
1
>> csex=resuelve(A'*A,A'*y)
csex =
‐0.0000
10
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
0.0005
0.0995
‐0.0073
‐3.0243
1.9814
33.4549
>> ysex=polyval(csex,x)
ysex =
2.3953
8.3948
19.0260
28.5553
33.4549
32.5047
26.8684
20.1420
18.3749
30.0643
66.1224
139.8164
266.6814
464.4064
752.6926
>> norm(ysex)
ans =
939.7115
>> norm(y)
ans =
939.7123
>> norm(ysex‐y)
ans =
1.2141
>> norm(ysex‐y)/norm(y)
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
ans =
0.0013
Ahora con grado 6 sí da un valor chico – menos de 1/10 , del 1% ¡!!!!!!!!‐
>> plot(x,y,'.',x,ysex)
800
700
600
500
400
300
200
100
0
-4
-2
0
2
4
6
8
10
•
La de grado 6 aproxima bien!! :
•
•
•
•
•
• •
Veamos los coeficientes:
csex =
‐0.0000
0.0005
0.0995
‐0.0073
‐3.0243
1.9814
33.4549
Vemos que los coeficientes de mayor orden son casi 0. Eso sugiere que quizás con un polinomio de menor grado (entre 4 y 5)
quizás también hubiera ajustado bien:
>> A=A(:,3:end)
todas la filas, desde la columna 3 en adelante (x^4) (x^3 x^2 x ones)
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
A=
256
‐64
16
‐4
1
81
‐27
9
‐3
1
16
‐8
4
‐2
1
1
‐1
1
‐1
1
0
0
0
0
1
1
1
1
1
1
16
8
4
2
1
81
27
9
3
1
256
64
16
4
1
625
125
25
5
1
1296
216
36
6
1
2401
343
49
7
1
4096
512
64
8
1
6561
729
81
9
1
10000
1000
100
10
1
>> ccuart=resuelve(A'*A,A'*y)
ccuart =
0.0994
0.0102
‐3.0343
1.8457
33.4613
>> ycuart=polyval(ccuart,x)
ycuart =
2.3302
8.3938
19.1420
28.6705
33.4613
32.3824
26.6881
20.0188
18.4013
30.2482
66.3588
139.9181
266.4977
464.0550
752.9340
>> norm(ycuart)
ans =
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
939.7113
>> norm(y)
ans =
939.7123
>> norm(ycuart‐y)
ans =
1.3725
>> norm(ycuart‐y)/norm(y)
ans =
0.0015
0.015 casi tan bueno como grado 6 …. Pero con dos parámetros menos!!!!!!!!!!!
>> plot(x,y,'.',x,ycuart)
también gráficamente ajusta bien!!!!1
800
700
600
500
400
300
200
100
0
-4
-2
0
2
4
6
8
10
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Hay casos donde un modelo no polinómico parece más adecuado.
Ejercicio:
x
y
− 4 − 5.64
− 3 − 2.8
− 2 1.65
−1
4.4
0
4.1
1
1.41
2
0.35
3
2.5
4
6.9
5 10.04
6 11.03
7
8.3
8
6.46
9
7.62
10 11.7
•
•
•
•
•
•
•
•
Uno puede probar grado 6 (u otro) y ve que el ajuste es mediocre.
•
•
Parece una sinusoide montada en una lineal!!!!
Planteamos a cos(x)+b sen(x) + cx+d
>> x=(‐4:10)';
>> y=[‐5.64; ‐2.8;1.65;4.4;4.1;1.41;0.35;2.5;6.9;10.4;11.03;8.3;6.46;7.62;11.7];
y=
‐5.6400
‐2.8000
1.6500
4.4000
4.1000
1.4100
0.3500
2.5000
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
6.9000
10.4000
11.0300
8.3000
6.4600
7.6200
11.7000
>> A=[cos(x) sin(x) x ones(size(x))];
A=
‐0.6536 0.7568 ‐4.0000 1.0000
‐0.9900 ‐0.1411 ‐3.0000 1.0000
‐0.4161 ‐0.9093 ‐2.0000 1.0000
0.5403 ‐0.8415 ‐1.0000 1.0000
1.0000
0
0
1.0000
0.5403 0.8415 1.0000 1.0000
‐0.4161 0.9093 2.0000 1.0000
‐0.9900 0.1411 3.0000 1.0000
‐0.6536 ‐0.7568 4.0000 1.0000
0.2837 ‐0.9589 5.0000 1.0000
0.9602 ‐0.2794 6.0000 1.0000
0.7539 0.6570 7.0000 1.0000
‐0.1455 0.9894 8.0000 1.0000
‐0.9111 0.4121 9.0000 1.0000
‐0.8391 ‐0.5440 10.0000 1.0000
>> coef=resuelve(A'*A,A'*y)
coef =
2.1099
‐3.0265
0.9953
1.9011
>> yap=coef(1)*cos(x)+coef(2)*sin(x)+coef(3)*x+coef(4);
yap =
‐5.7495
(aquí no sirve poyval ¡!!!!!)
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
‐2.7464
1.7845
4.5925
4.0110
1.4896
0.2616
2.3709
6.7934
10.3780
10.7441
8.4701
6.5618
7.6887
11.7297
>> norm(yap‐y)/norm(y)
ans =
0.0192
(vemos que aproxima bastante bien!!!)
>> plot(x,y,'.',x,yap)
12
10
8
6
4
2
0
-2
-4
-6
-4
-2
0
2
4
6
8
10
Ejercicio propuesto:
Programar una función: function coef=polcm(x,y,m) que reciba vectores x e y , y un n ∈ N 0 ,
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
y que devuelva el polinomio de orden n que mejor ajuste por cuadrados mínimos.
********************************************************************************************************
Habíamos dejado como ejercicio programar una función polcm: function coef=polcm(x,y,m) que reciba como entradas
vectores x e y , y un n ∈ N 0 ,
y que devuelva los coeficientes del polinomio de mejor ajuste por cuadrados mínimos, de
orden n.
La función quedaría, por ejemplo, así:
Function coef=polcm(x,y,n)
If size(x,2)==1
x=x’
end
If size(y,2)==2
y=y’
end
A=[ones(size(x))];
For k=1:n
A=[x.^k A];
End
Coef=resuelve(A’*A,A’*y);
% si x llega a estar en fila lo pone en columna.
% idem para y
Podemos probarlo, por ejemplo, para buscar un polinomio de orden n que aproxime bien el seno en un intervalo. Por ejemplo
en un período.
Ejercicio:
Sean
x=linspace(0,2*pi,100);
(un período)
y=sin(x);
Hallar el polinomio (de cuadrados mínimos) de menor orden que aproxime a “y” en los puntos de abscisa x, con error relativo
menor o igual a 0.01 ( el 1 % ).
Graficar y experimentar qué pasa con grados muchos más grandes.
Solución:
>> x=linspace(0,2*pi,100);
>> y=sin(x);
n=‐1;
err_rel=1;
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
while (err_rel>0.01)
n=n+1;
coef=polcm(x,y,n);
yapr=polyval(x,y,n);
err_rel=norm(yapr‐y)/norm(y);
if n==99
break
end
end
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
No probamos aún, pero seguramente debe conseguirse con un polinomio de orden <10. (tipo n=8 o algo así).
Vale la pena ver que para grados grandes el polinomio se hace inestable (en general) y no vale la pena.
Graficar:
>>plot(x,y,' o ',x,yapr)
Y probar, por ejemplo, con n=40, 60, 99
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐por acá serán las 8:30 hs??????
En general, hasta aquí, vimos como ajustar modelos de la forma:
y = a1ϕ1 ( x) + ........ + a k ϕ k ( x)
NOTA: Si ϕ1 ( x) =x.^(k‐1), ϕ 2 ( x) =x.^(k‐2),…………, ϕ k ≡ 1 , quedan los polinomios, pero recordemos que también vimos antes
un caso con y=a*cos(x)+b*sin(x)+c*x+d , aquí: ϕ1 ( x) =cos(x) ; ϕ 2 ( x) =sin(x) ; ϕ 3 ( x) =x ; ϕ 4 ( x) ≡ 1 .
Pero también es posible, si φ es inversible, ajustar un modelo:
y = φ (a1ϕ1 ( x) + ........ + a k ϕ k ( x)) ⇔ φ −1 ( y ) = a1ϕ1 ( x) + ........ + a k ϕ k ( x)
Entonces se renombra:
z = φ −1 ( y ) ,
z = a1ϕ1 ( x) + ........ + a k ϕ k ( x) , se usa cuadrados mínimos y luego se halla
y = φ (z ) .
Ejemplo Típico:
Ajustar un modelo exponencial y = ka x a los datos:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
x
y
−2
6.3
− 1 24.9
0
99.6
1. 398.1
1.5. 803.1
2 1592.8
Solución:
>> x=[‐2;‐1;0;1;1.5;2];
>> y=[6.3;24.9;49.6;398.5;803.1;1592.8];
>> z=log(y);
>> AB=polcm(x,z,1);
>>ak=exp(AB);
>>yap=ak(2)*ak(1).^x;
>>plot(x,y,' o ',x,yap)
>>norm(yap‐y)/norm(y);
Observación:
z=log(k)+log(a)*x
z=A*x+B
con A=log(a)
y
 A
 B
a
k 
B=log(k) ⇒ exp  =  
Otro Caso No Lineal es el de las Aproximaciones de Padé:
La idea es conseguir y ≅
P( x)
un modelo racional.
Q( x)
Muchas veces es necesario, ya que si hay polos – incluso aunque no estén en la recta real, si están cerca de ella ‐ , la
convergencia de los polinomios es lenta. (Por Ejemplo: y =
1
).
1+ x2
Además las funciones racionales aparecen frecuentemente al analizar ecuaciones diferenciales o ecuaciones en diferencias
(recurrencias) que se obtienen habitualmente como funciones de transferencia al analizar el sistema (transformar la ecuación)
con la transformada Z (ecuaciones en diferencias) o con la transformada de Laplace (ecuaciones diferenciales ordinarias).
Es habitual al considerar circuitos, control de procesos, etc.
En general, se puede normalizar (sacando un factor común adecuado) para que el término constante del denominador sea 1.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
⇒y=
P( x)
⇒ y + y.R( x) = P ( x) ⇒ y = P( x) − yR( x)
1 + R( x)
Observación:
El orden del aproximante se nota ( N / n)
y hay que averiguar los coeficientes de P(x) y R(x).
(gr(P)/gr(Q))
Ejercicio:
Dado
x
y
− 10
−9
−8
−7
.
.
.
.
.
.
6
7
8
9
10
Esto lo generamos con : >> x=(‐10:10)';
>> y=(2*x+1)./(x.^2+1)+0.05*randn(21,1);
>> y=round(100*y)/100;
% size(x)=21
(pero sin decirlo)
Se pide:
a) Ajustar un aproximante de Padé (1/2) (4 parámetros) y hallar el error relativo.
b) Buscar el orden del polinomio de menor grado que tiene un error relativo similar.
c) Graficar ambas.
Solución:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
ax + b
⇒ cx 2 y + dxy + y = ax + b ⇒ ax + b − cx 2 y − dxy = y
cx + dx + 1
 a 


 b 
2
Corresponde a : x 1 x y xy 
= ( y)
−c


− d 


Debe ser y =
2
(
)
Entonces ponemos:
>> x=(‐10:10)';
% size(x)=21
>> y=[los valores de la tabla];
>> ab_c_d=resuelve(A’*A,A’*b);
>> ypade=( ab_c_d(1)*x+ ab_c_d(2)./( ab_c_d(3)*x.^2+ ab_c_d(4)*x+1);
>>err_rel=norm(ypade‐y)/norm(y);
>>plot(x,y,' o ',x,ypade)
>>err_pol=>>err_rel+1;
>>n=‐1;
>>while(err_pol > err_rel)
n=n+1;
coef=polcm(x,y,n);
ypol=polyval(coef,x);
err_rel=norm(ypol‐y)/morm(y);
end
>>n
% para ver que orden quedó
>>plot(x,y,' o ',x,ypol,x,ypade)
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐hasta aquí 9:15 aprox
Una aplicación posible de los polinomios de cuadrados mínimos es la
Integración Aproximada:
Si tenemos una función no integrable fácilmente ( o no integrable en absoluto) con los métodos usuales de integración, una
opción es aproximarla por polinomios (globalmente o por tramos) y luego integrar las polinómicas:
Recordemos que: :
b
b
∫ (a
a
n
x n + a n −1 x n −1 + ...... + a1 x 1 + a 0
a
 a n +1 an −1 n

)dx =  n x
x +.........+ 1 x 2 + a0 x + 0 
+
n
2
 n +1

a
y hacemos :
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
a
[ n +n1 ,
Con los coeficientes:
a n −1
a1
x ,.........,
, a 0 ,0 ]
n
2
, polyval(coeficientes,b)‐ polyval(coeficientes,a)=Integral buscada
y agregamos el 0 al final para completar el polinomio que es primitiva del original
Luego: f ( x) ≅ P( x) ⇒
∫ f ( x)dx ≅ ∫ P( x)dx
y ésta última es fácil.
Ejercicio:
a) Programar una función que calcule la integral de un polinomio cuyos coeficientes estén en el vector p , entre los límites a y b.
( a la función llamémosla : integrapol )
b) Probarla para integrar aproximadamente (usar el mismo grado que en el 1er ejercicio – en que aproximamos sin(x) en
[0,2 π ]) :
π
∫ sin( x)dx
(acá podemos chequear fácilmente)
0
2
c) Probarlo para
∫e
−
x2
2
dx
(n=7)
1
Solución:
La función quedaría, por ejemplo, así:
Function I=integrapol(p,a,b)
n=max(size(p))‐1;
coef prim=[coef./((n+1):‐1:1 0)];
I=polyval(coef prim,b)‐ polyval(coef prim,a);
>> x=linspace(0,pi,50);
>> y=sin(x);
>> p=polcm(x,y,8);
>> Iseno=integrapol(p,0,pi)
>>x=linspace(1,2,20);
>>y=exp(‐(x.^2)/2);
>>q=polcm(x,y,7)
>> integrapol(q,r,2)
;
% es 8 o lo que haya salido en el ejercicio 1
% elijo partir en 20 puntos
********************************************************************************************************
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Mencionamos que las Aproximaciones de Padé no tienen un desempeño mucho mejor para “errores” aleatorios sobre datos
que se aproximen bien por Polinómicas, pero en cambio son muy útiles para funciones que tengan asíntotas horizontales, que
son especialmente incómodas para la interpolación polinómica (debido a que los polinomios no tienen tales asíntotas).
Ejemplo:
arctan(x) ,
Si ponemos :
>> x=‐20:0.1:20;
>> y=atan(x);
>> plot(x,y)
2
1.5
1
0.5
0
-0.5
-1
-1.5
-2
-20
-15
-10
-5
0
5
10
15
20
Podemos ver que las aproximaciones por polinomios de cuadrados mínimos, incluso para polinomios de cuadrados mínimos de
grado grande, son malas.
Por ejemplo:
>>coef=polcm(x,y,30);
>> yp=polyval(coef,x);
>>plot(x,y, '.' ,x,yp)
2.5
2
1.5
1
0.5
0
-0.5
-1
-1.5
-2
-2.5
-20
-15
-10
O mejor:
>> plot(x,y,'o',x,yp)
-5
0
5
10
15
20
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
2.5
2
1.5
1
0.5
0
-0.5
-1
-1.5
-2
-2.5
-20
-15
-10
-5
0
5
10
15
20
La razón es evidente, ya que los únicos polinomios que son constantes en algún intervalo son los de grado cero.
Así, si f es “casi” constante en un intervalo, la única forma para los polinomios de no alejarse mucho de f, es ir oscilando
alrededor de f, lo que impone muchos puntos críticos, lo que requiere agrandar mucho el grado.
En cambio con Padé, uno puede obtener aproximaciones muy aceptables con grado de P y Q ( y ≅
P( x)
) no muy grandes.
1 + Q( x)
Por lo que sé, Matlab no tiene funciones con aproximaciones de Padé, como sí tiene: “polyfit” (es similar a polcm) y polyval
(para evaluarla).
Programemos: (ya q será cómodo tenerlas a mano)
Hagamos 2 funciones, una para calcular los coeficientes y otra para evaluarla:
function [cp,cq]=apPade(x,y,n,m) % busca los coeficientes de p y q para y=p/(1+q) con q(0)=0, gr(p)n , gr(q)=m
A=zeros(max(size(x)),n+1+m);
if size(x,1)==1
x=x';
end
if size(y,1)==1
y=y';
end
for k=1:n+1
A(:,k)=x.^(n+1‐k);
end
for k=n+2:n+1+m
A(:,k)=‐(x.^(m+n+2‐k)).*y;
end
coef=resuelve(A'*A,A'*y);
%tienen q estar a mano las funciones: resuelve, resuelveU y resuelveL
cp=coef(1:n+1);
cq=[coef(n+2:end);1];
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
function y=padeval(cp,cq,x)
y=polyval(cp,x)./polyval(cq,x)
Entonces si ponemos, Por Ejemplo: (para el mismo ejemplo de antes)
>>[cp,cq]=apPade(x,y,7,6);
>>ypa=padeval(cp,cq,x);
>> plot(x,y,'o',x,ypa)
% debe andar bastante bien….
2
1.5
1
0.5
0
-0.5
-1
-1.5
-2
-20
-15
-10
-5
0
5
10
15
20
muy bien!
Ahora veamos un poco la INTEGRACION NUMERICA:
La clave será que:
∫ (a
k
x k + a k −1 x k −1 + ..... + a 2 x 2 + a1 x 1 + a 0 )dx =
a k k +1 a k −1 k
a
a
a
x +
x + ......... + 2 x 3 + 1 x 2 + 0 x + 0 → completamos
k +1
k
3
2
1
para usar luego polyval
Entonces si tenemos una tabla tipo x|y , y si elegimos n, la siguiente función calcula el polinomio de cuadrados mínimos de
orden n, e integra el polinomio, como aproximación a la integral de y=f(x).
function Int=integra(x,y,n)
coef=polcm(x,y,n);
coefprimit=[coef./(n+1):‐1:1;0];
Int=poyval(coefprimit,max(x))‐polyval(coefprimit,min(x))
La probamos con algún ejemplo:
>> x=linspace(0,pi,100);
>> y=sin(x);
% ponemos max(x) y min(x) en lugar de x(end) y x(1) por si x está
desordenado.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> Int=integra(x,y,7)
ans
π
2.0000
% coincide con
∫ sin( x)dx = 2
0
Pero las funciones que se portan mal con los polinomios, tienen problemas de convergencia:
>> x=‐20:0.1:20;
>> y=atan(x);
>> integra(x,y,7)
13,…….
>> integra(x,y,15)
14,…….
>> integra(x,y,40)
15,0700
>> integra(x,y,41)
15,0100
>> integra(x,y,140)
15,038
>> integra(x,y,141)
15,0720
% error en la segunda cifra
O sea, NO parece converger!!!!!, los errores por arriba más o menos se cancelan, pero la precisión es pobre, y no resulta un
método muy fiable!!.
Una forma de salvar ese problema es, en lugar de usar un solo polinomio en todo el dominio, vamos aproximando de a tramos
por polinomios (de grado pequeño).
Esta idea está implícita en la Sumas de Riemann:
(constante de a tramos, o sea, polinomios de grado cero)
O suplantando los rectángulos de antes, por TRAPECIOS (lineal de a tramos, o sea, polinomios de grado 1)
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
CUADRÁTICAS (Regla de Simpson) P polinomio de grado 2 que aproxima a f en [a,b]
Etc,….. en general las fórmulas correspondientes se llaman: de Newton‐Cotes.
f la función


a borde izquierdo

b borde derecho

Recapitulando, el procedimiento requiere: 
n elementos de la partición

m puntos tomados en cada sub - intervalo

 k orden del polinomio de Cuadrados Mín
Si la función no existe en Matlab, hay que crearla. Por ejemplo: f ( x) =
Hay varias maneras:
function y=fun(x)
y=sin(x.^2)./(1+x.^2);
o en línea de comandos: >>fun=@(x) sin(x.^2)./(1+x.^2);
(o se puede usar “@(x) sin(x.^2)./(1+x.^2)” en la llamada a la función)
La función que hace Newton‐Cotes sería:
sen( x 2 )
1+ x2
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
function Int=integraF(f,a,b,n,m,k)
Int=0;
parti=linspace(a,b,n+1);
for j=1:n
x=linspace(parti(j), parti(j+1),m);
y=f(x);
Int=Int+integra(x,y,k)
end
Observación:
La partición y la sub‐partición es equi‐espaciada. Podría evitarse esto pero, por lo general, no cambia gran cosa.
Ejemplos:
>>Int=integraF(@sin,o,pi,15,5,2)
2.0000
>>Int=integraF(@ sin(x.^2)./(1+x.^2),‐1,1,20,8,3)
notemos que esta función NO admite primitiva por sustitución o partes
>>Int=integraF(@ atan,‐20,20,200,20,7)
el mismo de antes!! Pero ahora sí converge!!!
Ejercicio:
Hallar la probabilidad de que , en una población de media 170 cm y desviación estándar 6 cm (con distribución normal), una
persona mida entre 140 cm y 200 cm.
Resolución:
>>f=@(x) (1/(sqrt(2.pi)*6))*exp(‐((x‐170).^2)/2*6);
>>integraF(f,140,200,100,8,3)
% elijo una partición de 100 intervalos, 8 puntos en cada intervalo, y cúbicas en cada intervalo
********************************************************************************************************
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Hasta aquí hemos considerado sistemas lineales que, matricialmente, se pueden plantear como:
AX = b
con
A ∈ IR n × m , y b ∈ IR n × 1 .
Podemos asumir, eventualmente considerando un sistema equivalente adecuado que estamos en el caso de que
rg ( A) = max{n, m}.
Asumiendo dicha hipótesis, el caso con n=m es
rg ( A) = n = m , y el sistema es determinado, situación que ya
estudiamos, por ejemplo, cuando vimos la descomposición LU.
El caso con n>m es el de los sistemas sobredeterminados. Con
rg ( A) = m < n el sistema por lo general no tiene solución,
y llamábamos solución de cuadrados mínimos a aquel
X ∈ IR m × 1 tal que AX − b
cuadrados mínimos se encontraba, por ejemplo, como
X = (( A' A) − 1 A' )b , siendo A' la matriz traspuesta de A . Debido
sea mínima. Dicha solución de
rg ( A) = m resulta que A' A ∈ IR m × m es de rango completo, m, y por ello está definida su inversa, y la matriz
( A' A) − 1 A' que resulta una pseudo‐inversa a izquierda de A , es decir: (( A' A) − 1 A' ) A = I , donde I es la identidad
de m× m .
a que
Ahora nos toca considerar el caso con m>n, con
rg ( A) = n < m . En este caso, si existe X ∈ IR m × 1 tal que AX = b
C = { X ∈ IR m × 1 : AX = b} , ya que si h ∈ IR m × 1 cumple
A( X + h) = b , y el conjunto Co = {h : Ah = 0}
resulta que hay infinitos elementos en el conjunto:
Ah = 0 , y si AX = b entonces
= Nu ( A) tiene dimensión m − n > 0 , y por lo tanto Co tiene infinitos elementos, y también los tiene C. Por ello el
sistema se dice subdeterminado, y se trata de elegir entre las infinitas soluciones (los elementos de C), alguna que sea
preferible por alguna razón.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Una de las elecciones más frecuentes consiste en elegir la solución de mínima norma al cuadrado. Esto es lo que entenderemos
como solución de cuadrados mínimos para un sistema subdeterminado.
Es decir: buscamos
2
X o ∈ C = {X ∈ IR m × 1 : AX = b} tal que X o ≤ X
2
para todo
X ∈C .
A continuación veremos que dicha solución de cuadrados mínimos del sistema sub‐determinado puede hallarse como
X o = ( A' ( AA' ) − 1)b . Nótese que como rg ( A) = n < m es AA' ∈ IR n × n con rg ( AA' ) = n de modo que
( AA' ) − 1 está bien definido, y la matriz obtenida como ( A' ( AA' ) − 1) ∈ IR m × n resulta ser una pseudo‐inversa a
derecha de A, esto es que: A( A' ( AA' ) − 1 ) = I , donde I es la identidad de n× n .
A continuación esbozamos la idea que permite proponer a
X o = ( A' ( AA' ) − 1)b como la solución buscada.
El problema puede verse como un problema de extremos de minimización de
X
, o equivalentemente de
X
2
ó de un
múltiplo positivo de ello, sujeto a las condiciones de ligadura correspondientes a que
X ∈ C = { X ∈ IR m × 1 : AX = b} . Esto lo podemos interpretar entonces como el problema de hallar un mínimo para la
A X = b
1
 1
1 '

función F ( X ) = X X sujeto a las condiciones de ligadura: ...
, siendo X ' ∈ IR1 × m el vector traspuesto
2

 An X = bn

de
X y por lo tanto X ' X = X
2
, y siendo
Ai la i‐ésima fila de A.
De esta manera el problema se puede encarar mediante la búsqueda de n multiplicadores de Lagrange para la función F. O sea
consideramos:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
1
G( X , λ ) = X ' X − λ1( A1 X − b1) − ... − λn ( An X − bn ) con λ ∈ IR n × 1 .
2
Un extremo de la función auxiliar G requiere que se anulen las derivadas parciales respecto de las componentes de
λ , es decir que (derivando en cada caso):
X
y de
GX = X i − λ1 A1i − ... − λn Ani = X i −  A'  λ = 0

i
i
Gλ = − A j X − b j  = 0
j


X ) obtenemos: X = A'λ , y
reemplazando así X en las n ecuaciones de las derivadas respecto de las λ se obtiene A A'λ − b = 0 para j=1…n. Es
j
j
j
De las m primeras ecuaciones (las de las derivadas respecto de las coordenadas de
decir que resulta:
AA'λ = b . Como AA' tiene inversa (por ser cuadrada de rango completo) resulta que λ = ( AA' ) − 1b . Y volviendo a
reemplazar en X = A'λ obtenemos como único posible extremo: A' ( AA' ) − 1b . Denotémoslo X . O sea:
o
X o = ( A' ( AA' ) − 1)b
No es difícil convencerse que
X o cumple lo pedido. Por una parte se tiene que
AX o = A( A' ( AA' ) − 1)b = ( AA' )( AA' ) − 1b = b , o sea AX o = b .
Por otra parte, está claro que si
ortogonal a las filas de
X ∈ C = { X ∈ IR m × 1 : AX = b} es A( X − X o ) = 0 , por lo que X − X o es
A (puestas en columna, para interpretar el producto matricial como producto interno en IR m × 1).
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
'
'
r = ( AA' ) − 1b resulta que X o = A'r , o sea resulta que X o = r1  A  + ... + rn  An  de


 1
X = X o + W con X o generado por las filas de A (puestas luego en columna), y W es ortogonal a ellas (y por
Por otra parte llamando
modo que
lo tanto es ortogonal a X. De allí resulta que
F(X ) =
1
X
2
2
≥
X
2
2
= Xo + W
2
de donde resulta que
2
1
X o = F ( X o ) , de donde realmente nuestro punto crítico es un mínimo global de F
2
para el
conjunto C.
A ∈ IR n × m de rango completo
pinv(A) = ( A' A)− 1 A' , también nos da en el caso de que rg ( A) = n < m una
La misma función pinv(), de matlab, que proporcionaba la inversa a izquierda de una matriz
con
rg ( A) = m < n , es decir:
inversa a derecha, es decir que en este caso:
pinv(A) = A' ( AA' )− 1 . Por ejemplo:
>> A=[1 2 4;3 5 11]
A=
1
2
4
3
5 11
>> A_1=pinv(A)
A_1 =
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
‐2.6667 1.0000
4.1667 ‐1.5000
‐1.1667 0.5000
>> A*A_1
ans =
1.0000 ‐0.0000
‐0.0000 1.0000
>> % Efectivamente conseguimos ahora una inversa a derecha.
>> % Nótese que ahora, con n=2<3=m es pinv(A)=A'*(A*A')^‐1
>> A'*(A*A')^‐1
ans =
‐2.6667 1.0000
4.1667 ‐1.5000
‐1.1667 0.5000
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Ejercicio:
i) Para la matriz dada anteriormente
para el sistema
1
2 4 
 3
, y para el vector columna b =   , hallar dos soluciones distintas
8

 
 3 5 11
A = 
AX = b , y calcular sus normas.
ii) Hallar la solución de mínima norma
X o de AX = b y verificar que su norma es menor o igual a la de las otras soluciones
halladas.
Resolución:
Como tenemos 3‐2=1 variable más que el numero de ecuaciones podemos proponer un valor para una de ellas y obtener, a
partir de ella, las otras dos.
Si
X
x
 
=  y  y ponemos x
z 
 
= 3 queda:
1*3+2*y+3*z = 3
3*3+5*y+11*z = 8
Es decir:
2*y+3*z = 0
5*y+11*z = ‐1
De donde se obtiene y
>> X=[3;2;‐1]
= 2, z = ‐1, es decir X
3 



= 2  , verificamos:


 − 1


Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
X=
3
2
‐1
>> A*X
ans =
3
8
De la misma manera, ponemos, por ejemplo: x
X
1 
 
= 1 
 
 0
 
>> A*[1;1;0]
ans =
3
8
OK.
Ahora calculamos las normas:
>> norm([3;2;‐1])
ans =
3.7417
>> norm([1;1;0])
ans =1.4142
= 1, y obtenemos como nueva solución:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Si bien esta solución tiene una norma que parece bastante chica podemos mejorarlo. Busquemos la solución de mínima norma
para el sistema subdeterminado,
AX = b , como explicamos antes:
>> b=[3;8]
b=
3
8
>> Xo=pinv(A)*b
Xo =
0.0000
0.5000
0.5000
>> norm(Xo)
ans =
0.7071
Nótese que Xo tiene la mitad de la norma de la solución hallada anteriormente.
Exponencial de Una Matriz
Para matrices cuadradas se pueden definir las potencias, con exponente en INo, de la matriz por
y
A0 = I
Ak = 1
⋅4
⋅3
A 42
A ⋅...
A si k ∈ IN
44
k veces
(la identidad del tamaño de A)
Como también está definido el producto por un escalar, podemos definir polinomios en las matrices cuadradas.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Por ejemplo, si
p( x) = −2 x5 + 4 x3 + 2 x + 3 , se define p( A) = −2 A5 + 4 A3 + 2 A + 3I , de donde se obtiene
una aplicación de los polinomios con escalares en IR (ó en C), en las matrices cuadradas del tamaño de A que preserva sumas,
productos de potencias de A y productos por escalares (un morfismo).
Cómo además tenemos definida una norma podemos hacer aún más. La norma nos permite definir una noción de convergencia
en
A ∈ IR n × m :
Dada una sucesión de matrices
{Ak }k ∈ IN , decimos que M ∈ IRn × m es el límite de {Ak }k ∈ IN , o que
lim A = M si y sólo si lim A − M = 0 . Este último es un límite de una sucesión de números reales, y por lo
k
k →∞ k
k →∞
tanto está bien definido.
Obs: Como todas las normas matriciales son comparables entre sí podemos suponer que trabajamos con la norma 2.
Consideramos ahora en el caso de matrices cuadradas, para una matriz
dada por
Sk = pk (A) , donde pk ( x) =
Se puede demostrar que
k
∑
j=0
1 j
x . Es decir
j!
{ }k ∈ IN
A ∈ IR n × n , la sucesión de matrices: S k
Sk =
k
∑
j=0
1 j
A .
j!
{pk ( A )}k ∈ IN es una sucesión convergente de números reales, y que a consecuencia de ello
{S k }k ∈ IN converge, es decir que existe el klim
S , y denotamos tal límite: lim Sk = ∑
k →∞
→∞ k
∞
j=0
En el anillo de los números complejos con la norma usual existe el límite
límite como la exponencial compleja:
ez =
∞
∑
j=0
•
•
•
e z + w = e zew
e0 = 1
Si t ∈ IR , etz = (e z )t
lim
k
∑
k →∞ j=0
1 j
z
j!
=
∞
∑
j=0
1 j
A .
j!
1 j
z y se define a dicho
j!
1 j
z , y dicha exponencial tiene, entre otras propiedades las siguientes:
j!
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Es entonces natural, para A ∈ IR n × n , definir
eA =
∞
1
∑ j! A j , y se obtienen de manera totalmente análoga las
j=0
siguientes propiedades:
•
•
•
e A + B = e Ae B
eO = I , donde O es la matriz nula.
Si t ∈ IR , etA = (e A )t
Ejercicio
Como ejercicio podemos tratar de evaluar aproximadamente la exponencial de una matriz en Matlab efectuando sumas
parciales de la serie mencionada, deteniéndonos cuando el término siguiente es numéricamente nulo, es decir si:
1
Ak + 1 = 1
(k + 1)!
(k + 1)!
Ak + 1
≤
1
(k + 1)!
k
k
1 j
A ) donde eps( ∑ 1 A j ) es el Epsilon de
j!
j!
j=0
j=0
A k + 1 ≤ eps( ∑
máquina de la suma parcial. Compárese el resultado con alguna matriz cuadrada usando la función de Matlab “expm” que
evalúa la exponencial matricial.
Resolución:
Programamos la siguiente función
function eA=exp_matricial(A)
eA=eye(size(A));
k=1;
siguiente=A;
acota=norm(A);
while(acota>eps(eA))
eA=eA+siguiente;
k=k+1;
siguiente=siguiente*A/k;
acota=acota*norm(A)/k;
end
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Nótese que en lugar de dividir por los factoriales conviene ir dividiendo por cada factor de los mismos y multiplicando por A o su
norma para posponer posibles sobreflujos o subflujos.
Verificamos su funcionamiento con una matriz aleatoria de 3 por 3:
>> A=rand(3,3)
A=
0.8147 0.9134 0.2785
0.9058 0.6324 0.5469
0.1270 0.0975 0.9575
>> eA=exp_matricial(A)
eA =
3.2881 2.2290 1.3802
2.2617 2.8712 1.7128
0.4615 0.3910 2.7554
>> expm(A)
ans =
3.2881 2.2290 1.3802
2.2617 2.8712 1.7128
0.4615 0.3910 2.7554
Obtenemos lo mismo que con expm (en general usaremos esta función ya existente en Matlab).
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Observación importante
No se debe confundir la exponencial matricial –que se obtiene con expm‐ con la función exp aplicada a una matriz que
sencillamente da la exponencial de cada entrada:
>> expm(A)
ans =
3.2881 2.2290 1.3802
2.2617 2.8712 1.7128
0.4615 0.3910 2.7554
>> exp(A)
ans =
2.2586 2.4927 1.3211
2.4739 1.8820 1.7279
1.1354 1.1025 2.6052
Se ve que difieren claramente. Además, por ejemplo:
>> exp([1 2 3;0 1 2])
ans =
2.7183 7.3891 20.0855
1.0000 2.7183 7.3891
>> expm([1 2 3;0 1 2])
??? Error using ==> mtimes
Inner matrix dimensions must agree.
Esto es porque la exponencial matricial sólo tiene sentido para matrices cuadradas –a diferencia de la exponencial coordenada a
coordenada obtenida con exp‐.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Una de las aplicaciones importantes de la exponencial matricial, es que, como la función exponencial en una variable, nos
permite obtener solución para ecuaciones diferenciales lineales a coeficientes constantes.
Se puede verificar a partir de la definición de derivada de una función de variable escalar que: Si
Entonces si buscamos
X (t ) : IR → IR n
tal que
X ′ = AX
las funciones de la forma
t ∈ IR ,
d (etA ) = AetA
dt
X (t ) = ketA con k ∈ IR
resultan solución.
Asimismo el problema de valor inicial:
 X ′ = AX
resulta ser

(
)
=
X
t
X

o
o
X (t ) = X o ⋅ etA
Lo anterior corresponde a ecuaciones homogéneas.
Hay distintas formas de acceder a las soluciones del caso no homogéneo.
Por ejemplo se puede verificar que:
t
X (t ) = ( X o + ∫ e − sA B(s)ds) ⋅ etA resulta solución de:
t0
 X ′ = AX + B

 X (to ) = X o
Más adelante veremos de estimar numéricamente las integrales.
Nótese que si A y J son matrices semejantes, es decir
A = L− 1.J .L donde L es una matriz inversible entonces
e A = L− 1e J L . Esto es claro a partir de la definición de la exponencial como sumas de múltiplos de potencias de la matriz,
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
y del hecho de que
eA =
∞
∑
j=0
Ak = A ⋅ A ⋅ ... ⋅ A = L− 1.J .J ...J .L = L− 1.J k .L , y entonces
1 j
A
j!
=
∞
∑
j=0
1 −1 j
L J L = L− 1(
j!
∞
∑
j=0
1 j
J
j!
)L = L− 1e J L
Si entonces A es diagonalizable podemos estudiar y analizar cualitativamente las soluciones de las ecuaciones diferenciales
mencionadas arriba con matriz A, de manera más sencilla teniendo en cuenta los autovalores y autovectores de A.
********************************************************************************************************
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
RESOLUCION de ECUACIONES NO-LINEALES: (1ra Parte: CASO ESCALAR)
Nos interesa ahora resolver ecuaciones no-lineales. Empezamos viendo el caso de una variable:
Si tenemos una ecuación f(x)=g(x) suele ser cómodo escribirla de alguna manera equivalente pero más sencilla para
pensarla en términos de algunos resultados. Algunas formas serían:
H(x)=0 (por ejemplo: con H(x)=f(x)-g(x) )
T(x)=x (por ejemplo: con T(x)= f(x)-g(x)+x
, o,
,o,
T(X)=
x f ( x)
si g no se anula ).
g ( x)
En el 1er caso, la búsqueda de soluciones de la ecuación coincide con la búsqueda de ceros de la función H(x).
En el 2do caso, las soluciones de la ecuación son puntos fijos de la función T.
Los primeros métodos que vemos, aprovechan ideas para buscar ceros.
El primero de ellos se basa en un Teorema muy conocido que recordamos:
TEOREMA de BOLZANO: Si H es contínua en [a,b] y si H(a)>0 y H(b)<0, o , si H(a)<0 y H(b)>0 , o sea H(a).H(b)<0
Entonces existe c ∈ (a, b) tal que H(c)=0.
Observación: La condición de que los valores H(a) y H(b) sean uno positivo y uno negativo, en términos de
programa, se puede chequear fácilmente de una sola vez, verificando que H(a).H(b)<0.
El método basado en el teorema de Bolzano, se llama Método de BISECCION, y consiste en ir precisando la
ubicación de alguna raíz de H, por el procedimiento de partir el intervalo en partes iguales y observar en cuál de
ellas es posible volver a aplicar el teorema.
Por Ejemplo:
--------------------------------------Paso n: Intervalo [a,b]
Paso
estimación de la raíz:
n+1 : Evalúo H( x0 ). Tenemos tres posibilidades:
1) el signo (H( x0 ))=signo (H(a))
2) el signo (H( x0 ))=signo (H(b))
3) H( x0 )=0
Si H( x0 )=0 devolvemos como solución x0 y terminamos ahí.
x0 =
a+b
2
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Si el signo (H( x0 ))=signo (H(a)) entonces puedo aplicar el teorema de Bolzano en el intervalo [ x0 ,b].
Entonces renombramos a= x0 , y vuelvo al paso n.
Si el signo (H( x0 ))=signo (H(b)) entonces puedo aplicar el teorema de Bolzano en el intervalo [a, x0 ].
Entonces renombramos b= x0 , y vuelvo al paso n.
En cada paso la longitud del intervalo se divide por 2 (salvo cuando hallamos justo la raíz), por lo que se gana en
cada caso un dígito binario en cada paso. (o 0,30103 ≅ dígitos decimales en cada paso- es decir 1 decimal cada
3 o 4 pasos-). Por ello se dice que es un método de orden 1.
Una cuestión pendiente consiste en decidir cuándo detenernos. Algunas posibilidades son:
1) Después de cierta cantidad N de pasos prefijada.
2) Cuando el intervalo es menor (en longitud) que cierto δ > 0 prefijado.
3) Cuando H ( x0 ) < ε para cierto ε > 0 prefijado.
4) Combinando condiciones tipo
ε
y
δ .
Las dos primeras son esencialmente lo mismo, ya que a y b están dados y después de N pasos la longitud del
intervalo está completamente determinada por a,b y N: longitud =
b−a
2N
, o sea fijar N equivale a fijar δ =
b−a
2N
.
Entonces podemos proponer pasar como criterios de corte:
1) Fijar δ (achicar las abscisas)
2) Fijar ε (achicar las ordenadas)
3) Pedir que, por ejemplo,
δ 2 + ε 2 sea pequeño (así forzamos a que ambos ε
y
δ sean pequeños).
El criterio de la δ puede dar soluciones mediocres si la pendiente “es grande” cerca de la raíz:
Después de cuatro pasos ( x0 , x1 , x 2 , x3 )
---------------------------------------------------------------
H( x3 ) está lejos de 0 (e incluso H( x 2 )<H( x3 ) )
El criterio de las ε
puede dar una solución lejana y la correcta si la pendiente “es chica” cerca de la raíz:
(En una de esas ya paró en x0 porque H ( x0 ) < ε )
-------------------------------------------------
Pero la raíz correcta c está bastante lejos.
Proponemos entonces usar el criterio mixto (pedir que
(longitud Intervalo) 2 + ( H ( x medio )) 2 < α , para cierto α > 0 .
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Entonces proponemos programar el método y probarlo:
Ejercicio:
a) Programar el método de Bisección: poniendo como encabezado de la función: function sol=bisección (H,a,b,alfa).
b) Probarlo hallando alguna raíz de :
i) 9 x 3 + 3 x = 6 x 2 + 2
(solución verdadera para verificar x =
2
)
3
ii) cos(x)=x
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐hasta aquí serán 8:30 aprox
Solución:
a)
function sol=biseccion (H,a,b,alfa)
if H(a)*H(b)>=0
error (‘H(a) y H(b) deben ser una >0 y otra <0 ’ ) ;
end
sol=(a+b)/2 ;
while ( sqrt(H(sol)^2+(abs(b-a))^2) >=alfa )
if H(sol)==0
return;
elseif sign(H(sol))= =sign(H(a))
a=sol;
else
b=sol;
end
sol=(a+b)/2;
end
b)
i)
>> H=@(x)
Matlab
9*x.^3+3*x‐6*x.^2‐2
(o sea, H(x)= 9 x 3 + 3 x − 6 x 2 − 2 ) con @ puedo poner una function en el prompt de
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> H(0)
ans=‐2
>> H(1)
ans=4
(luego podemos usar bisección!!!!)
>> sol=biseccion(H,0,1, 0.000001 )
sol=0.66667
ii)
>> G=@(x) cos(x)-x
>> G(0)
ans=1
>> G(pi/2)
ans=‐1.57……….
(luego podemos usar bisección!!!!)
>> solu=biseccion(G,0,pi/2, 0.00000001 ) por ejemplo!!!
solu=………. (algún número)
>> G(solu)
(verif)
0
( o un número x 10 − numero grande
(tipo 10 −10 ) )
Ventajas y Desventajas del Método de Bisección:
Ventajas:
• Sólo requiere continuidad.
• Converge siempre si se cumplen las hipótesis. (en teoría)
Desventajas: • Sólo encuentra raíces asociadas a un cambio de signo.
(no puede hallar una raíz por ej de multiplicidad 2 , así
-------------------------)
• Converge relativamente lento (orden 1, como mencionáramos).
• No se puede generalizar a varias variables.
------------------------------------------------------------------------------------------------------------------------------------------------A continuación propondremos otros métodos. Veamos primero la idea geométrica:
Una posibilidad es: aproximar localmente por funciones a las que se le sepa encontrar los ceros (v.g.: lineales), y
tomar dichos ceros (de las lineales) como aproximaciones sucesivas. El primer método es debido a Evangelista
Torricelli (el mismo del barómetro), pero Newton lo usó en un caso particular y Raphson lo generalizó y se conoce
como el Método de Newton-Raphson.
El Método de Newton-Raphson puede entenderse fácilmente con éste esquema:
Una raíz es un x tal que H(x)=0.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
~
En general se parte de una cierta estimación de la raíz de H, y se busca la siguiente, hallando donde H ( x) = 0 ,
~
siendo H =la función lineal cuyo gráfico es la recta tangente a H en la estimación anterior:
~
Es decir, x n +1 es tal que H ( x n +1 ) = 0 , o sea, 0 = H ' ( x n ).( x n +1 − x n ) + H ( x n ) .
O sea, despejando:
x n +1 = x n −
H ( xn )
H ' ( xn )
(paso iterativo)
OBSERVACIONES:
Es claro que éste método tiene requerimientos bastante más restrictivos:
• Tiene que existir H’, además de H.
Además debe poder pasarse explícitamente H’, ya que MATLAB NO HALLA derivadas en forma simbólica.
• Hay que partir de una suposición razonable de la raíz, para que además H ' ≠ 0 en cierto intervalo donde iteremos.
( Si H’ se anula el paso iterativo podría no aplicarse).
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
Además, se ve que si estamos “en otra colina” (más allá de un punto crítico), el método puede llevarnos a alejarnos de la raíz.
• También es preferible que NO haya cambios de concavidad
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
• Por otra parte, en general el método converge rápido (en caso de que converja).
En dicha situación es de orden 2.
∃k : si c es la raíz correcta, con c − x n
= ε ⇒ c − xn
≤ kε 2 (con k que sólo depende de f en cierto intervalo alrededor
de “c”).
(Sale que: H ( x) = H ( x0 ) + H ' ( x 0 ).( x − x0 ) + H ' ' (ζ ).( x − x0 ) 2 , (el desarrollo de Taylor)
~
siendo los dos 1eros sumandos H ( x) = H ( x0 ) + H ' ( x0 ).( x − x0 ) lo que nos da las aproximaciones lineales).
• Si c es una raíz doble (o de mayor multiplicidad) también converge
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
Aunque el orden vuelve a ser 1 en este caso. (Si se sabe el orden, se puede modificar el método para que vuelva a ser de orden
2)
• Puede generalizarse para resolver ecuaciones vectoriales; o sistemas de ecuaciones no‐lineales de varias incógnitas.
Proponemos ahora programar el método de Newton-Raphson (N-R) para el caso escalar, y usarlo en algún ejemplo.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Como converge rápido, lo usual es pararlo después de cierta cantidad fija de iteraciones (8, 10, 12, por ejemplo. Por
ejemplo, si parto de una estimación distante aproximadamente
1
del valor absoluto de la solución, en 25 pasos
2
estaremos en el orden del épsilon de máquina de ese número).
Otras alternativas son parar cuando H ( x n ) < ε para cierto ε > 0 , o cuando x n +1 − x n < δ para cierto δ > 0 .
Aquí implementamos la versión con n iteraciones (si uno quiere, se puede tomar el valor de la raíz que devuelva el
método y si uno no está satisfecho con H ( sol ) o con
H ( sol )
H ( sol )
H ( sol )
= sol − ( sol −
) , siendo sol −
la
H ' ( sol )
H ' ( sol )
H ' ( sol )
iteración siguiente, entonces se puede volver a ejecutar Newton-Raphson con algunas iteraciones más (total, nunca
van a ser muchos los intentos) ).
Solución: Aquí va la función:
function sol=NR_escalar (H,Hprima, x0 ,n)
sol= x0 ;
for k=1:n
sol=sol‐H(sol) / Hprima(sol) ;
end
Ejemplo: (también se pueden probar con los ejemplos usados para bisección)
Observación: lim ln(ln(1 + x 2 )) = −∞ , y , lim− x = 0 . Por otra parte: lim ln(ln(1 + x 2 )) = +∞ , y ,
x →0
x →0
x → +∞
lim − x = −∞ .
x → +∞
Hallar una solución de ln(ln(1 + x 2 )) = − x .
Entonces buscamos ceros de H ( x) = ln(ln(1 + x 2 )) + x .
Vemos que la solución no debe andar lejos de x0 = 1 , y, H ' ( x) =
1
1
2x
.2 x + 1 =
+1.
2
2
2
ln(1 + x ).(1 + x 2 )
ln(1 + x ) 1 + x
Entonces:
>> H=@(x)
log(log(1+x.^2))+x ;
>> Hprima=@(x)
(en Matlab ln es log, y log10 es log10 , también está disponible log 2 es log2 )
2*x./(log(1+x.^2)* (1+x.^2))+1 ;
>> solaprox=NR_escalar (H,Hprima, 1,10)
(o sea, x0 =1 y n=10 ) y verificamos
>> H(solaprox)
0,…….. (debe dar casi 0)
********************************************************************************************************
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Comentamos que uno de los inconvenientes del Método de Newton‐Raphson (N‐R) es que se debe disponer explícitamente de
la derivada de la función. Si dicha derivada es trabajosa de calcular o de evaluar, o si directamente no sabemos como hallarla‐
por ejemplo si los valores de la función pueden calcularse en forma explícita pero quizás no los de la derivada, Por ejemplo:
Sea H : α a H (α ) = solución de e αx = − x , uno supone que H varía en forma suave con α , pero no conocemos una
fórmula para H (α ) , pero sí podemos hallar H (α ) para cada α usando algún tipo de método,
en ese caso nos gustaría poder aplicar un método semejante al de Newton‐Raphson (N‐R) pero sin tener que disponer de la
derivada.
Un posible método en ese sentido es el Método de la SECANTE:
METODO de la SECANTE:
La idea es similar al de N‐R, pero se parte de dos aproximaciones iniciales y la aproximación que sigue consiste en aquel punto
~
~
donde se anule H (en lugar de H ), donde H ( x) =
~
H ( x) = H ' ( x n ).( x − x n ) + H ( x n ) .
O sea que:
x n +1 = x n −
H ( x n ) − H ( x n −1 )
.( x n − x n −1 ) + H ( x n ) , en lugar de
x n − x n −1
H ( xn )
H ( xn )
. (En N‐R era x n +1 = x n −
).
H ( x n ) − H ( x n −1 )
H ' ( xn )
x n − x n −1
Gráficamente: Veamos las dos primeras iteraciones del Método de la Secante:
A partir de x0 y x1 se halla x 2 , en el paso siguiente me olvido de x0 , y x1 pasa a jugar el papel de x0 y x 2 el papel de x1 , y
repito….
Como en N‐R, cortamos después de un número de iteraciones que pasamos como parámetro. A continuación lo programamos:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
function sol=secante(H,x0,x1,n)
sol=x1;
for k=1:n
sol=x1‐H(x1)*(x1‐x0)/(H(x1)‐H(x0));
x0=x1;
x1=sol;
end
Lo probamos, por ejemplo en cos(x)=x (o sea, cos(x)‐x=0).
>> H=@(x) cos(x)‐x
H=
@(x) cos(x)‐x
>> sol=secante(H,2.1,2,8)
sol =
0.7391
>> H(sol)
ans =
0
la encontramos con tanta precisión como permite el Matlab!
Observación: Si ponemos:
>> sol=secante(H,2.1,2,12)
Warning: Divide by zero.
> In secante at 4
sol =
NaN
obtenemos NaN (“Not a Number”)
Esto indica que hubo una operación indefinida, en este caso es un 0
0
, pues cuando el método converge a la raíz‐ y
generalmente lo hace rápido‐ puede suceder que x0 = x1 = raíz de H, y entonces el denominador
En N‐R:
H ( x1 ) − H ( x0 )
es 0 .
0
x1 − x0
1
no tenía problemas si x n = raíz de H, si la raíz es simple.
H ' ( xn )
Como reflexión nos queda que en el Método de la SECANTE no conviene “pasarnos de rosca” con las iteraciones (en general
converge con pocas, y si da: NaN entonces repetirlo con menos iteraciones).
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Comentario sobre las operaciones con ∞ (Inf) y/o con indeterminaciones en Matlab:
Generalmente MATLAB respeta las definiciones usuales, pero no siempre. Algunas cuestiones que podrían sorprendernos:
1
es “Inf”
0
Inf
Inf
−1
es “‐Inf” (o sea que 0 es 0 + ),
0
, y,
es NaN,
Pero 0^0 es 1
y
1^Inf es NaN.
y también:
Inf^0 es 1.
0
es NaN,
0
0*Inf es NaN,
Inf‐Inf es NaN,
Además: log(Inf) es Inf, y log(0) es –Inf, pero log(‐1) es 0+pi*i , y así por ejemplo: log(‐2)=ln(2)+pi*i , y , sqrt(‐1)es o+1*i.
Acerca de la Velocidad de Convergencia de un Método:
Se denomina ORDEN de un Método a lo siguiente:
Si las aproximaciones dadas por cierto método: x1 , x 2 ,………., x n , x n +1 ,…….. → ξ , raíz de H, entonces en general existe q tal
que
x n +1 − ξ
xn − ξ
q
= O(1) (es decir, lim
n→∞
x n +1 − ξ
xn − ξ
Equivalentemente se puede pedir :
q
= k , para k ∈ R>0 ).
H ( x n +1 )
= O(1) .
H ( xn ) q
El orden “q” es 2 para N‐R
El orden “q” es 1 para BISECCION.
El orden “q” es
1+ 5
≅ 1,61...... para SECANTE.
2
Estor valores pueden hallarse teóricamente, o estimarlos numéricamente como en la búsqueda de Exponente Hölder:
x n +1 − ξ ≈ k . x n − ξ
log( x n +1 − ξ )
log( x n − ξ )
≅
q
⇒ log( x n +1 − ξ ) ≅ log k + q. log( x n − ξ ) , entonces dividiendo por log( xn − ξ ) obtenemos:
log(k )
+q
log( x n − ξ )
ya que
log( H ( x n +1 ))
log(k )
→ q)
→ 0 . (o análogamente:
log( H ( x n ) ) n→∞
log( x n − ξ ) n→∞
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Recordemos la función NR_1:
function sol=NR_1(H,Hprima,x0,n)
sol=x0;
for k=1:n
sol=sol‐H(sol)/Hprima(sol);
end
% Hprima=la derivada de H
% es la primera estimacion de sol=la solucion
% n = numero de iteraciones
Por ejemplo:
>> H=@(x) cos(x)‐x
H=
@(x) cos(x)‐x
>> Hprima=@(x) ‐sin(x)‐1
Hprima =
@(x) ‐sin(x)‐1
>> c=NR_1(H,Hprima,6,20)
c=
0.7391
>> for k=0:9
F(k+1)=norm((log(abs(NR_1(H,Hprima,6,k+1))‐c))/(log(abs(NR_1(H,Hprima,6,k))‐c)));
end
>> miro…. 2.5100
2.2130 2.0912 (tiende a 2) Inf (cuando da Inf el método termina)
O también:
>> for k=0:9
W(k+1)=norm((log(H(NR_1(H,Hprima,6,k+1))))/(log(H(NR_1(H,Hprima,6,k)))));
end
>>miro….. 2.1268
2.0996 y
>> W(10)
ans =
Inf
el método terminó!
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Veamos otro ejemplo: para la SECANTE:
>> for k=0:11
U(k+1)=norm(log(abs(secante(H,6.5,6.4,k+1)‐c)))/(log(abs(secante(H,6.5,6.4,k)‐c)))));
end
>> miro…. 1.8100
1.7130 1.6993 (tiende a
1+ 5
≅ 1,61...... )
2
Inf
(cuando da Inf el método termina)
Volviendo al Método de la SECANTE, lo que hacemos es aproximar la derivada de H en xn por un cociente incremental lateral
(de qué lado depende de la posición de x n −1 respecto de xn ).
Una alternativa mixta sería usar una derivada “aproximada”. En este caso, una estimación más estable de la derivada se puede
obtener promediando cocientes incrementales a izquierda y derecha. Armamos la siguiente función:
function Hprima_x=derivaprox(H,x,epsi)
Hprima_x=(H(x+epsi)‐H(x‐epsi))/(2*epsi );
%corresponde a estimar a
H (x + ε ) − H (x − ε )
≈ H ' ( x)
2ε
Con esta otra función podemos armar un N‐R con derivada numérica:
function sol=NR_1_ap(H,x0,n,epsi)
if nargin==3
epsi=0.001;
% si no se pasa el parámetro epsi , se toma por defecto 0.001
end
sol=x0;
for k=1:n
sol=sol‐H(sol)/derivaprox(H,sol,epsi);
end
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Caso MULTIVARIADO:
Queríamos ahora resolver sistemas no‐lineales de n ecuaciones y n incógnitas.
 h1 ( x1 , x 2 ,........., x n ) = 0
 f1 ( x1 , x 2 ,........., x n ) = g1 ( x1 , x 2 ,........., x n )
h ( x , x ,........., x ) = 0
 f ( x , x ,........., x ) = g ( x , x ,........., x )

 2 1 2
2
1
2
n
n
n
,
⇔ 2 1 2

................................................
 ..............................

hn ( x1 , x 2 ,........., x n ) = 0
 f n ( x1 , x 2 ,........., x n ) = g n ( x1 , x 2 ,........., x n )
donde hi = f i − g i
Es decir que lo podemos escribir en forma vectorial como:
r
Hallar X para H : R n → R n tal que H(X)=0, (o sea, H ([ x1 ; x 2 ;.........; x n ]) = [0;0;..............;0] )
Resulta cómodo pensarlo en columnas, y buscar
  x1   0
 x1 
   
.
 .  .
 
X =  .  / H .  = . .
   
 
 .  .
.
 
   
 x n 
  x n   0 
Proponemos generalizar N‐R, pero en su versión aproximada.
Nótese que, incluso aunque las derivadas sean fáciles de calcular, por ejemplo, H : R 5 → R 5 , las derivadas a programar
son ¡25!, y puede ser muy pesado de programarlas a mano. En cambio, podemos hallarlas numéricamente usando H, sin dar
explícitamente ninguna fórmula para
∂H i
.
∂x j
Por otra parte, notemos que el paso iterativo de N‐R era: x n +1 = x n −
H ( xn )
).
H ' ( xn )
Esto también se puede escribir como: x n +1 = x n − ( H ' ( x n )) −1 * H ( x n ) .
Escrito así se puede generalizar a más variables poniendo x n +1 = x n − ( JH ( x n )) −1 * H ( x n ) donde JH (•) es la matriz
Jacobiana de H en cada punto. Programamos su cálculo aproximado:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
 ∂H 1
( x)

 ∂x1
 ∂H 2
( x)

 ∂x1
.
En cada columna de JH ( x) = 

.


.
 ∂H n
( x)

 ∂x1
∂H 1
( x)
∂x j
∂H 2
( x)
∂x j
.
.
.
∂H n
( x)
∂x j

. .


.
. .

.
. .  están las derivadas respecto de 1 variable por vez, entonces:

.
. .
.
. .

.
. .

 0
0
 0
 
 
 
.
.
.
∂




( H ) = ( H ( x + ε 1 ) − H ( x + ε 1 )) / 2ε , donde  1  es la j‐ésima columna de la matriz identidad I nxn .
 
 
 
∂x j
.
.
.
 0
0
 0
 
 
 
.
Y entonces programamos:
function J=JACOB_APROX(H,X,epsi)
I=eye(max(size(X)));
for k=1:max(size(X))
J(:,k)=(H(X+epsi*I(:,k))‐H(X‐epsi*I(:,k)))/(2*epsi);
end
Y ahora programamos NR‐MULTIVARIADO:
function sol=NR_MULTI(H,x0,n,epsi)
if nargin==3
epsi=0.001;
end
sol=x0;
for k=1:n
sol=sol‐inv(JACOB_APROX(H,sol,epsi))*H(sol);
end
% derivo en cada columna
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Veamos un Ejemplo:
cos( x1 − x 2 ) − 1 = 0
2
 x1 + x 2 − 6 = 0
Hallar alguna solución de: 
(una solución es (2,2), pero vamos a hacer como que no lo sabemos y la buscamos con NR_MULTI).
  x1   cos( x1 − x 2 ) − 1
  =  x + x 2 − 6  , y ponemos:
x
2
2


  1

Lo armamos vectorialmente (como antes), H es: H  
>> H=@(x)
[cos(x(1)‐x(2))‐1; x(1)+x(2)^2‐6]
  2 .5  
 
1
.
8
 
% calculamos H  
>> H([2.5 1.8])
ans =
‐0.2352
‐0.2600
0 
0 
no está lejos de  
Buscamos con NR_MULTI:
>> NR_MULTI(H,[2.5;1.8],10,0.0001)
ans =
2.0005
1.9999
 2
 2
( ≈   la verdadera solución)
En realidad, tal como lo programamos NR_MULTI también funciona en 1 variable:
>> H=@(x) cos(x)‐x
H=
@(x) cos(x)‐x
>> NR_MULTI(H,1,8,0.01)
ans =
0.7391
(la solución de cos(x)=x !!)
********************************************************************************************************
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Recordemos que habíamos programado un método N-R multivariado que permite buscar soluciones de ecuaciones
n
n
.
vectoriales (o sistemas de ecuaciones) de
R →R
Copiamos por las dudas (alguno habrá faltado) las funciones JACOB‐APROX y NR‐MULTI:
function J=JACOB_APROX(H,X,epsi)
I=eye(max(size(X)));
for k=1:max(size(X))
J(:,k)=(H(X+epsi*I(:,k))-H(X-epsi*I(:,k)))/(2*epsi);
end
function sol=NR_MULTI(H,x0,n,epsi)
if nargin==3
epsi=0.001;
end
sol=x0;
for k=1:n
sol=sol-inv(JACOB_APROX(H,sol,epsi))*H(sol);
end
Planteamos entonces el siguiente ejercicio:
Ejercicio:
Halle, si es posible, algún extremo de la función
F : R 3 → R dada por
F ( x, y, z ) = x 2 + y 2 + z 2 + sen2 ( y − z ) + 2 yz − 2 x + 6
cerca del
 1.2 
 0.1 

.
0.15
Probar que ∇F debe anularse.
Solución:
Llamo H= ∇F ( x, y, z , ) = [2 x − 2; 2 y + 2 sen( y − z ) cos( y − z ) + 2 z; 2 z + 2 sen( y − z ) cos( y − z ) + 2 y ] y
busco ceros de H:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> H=@(X)
[2 * X (1) − 2;2 * X (2) + 2 * sin( X (2) − X (3)) * cos( X (2) − X (3)) + 2 * X (3); 2 * X (3) −
2 * sin( X (2) − X (3)) * cos( X (2) − X (3)) + 2 * X (2)]
 1 
 
(debería dar:  − 0  aprox.)
 0 
 
>> PUNTO_CRITICO=NR_MULTI(H,[1.2;0.1;0.15],12)
Presentamos por último un método que puede aplicarse en contextos aún más generales (por ejemplo: espacios
métricos), aunque, claro, requiere más condiciones (o más restrictivas). Pero incluso N-R se puede ver como caso
particular. Se basa en el siguiente teorema:
TEOREMA del PUNTO FIJO de BANACH: (o de la Aplicación Contractiva)
Sea U un espacio métrico (léase R n ), y sea T una aplicación de U en U, o sea, T : U → U tal que ∃c ∈ (0,1) , o sea,
0<c<1 / d(T(u),T(v)) ≤ d(u,v) (esto es una aplicación contractiva) con d la función distancia en U,
entonces ∃ ! p ∈ U / T(p)=p.
Además, partiendo de x0 ∈ U cualquiera, vale que lim T ( n ) ( x0 ) = p donde T ( n ) = T o T o ..... o T (n veces).
n → +∞
→ →
→ →
→
→
Si tenemos una determinada ecuación f ( X ) = g ( X ) (escalar o vectorial) que podemos escribir como x = T ( x ) , y si T resulta
ser contractiva, entonces podemos estimar la solución haciendo:
x0 , x1 = T ( x 0 ), x 2 = T ( x1 ),........., → X ( solución) .
Nótese que en realidad necesitamos que valga, no en general, sino para un x0 “bien elegido”.
Si x n +1 − x n < c x n − x n −1 < c 2 x n −1 − x n − 2 < ......... < c n x1 − x0 → 0 porque 0 < c < 1
n →∞
Entonces para n grande es x n +1 ≈ x n
En particular, si en N‐R ponemos
y como T ( x n ) = x n +1 luego x n ≅ T ( x n ) (casi un punto fijo)
T ( x) = x −
T ( x n +1 ) − T ( x n ) = T ( x n +1 ) − x n +1 = x n +1 −
H ( x)
, vale que
H ' ( x)
H ( x n +1 )
H ( x n +1 )
.
− x n +1 =
H ' ( x n +1 )
H ' ( x n +1 )
Entonces si (y éste “si” es la restricción) podemos escribir f(x)=g(x) como x=T(x) para T contraída, el método sale con ésta
función:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
function sol=PUNTO_FIJO(T,x0,n)
% si no se da n, se hace hasta que se halla el punto fijo
if nargin==2
sol=x0;
x1=T(x0);
while ((norm(x1-sol))>0)
temp=sol;
sol=T(x1);
x1=temp;
end
end
sol=x0;
for k=1:n
sol=T(sol);
end
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐hasta aquí 9:15 aprox
Veamos un ejemplo:
Busquemos una solución de cos(x)=x.
Directamente aquí es T(x)=cos(x) y sabemos por cuestiones generales (ver un gráfico de cos(x) y x) que debe haber
una solución entre 0 y 1 aproximadamente.
Allí T’(x)=sen(x) y
T (u ) − T (v)
u−v
= T ' (c) = sen(ξ ) por el Teo de Lagrange, y en [0,1] es sen(ξ ) < sen(1) <1.
Entonces T contrae con c< sen(1) .
Entonces partimos de, por ejemplo: x0 = 0.3
>> sol=PUNTO_FIJO(@cos, 0.3, 20)
sol=0.7391
------------------------------------------------------------------------------------------------------------------------------------
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Soluciones numéricas de ecuaciones diferenciales.
En éste caso las ecuaciones diferenciales pueden ser no-lineales y de R en R n ; pero en principio, sí, van a ser de 1er
orden. Las de orden n se pueden reescribir como si fueran de 1er orden (con más variables), haciendo un cambio de variables
x1 = x(t )
x 2 = x' (t )
estándar:
, (lo que los físicos llamarían: Representación en el espacio de fases).
x3 = x' ' (t )
...............
El problema de valores iniciales se puede escribir como:
(más adelante veremos cómo adaptarlo a problemas de contorno)
 X ' (t ) = f (t , X (t ))
 X (t 0 ) = X 0
Hallar X : R → R n / ( P.V .I .) 
Nótese que, en principio, esto podría escribirse como:
t
t
 X ' (t ) = f (t , X (t )) 
 . Y siendo T ( X (t )) = ∫ f ( s, X ( s )ds + X 0 , lo que
X (t ) = ∫ f ( s, X ( s )ds + X 0 ; verifica que 
 X (t 0 ) = X 0 
t0
t0
resulta: X(t)=T(X(t)), o sea que hallar X(t) es hallar un punto fijo de un espacio adecuado (de funciones), y de hecho la
demostración del Teorema de Picard de Existencia y Unicidad de las soluciones, se basa en el Teorema de Punto Fijo de Banach.
La búsqueda numérica de las soluciones, sin embargo, se suele hacer usando otras ideas.
El método más rústico, pero que inspira a otros mejores, es el de EULER. La idea es la siguiente:
Dibujemos las distintas soluciones “paralelas” a la de nuestro P.V.I. con distintos valores iniciales:
Se trata de seguir la pista a la solución, aproximando en cada punto por la tangente.
(depende de la curvatura, uno se va aproximando por debajo o por arriba de la verdadera solución)
Descargamos un programita muy fácil de usar:
http://math.rice.edu/~dfield/
For use with version 7.7 of MATLAB.
dfield8.m New December 10, 2009.
>> dfield8
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
x ' = x2 - t
4
3
2
x
1
0
-1
-2
-3
-4
-2
0
2
4
t
6
8
10
Interpretamos X(t)=X´(t)^2‐t
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
El método lo que hace en cada paso temporal, es estimar:
X(t+h)=X(t)+X’(t).h
X(t+h)=X(t)+f(t,X(t)).h
como X’(t)= f(t,X(t)),
Hagamos una 1era versión:
function [ t , X ]=euler(f,t0,X0,tfinal,h)
pasos=1+floor((tfinal-t0) / h);
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
t=linspace(t0,tfinal,pasos);
h_efectivo=t(2)-t(1) ; X(1)=X0 ;
for k=2:pasos
X(k)=X(k-1)+f(t(k-1), X(k-1)) * h_efectivo;
end
Ejemplo:
Hallar X tal que
 X ' (t ) = X (t )
en [0,2]

 X (0) = 1
(solución: X(t)= e t )
>> [ t , X ]=euler(@(t,X)X,0,1,2,0.001);
>> plot(t,X)
8
7
6
5
4
3
2
1
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
2
>> X(end)
ans =
7.3817
≈ e2
----------------------------------------------------------------------------------------------------------------------------------------------
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> H=@(X) [2*X(1)-2;2*X(2)+2*sin(X(2)-X(3))*cos(X(2)-X(3))+2*X(3);2*X(3)+2*sin(X(2)-X(3))*cos(X(2)-X(3))+2*X(2)]
H=
@(X)[2*X(1)-2;2*X(2)+2*sin(X(2)-X(3))*cos(X(2)-X(3))+2*X(3);2*X(3)+2*sin(X(2)-X(3))*cos(X(2)-X(3))+2*X(2)]
>> TO_CRITICO=NR_MULTI(H,[1.2;0.1;0.15],12)
>> H=@(X) [cos(X)-X]
H=
@(X)[cos(X)-X]
>> TO_CRITICO=NR_MULTI(H,0,12)
TO_CRITICO =
0.7391
>> H=@(X) [2*X(1)-2;2*X(2)+2*sin(X(2)-X(3))*cos(X(2)-X(3))+2*X(3);2*X(3)-2*sin(X(2)-X(3))*cos(X(2)-X(3))+2*X(2)]
H=
@(X)[2*X(1)-2;2*X(2)+2*sin(X(2)-X(3))*cos(X(2)-X(3))+2*X(3);2*X(3)-2*sin(X(2)-X(3))*cos(X(2)-X(3))+2*X(2)]
>> TO_CRITICO=NR_MULTI(H,[1.2;0.1;0.15],12)
TO_CRITICO =
1.0000
-0.0000
0.0000
>> norm([0.5 -0.25;-0.25 0])
ans =
0.6036
>> G=@(X) [0.5*X(1)+0.1*X(1)^5-0.25*X(2);0.125*X(2)^4-0.25*X(1)]
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
G=
@(X)[0.5*X(1)+0.1*X(1)^5-0.25*X(2);0.125*X(2)^4-0.25*X(1)]
>> G([0;0])
ans =
0
0
>> G=@(X) [0.5*X(1)+0.25*X(1)^4-0.25*X(2);0.125*X(2)^4-0.25*X(1)]
G=
@(X)[0.5*X(1)+0.25*X(1)^4-0.25*X(2);0.125*X(2)^4-0.25*X(1)]
>> G=@(X) [0.5*X(1)+0.25*X(1)^2-0.25*X(2);0.125*X(2)^4-0.25*X(1)]
G=
@(X)[0.5*X(1)+0.25*X(1)^2-0.25*X(2);0.125*X(2)^4-0.25*X(1)]
>> T=@(X) [-0.5+0.25*X(1)^2-0.25*X(2);0.125*(X(2)+1)^4-0.25*X(1)+0.25]
T=
@(X)[-0.5+0.25*X(1)^2-0.25*X(2);0.125*(X(2)+1)^4-0.25*X(1)+0.25]
>> T([1;-1])
ans =
0
0
>> T=@(X) [0.5+0.25*X(1)^2-0.25*X(2);0.125*(X(2)+1)^4-0.25*X(1)-0.75]
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
T=
@(X)[0.5+0.25*X(1)^2-0.25*X(2);0.125*(X(2)+1)^4-0.25*X(1)-0.75]
>> T([1;-1])
ans =
1
-1
>> sol=PUNTO_FIJO(T,[0.5;-0.5],12)
sol =
0.9991
-0.9996
>> sol=PUNTO_FIJO(T,[0.1;-0.1],12)
sol =
0.9986
-0.9994
>> sol=PUNTO_FIJO(T,[0.1;-0.1],20)
sol =
1.0000
-1.0000
********************************************************************************************************
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Sigamos con soluciones numéricas de Ecuaciones Diferenciales:
Programamos el Método de EULER que mencionamos antes:
Idea:
 x' (t ) = f (t , x(t ))
 x(t 0 ) = x 0
Queremos hallar X solución de 
x' ' (t 0 ) 2 x' ' ' (t 0 ) 3
.h +
.h + ........
2
3!
Si h es chico ( h ≈ 0 ) entonces h 2 , h 3 ,.............. << h y descartamos los términos de orden 2,3,……….
x(t 0 + h) = x(t 0 ) + x' (t 0 ).h +
Quedándonos:
Llamamos:
x(t 0 + h) ≈ x(t 0 ) + x' (t 0 ).h y como x' (t ) = f (t , x(t )) , obtenemos: x(t 0 + h) ≅ x(t 0 ) + f (t 0 , x(t 0 )).h
t (1) al t0
y
x(1) a x0
t (2) es t 0 + h
y
x(2) a x(1) + f (t (1), x(1)) + h
t (3) es t 0 + 2h
y
x(3) a x(2) + f (t (2), x(2) + h , etc.
Si h = 0.5 :
function [ t , X ]=euler(f,t0,X0,tfinal,h) %donde t=[t(1),t(2),……,t(k)]es una partición del intervalo[t0,tfinal]donde estimo la
solución, y la matriz x=[(x1),(x2),………..]tiene en cada columna el vector posición en tiempo ti
pasos=1+floor(abs(tfinal‐t0) / h);
t=linspace(t0,tfinal,pasos);
hutil=t(2)‐t(1) ;
% ∆t es siempre igual ***
X(:,1)=X0 ;
for k=2:pasos
X(:,k)=X(:,k‐1)+f(t(k‐1), X(k‐1)) * hutil;
end
*** si entre t0 y tfinal h no cabe una cantidad exacta de veces, tomo un hutil ≈ h pero un poquito más chico. Por ejemplo:
En [0,pi] con h=0.01 hago[pi‐0]/0.01=314.1592 tomo 314+1=315 sub‐intervalos (de longitud pi/315=0.0099…. ≈ 0.01
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
 x' = x
cuya solución es x(t ) = e t .
 x(0) = 1
Lo probamos primero con una ecuación cuya solución conocemos: 
Probamos en el intervalo [0,2] con distintos pasos h, por ejemplo 0.01, 0.001, 0.0001
>> f=@(t,x) x
% aunque f dependa sólo de x hay que dar las dos variables de entrada (para poder evaluar f(t,x(t)))
f=
@(t,x) x
>> [t,x]=euler(f,0,1,2,0.01);
>> x(end)
ans =
7.3160
>> exp(2)
ans =
7.3891
>> [t,x]=euler(f,0,1,2,0.001);
>> x(end)
ans =
7.3817
% etc, cuando h → 0 la solución va mejorando
Pero cada vez hace falta dar más pasos al achicar el h, y el método cada vez tarda más!!
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
También resolvimos antes con el programita dfield8.m
 x' (t ) = x(t ) 2 − t

 x(−2) = 1.4
en [‐2,‐1.5]
Esta vez no sabemos que fórmula tendría la solución exacta.
Pero podemos indirectamente si está convergiendo probando dos pasos distintos: por ejemplo: h , y, h/2 , y si las dos
soluciones difieren poco damos por buena la solución aproximada:
>> f=@(t,x) x.^2‐t
f=
@(t,x) x.^2‐t
>> [t,x]=euler(f,‐2,1.4,‐1.5,0.001);
>> x(end)
ans =
14.5270
>> [t,x]=euler(f,‐2,1.4,‐1.5,0.0005);
>> x(end)
ans =
14.7409
están cerca
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
También podemos resolver alguna con X : R → R n con n>1.
Por Ejemplo:
 x(t ) 


Hallemos X : R → R con X (t ) =  y (t ) 
 z (t ) 


3

 x 2 (t ) 
 2 

x
t
t
'
(
)
cos(
)
*
=
 y (t ) 

 z 2 (t ) 



tal que 
0
.
5






X (0) =  − 0.5 

 0.2 



en [0,4], donde la solución
es una trayectoria en el espacio.
>> f=@(t,x) cos(t).*[x(1).^2, x(2).^2, x(3).^2]
f=
@(t,x) cos(t)*[x(1).^2, x(2).^2, x(3).^2]
>> [t,X]=euler(f,0,[0.5;‐0.5;0.2],4,0.001);
>> plot3(X(1,:),X(2,:),X(3,:))
0.26
0.24
0.22
0.2
0.18
0.16
-0.2
-0.4
1
0.8
-0.6
0.6
-0.8
0.4
-1
0.2
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
También podemos resolver ecuaciones de orden n:
x ( n ) + a(t ).x ( n −1) + .......... + p (t ).x(t ) = q(t )
Hacemos la representación en el espacio de fases:
x1 = x
x2
 x1 '   x'  

  

 
x 2 = x'
x3
 x 2 '   x' '  







.
.
.
.






entonces X’=
=
=
.
.
 .   .  







.
.
 .   .  

 x '   x ( n )   q (t ) − px − ........ − ax 
x n = x ( n −1)
 
1
n
 n 
Por Ejemplo: (Oscilador armónico no‐lineal y forzado)
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
t

 x' ' (t ) − 2 sin(t ).x' (t ) − ( 3 ) x(t ) = cos(2t )

x(0) = 2


x' (0) = −0.5


en [0 , 3] con paso h=0.001 . Entonces:

x2



 x' 





'
'
=
=
X
x
t

 x' ' 


cos(
2
)
(
)
2
sin(
)
+
+
t
x
t
x
 x1   x  

1
2
  ⇒
X=   =   ⇒ 
3



 x 2   x'   X (0) =  x(0)  
 2 
 x' (0)  

x(0) = 



 − 0.5 

>> f=@(t,x) [x(2); cos(2*t)+(t/3)*x(1)+2*sin(t)*x(2)]
f=
@(t,x) [x(2); cos(2*t)+(t/3)*x(1)+2*sin(t)*x(2)]
>> [t,X]=euler(f,0,[2;‐0.5],3,0.001);
(x era x1 , la 1er fila de X)
>> plot(t,X(1,:))
12
10
x
8
6
4
2
0
0
0.5
1
1.5
t
2
2.5
3
>> plot(X(1,:), X(2,:))
(es la solución vista en el plano de fases)
18
16
14
12
x'
10
8
6
4
2
0
-2
0
2
4
6
x
8
10
12
Si en cierto tramo las curvas solución tienen una concavidad de signo fijo, Euler sobrevalúa o subevalúa de forma recurrente.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Una forma de compensar es, en lugar de usar la tangente en t k , o sea: X(:,k)=X(:,k-1)+f(t(k-1),X(:,k-1))* ∆t ;
en vez de ello, tratar de usar la tangente que debería haber en la “llegada”, para que, retrocediendo, regresemos
correctamente al punto inicial, es decir, ¿Cuál es X(:,k) de modo que X(:,k)= X(:,k-1)+f(t(k),X(:,k))* ∆t ?
El problema es que X(:,k) está IMPLÍCITO (aparece en ambos lados de la ecuación)
Esto puede verse como un problema de punto fijo, tomando T(X(:,k))= X(:,k) donde
T(X(:,k))=X(:,k-1)+f(t(k),X(:,k))* ∆t .
En ese contexto:
~
~
T ( X (:, k )) − T ( X (:, k )) = f (t (k ), X (:, k )) − f (t (k ), X (:, k )) ∆t
Y para ∆t suficientemente chico se puede hacer de T un operador de contracción si f cumple una condición de
Lipschitz en la segunda variable. De esta manera, usando el Principio del Punto Fijo de Banach, la idea es partir de
un “X(:,k) estimado” (de hecho la aproximación de Euler) e ir iterando hasta aproximarnos al X(:,k) implícito.
En la práctica fijamos un valor de tolerancia, y cuando dos iteraciones distan entre sí menos que dicho valor de
tolerancia, aceptamos el X(:,k) y pasamos a k+1:
function [t,X]=eulerimp(f,t0,X0,tfinal,h,tol)
if nargin==5
tol=0.001;
end
pasos=floor(abs(tfinal‐t0)/h)+1;
t=linspace(t0,tfinal,pasos);
X(:,1)=X0;
hutil=t(2)‐t(1);
for k=2:pasos
temp1=X(:,k‐1)+F(t(k‐1),X(:,k‐1))*hutil;
temp2=X(:,k‐1)+F(t(k),temp1)*hutil;
while abs(temp2‐temp1)>=tol
temp1=temp2;
temp2=X(:,k‐1)+F(t(k),temp2)*hutil;
end
X(:,k)=temp2;
end
En general la estimación con eulerimp aproxima la solución correcta cometiendo errores “contrarios” a los de Euler
Por Ejemplo:
 x' = x
cuya solución es x(t ) = e t , para t ∈ [0,2] .
 x(0) = 1
Miremos el que ya hicimos: 
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> f=@(t,x) x
f=
@(t,x) x
>> [tr,xr]=euler(f,0,1,2,0.01);
>> xr(end)
ans =
7.3160
(el verdadero valor es e´2 ≅ 7.3891......... )
>> [tk,xk]=eulerimp(f,0,1,2,0.01); (dejamos la tolerancia por default 0.001)
ans =
7.4623
e´2 = 7.389
Esto sugiere que promediar los resultados de ambos métodos será mejor que cualquiera de ellos por separado:
Euler Combinado:
function [t,X]=eulercomb(f,t0,X0,T,h,tol)
if nargin==5
tol=0.001;
end
[te,Xe]=euler(f,t0,X0,T,h);
[ti,Xi]=eulerimp(f,t0,X0,T,h,tol);
t=(te+ti)/2;
X=(Xe+Xi)/2;
Si ponemos en el prompt:
>> f=@(t,x) x
f=
@(t,x) x
>> [t,x]=eulercomb(f,0,1,2,0.01);
>> x(end)
ans =
7.3891
Mejor que con Eulerimp y que con Euler!!
********************************************************************************************************
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Antes mencionamos que combinando los Métodos de Euler y de Euler implícito (con Eulercomb) los resultados eran
probablemente (casi siempre) mejores que con cada método por separado.
Podemos testear ésta característica viendo “cuándo es necesario achicar el paso” para que dos aproximaciones con
pasos distintos disten entre sí en menos de un ε prefijado. (Aunque no conozcamos la solución exacta).
Ejemplo:
 x' '+3.t.x'−9 x = 6t 2 − 4

Sea el problema de segundo orden: 
x(0) = 0

x' (0) = 1

a) Buscar solución aproximada con Euler para h=0.1 ,
0.1
y
2N
en [0 , 1.5]
0.1 0.1 0.1
,
,
, ………………………………………. Hasta que las soluciones con
2
4
8
0.1
en x(1.5) (es decir en x(end)) disten en menos de 0.001.
2 N +1
b) Idem con Euler imp
c) Idem con Euler comb
d) Comparar qué potencia de N se requirió con cada método para que las aproximaciones con
0.1
y
2N
0.1
disten en menos
2 N +1
de ε = 0.001 .
Solución:
Hacemos la representación (el cambio de coordenadas, para transformarlo en un problema de 1er orden):

x2



x' = 

 x1   x  
9 * x1 − 3 * t * x 2 + 6 * t.^ 2 − 4 

X=   =   ⇒ 
 0
 x 2   x'  
x(0) =  

1
Se puede hacer la búsqueda automáticamente:
>> f=@(t,X) [X(2) ; 9*X(1)-3*t.*X(2)+6*t.^2-4 ]
>> h=0.1;
>> [tl ,xl ]=euler(f,0,[0;1],1.5,h);
>> [tl2 ,xl2 ]=euler(f,0,[0;1],1.5,h/2);
>> n=1;
>> while(abs(xl(end)-xl2(end))>0.001)
n=n+1;
en
[0 , 1.5]
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
h=h/2;
tl = tl2 ;
xl = xl2 ;
[tl2 ,xl2 ]= euler(f,0,[0;1],1.5,h/2);
end
>>n
n=
3
>> xl(end)
ans =
1.7501
Para los otros métodos se copian las mismas líneas cambiando Euler por eulerimp y Euler por eulercomb.
>> f=@(t,X) [X(2) ; 9*X(1)-3*t.*X(2)+6*t.^2-4 ]
>> h=0.1;
>> [tl ,xl ]=eulerimp(f,0,[0;1],1.5,h);
>> [tl2 ,xl2 ]=eulerimp(f,0,[0;1],1.5,h/2);
>> n=1;
>> while(abs(xl(end)-xl2(end))>0.001)
n=n+1;
h=h/2;
tl = tl2 ;
xl = xl2 ;
[tl2 ,xl2 ]= eulerimp(f,0,[0;1],1.5,h/2);
end
>>n
n=
5
>> f=@(t,X) [X(2) ; 9*X(1)-3*t.*X(2)+6*t.^2-4 ]
>> h=0.1;
>> [tl ,xl ]=eulercomb(f,0,[0;1],1.5,h);
>> [tl2 ,xl2 ]=eulercomb(f,0,[0;1],1.5,h/2);
>> n=1;
>> while(abs(xl(end)-xl2(end))>0.001)
n=n+1;
h=h/2;
tl = tl2 ;
xl = xl2 ;
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
[tl2 ,xl2 ]= eulercomb(f,0,[0;1],1.5,h/2);
end
>>n
n=
4
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
 x' = f (t , x)
de Euler es que como estima:
 x(t 0 ) = x0
Comentamos ahora que el problema básico 
x(t k ) = x(t k −1 ) + x' (t k −1 ) .∆t +
123
f ( t k −1 , xk −1 )
x ' ' (c k ) 2
.∆t
2
14243
con ck entre t k −1 y t k (Lagrange)
desprecia la curvatura
por
x(t k ) = x(t k −1 ) + f (t k −1 , x k −1 ).∆t
Una vía de solución es lo que hicimos con Euler combinado, tratando de compensar la curvatura por el lado contrario.
Otra idea, que además admite luego generalizaciones más agudas aún, es tratar de representar el término
de alguna manera.
Si ponemos:
~
x ( t k ) euler
644
47444
8
f (t k , xtk −1 + f (t k −1 , xtk −1 ) − f (t k −1 , x k −1 ))
x(t k ) = x(t k −1 ) + f (t k −1 , x k −1 ).∆t +
.∆t
14243
2 4444444
1
4
4
4
4
4
4
4
2
3
x ( t k −1 )
144424
443
x '( t k ) − x '( t k −1 ) x ''(ξ )
≅
=
. ∆t
~
= x ( t k +1 ) paso de euler
14444442 42424444443
(
x ''(ξ )
x ''( c ) 2
. ∆t
.∆t ).∆t =
2
2
Entonces, llamando m1 = f (t k −1 , x k −1 ) =pendiente de Euler, y,
m2 = f (t k , ~
x k euler ) ≅ pendiente (estimada en el punto de llegada)de Euler
x(t k ) = x(t k −1 ) + m1 ∆t +
(m2 − m1 )
m
m
∆t = x(t k −1 ) + m1 ∆t + 2 ∆t − 1 ∆t , o sea,
2
2
2
x ' ' (c k )
2
.(∆t )
2
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
x(t k ) = x(t k −1 ) +
(m1 + m2 )
∆t Este es el método de RUNGE‐KUTTA (de orden 2)
2
(este promedio de las pendientes hace un promedio similar al de Euler combinado). Además lo hace localmente, de modo que
posiblemente corrige antes de que los errores locales se aumenten de manera crítica.
En general la idea de los métodos de RUNGE‐KUTTA de orden n es combinar “pendientes” en distintos puntos para estimar
términos hasta el orden n del desarrollo de Taylor de la solución.
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
Programemos en Matlab:
function [t,X]=RK2(F,t0,X0,T,h)
pasos=ceil(abs(T-t0)/h);
t=linspace(t0,T,pasos);
X(:,1)=X0;
hutil=t(2)-t(1);
for k=2:pasos
m1=F(t(k-1),X(:,k-1));
m2=F(t(k),X(:,k-1)+m1*hutil);
X(:,k)=X(:,k-1)+((m1+m2)/2)*hutil;
end
% function [t,X]=RK2(f,t0,X0,tfinal,h)
% pasos=floor(abs(tfinal-t0)/h)+1;
% t=linspace(t0,tfinal,pasos);
% hutil=t(2)-t(1);
% X(:,1)=X0;
Ejercicio:
Probar con RK2 el h de la forma
0.1
h
tal que la solución con N y
N
2
2
h
N +1
disten en tfinal=1.5 en menos de 0.001 como
2
 x' '+3.t.x'−9 x = 6t 2 − 4

x(0) = 0
hicimos con Euler, Eulerimp y Eulercomb en el mismo problema de antes: 

x' (0) = 1

Solución:
Idem antes:
>> f=@(t,X) [X(2) ; 9*X(1)-3*t.*X(2)+6*t.^2-4 ]
>> h=0.1;
>> [tl ,xl ]=RK2(f,0,[0;1],1.5,h);
>> [tl2 ,xl2 ]=euler(f,0,[0;1],1.5,h/2);
>> n=1;
>> while(abs(xl(end)-xl2(end))>0.001)
en [0 , 1.5]
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
n=n+1;
h=h/2;
tl = tl2 ;
xl = xl2 ;
[tl2 ,xl2 ]= RK2(f,0,[0;1],1.5,h/2);
end
>>n
n=
4
No vamos a programar cada método de RUNGE-KUTTA, pero proponemos uno más como ejercicio:
RK4:
Dado t k −1 , xk −1 hacer:
h = ∆t
Entonces, llamando m1 = f (t k −1 , x k −1 ) ;
es la de Euler
m2 = f (t k −1 + h / 2, x k −1 + m1 * h / 2);
m3 = f (t k −1 + h / 2, x k −1 + m2 * h / 2);
m4 = f (t k + h, x k −1 + m3 * h);
function [t,X]=RK4(F,t0,X0,T,h)
% function [t,X]=RK2(f,t0,X0,tfinal,h)
pasos=ceil(abs(T-t0)/h);
% pasos=floor(abs(tfinal-t0)/h)+1;
t=linspace(t0,T,pasos);
% t=linspace(t0,tfinal,pasos);
hutil=t(2)-t(1);
X(:,1)=X0;
for k=2:pasos
m1=F(t(k-1),X(:,k-1));
m2=F(t(k),X(:,k-1)+m1*hutil);
X(:,k)=X(:,k-1)+((m1+2*m2+2*m3+m4)/6)*hutil;
Se hace un promedio ponderado de 6 pendientes (pesan más las del medio), para estimar los términos de Taylor
(hasta orden 4)
xk + (
m1 + 2m2 + 2m3 + m4
).∆t
6
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Ejemplo:
 Euler (too Eulerimp y Eulercomb)
 X ' (t ) = X (t )

para Hallar X tal que 
en [0,2] con
Probar las soluciones de 
RK 2
X (0) = 1


RK 4

todos el mismo paso h=0.01, para poder compararlos (solución: X(t)= e t )
e 2 ≈ 7.3817
Comparando en cada caso X(end) con
f=@(t,x) x
[te,Xe]=euler(f,0,1,2,0.01);
[tim,Xim]=eulerimp(f,0,1,2,0.01);
[tc,Xc]=eulercomb(f,0,1,2,0.01);
[tr2,Xr2]=RK2(f,0,1,2,0.01);
[tr4,Xr4]=RK4(f,0,1,2,0.01);
abs(Xe(end)-exp(2))
abs(Xim(end)-exp(2))
abs(Xc(end)-exp(2))
abs(Xr2(end)-exp(2))
abs(Xr4(end)-exp(2))
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
Contar el ode45 del Matlab:
Example
[t,y]=ode45(@vdp1,[0 20],[2 0]);
plot(t,y(:,1));
8
7
6
5
4
3
2
1
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
2
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
********************************************************************************************************
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Antes programamos los algoritmos de RUNGE‐KUTTA de orden 2 (RK2) y RUNGE‐KUTTA de orden 4 (RK4).
(ambas funciones se encuentran en el lirweb de la materia )
Planteamos el siguiente problema:

 − x2 

 x' ' = 2 * cos(10 * t ). * 
 x1 


 x1 
1
Hallar X : R → R 2 tal que X =   con 
x(0) =  
 − 1
 x2 


 − 0.5 

x' (0) = 

 0.5 

en
[0 , 3].
Hallar la solución con RK2 y con RK4 con paso h=0.1. Si el error relativo de uno respecto del otro (en norma de Fröbenius) fuera
> 0.001 entonces achicar el h y repetir. El error relativo mencionado sería
X RK 2 − X RK 4
Solución:
w3
 x1 
 x1 '  

 

 

w4
 x2 
 x2 '  

=
Hay que llamar W =   entonces W ' = 

x'
2 * cos(10 * t ) * (− w2 ) 
x ''
 1
 1  

 x '
 x ' '   2 * cos(10 * t ) * w 
1 
 2
 2  

w3





w4

W ' = 
 2 * cos(10 * t ) * (− w ) 

2




2 * cos(10 * t ) * w1 


Queda 
 1 




 −1 
W ( 0) = 

− 0.5 



 0.5 




>> f=@(t,W) [W(3) ; W(4);2*cos(10*t)*[-W(2);W(1)] ];
>> h=0.1;
>> f=@(t,W) [W(3) ; W(4);2*cos(10*t)*[-W(2);W(1)] ];
>> [tR2,WR2]=RK2(f,0,[1;-1;-0.5;0.5],3,h);
>> [tR4,WR4]=RK4(f,0,[1;-1;-0.5;0.5],3,h);
>> XR2=WR2(1:2,:);
>> XR4=WR4(1:2,:);
X RK 4
.
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> norm(XR2-XR4,'fro')/norm(XR4,'fro')
ans =
0.2240
da más de 0.001, entonces repetimos con h=0.01:
>> h=0.01;
>> [tR2,WR2]=RK2(f,0,[1;-1;-0.5;0.5],3,h);
>> [tR4,WR4]=RK4(f,0,[1;-1;-0.5;0.5],3,h);
>> XR2=WR2(1:2,:);
>> XR4=WR4(1:2,:);
>> norm(XR2-XR4,'fro')/norm(XR4,'fro')
ans =
0.0237
da más de 0.001, entonces repetimos con h=0.001:
>> h=0.001;
>> [tR2,WR2]=RK2(f,0,[1;-1;-0.5;0.5],3,h);
>> [tR4,WR4]=RK4(f,0,[1;-1;-0.5;0.5],3,h);
>> XR2=WR2(1:2,:);
>> XR4=WR4(1:2,:);
>> norm(XR2-XR4,'fro')/norm(XR4,'fro')
ans =
0.0023
da más de 0.001, entonces repetimos con h=0.0001:
>> h=0.0001;
>> [tR2,WR2]=RK2(f,0,[1;-1;-0.5;0.5],3,h);
>> [tR4,WR4]=RK4(f,0,[1;-1;-0.5;0.5],3,h);
>> XR2=WR2(1:2,:);
>> XR4=WR4(1:2,:);
>> norm(XR2-XR4,'fro')/norm(XR4,'fro')
ans =
2.3425e-004
ahora sí
Esta idea de realizar la cuenta con dos métodos distintos y considerar que la solución es aceptable si las soluciones
no difieren mucho puede sistematizarse. (De hecho los “solvers” de MATLAB comparan 2 métodos para decidir el h).
Podemos programarlo así:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
function [t,X]=RK24(F,t0,X0,tfinal,h,tol)
if nargin==4
h=abs(tfinal‐t0)/100;
tol=0.01;
end
if nargin==5
tol=0.01;
end
[t2,X2]=RK2(F,t0,X0,tfinal,h);
[t4,X4]=RK4(F,t0,X0,tfinal,h);
while((norm(X2‐X4), 'fro' )/(norm(X4), 'fro')) >tol)
h=h/2;
[t2,X2]=RK2(F,t0,X0,tfinal,h);
[t4,X4]=RK4(F,t0,X0,tfinal,h);
end
t=t4;
X=X4;
Podemos probarlo, Po Ejemplo, con:
 x' = x
cuya solución es x(t ) = e t , en el intervalo [0,2].

x
(
0
)
1
=

>> f=@(t,x) x
f=
@(t,x) x
>> [t,X]=RK24(f,0,1,2,0.1,0.01);
>> X(end)
ans =
7.3890
>> exp(2)
ans =
7.3891
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
Ahora planteamos un problema que tiene una ecuación sencilla pero requiere un gran esfuerzo de cálculo para algunos valores
del parámetro:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
 x' = x 2 − x 3
con δ ≈ 0

 x ( 0) = δ
en [ 0, 2 ] .
δ
Está asociado a la ignición de un combustible concentrado (por ejemplo un fósforo) con x=radio de la llama.
Al principio la llama es pequeña, en un momento se alcanza un valor crítico de ignición, y la llama crece hasta alcanzar una
nueva estabilidad. El gráfico tiene una pinta de “escalón” tanto más empinada cuanto menor sea δ (como vemos debajo).
Observación: “ x 2 − x 3 ” indica que las estabilidades se alcanzan cuando se anulan (en 0 y 1) la componente x 2 (proporcional a
la superficie de la llama) y x 3 (proporcional al volumen).
>> f=@(t,x) x.^2‐x.^3
f=
@(t,x) x.^2‐x.^3
>> delta=0.01;
>> [t,X]=RK24(f,0,delta,2/delta,0.1,0.01);
>> plot(t,X,'o')
delta=0.01
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0
20
40
60
80
100
120
140
160
>> delta=0.001;
>> [t,X]=RK24(f,0,delta,2/delta,0.1,0.01);
>> plot(t,X,'o')
180
200
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
delta=0.001
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0
200
400
600
800
1000
1200
1400
1600
1800
>> delta=0.0001;
>> [t,X]=RK24(f,0,delta,2/delta,1,0.01);
>> plot(t,X,'o')
2000
OJO!! hace falta agrandar el paso porque el intervalo es muy largo 2/delta=20000
delta=0.0001 y Paso=1
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
2
4
x 10
Pero con delta=0.00001 se cuelga, porque hace falta achicar tanto el paso que hacen falta muchos sub‐intervalos!! Hagamos:
>> delta=0.00001;
>> [t,X]=RK4(f,0,delta,2/delta,1,0.01);
OJO!!! No con RK24 para que no se cuelgue!!!!
>> plot(t,X,'o')
da (después de largo rato) una respuesta, pero la respuesta requiere 200000 puntos!!
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
delta=0.00001
Paso=1 con RK4
1
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
0
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
2
5
x 10
Una alternativa es usar un método que no use el mismo paso siempre, sino que lo achique, o agrande según haga falta!
A continuación veremos y programaremos el Método de BOGACKI‐SHAMPINE (BS23), (el 23 hace alusión a que compara en
cada paso) un método de orden 2 y de orden 3, y modifica el paso si no se cumple cierto criterio.
********************************************************************************************************
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Recién planteamos un problema que tiene una ecuación sencilla pero requiere para algunos valores del parámetro,
un gran esfuerzo de cálculo:
 x' = x 2 − x 3

 x ( 0) = δ
δ ≈0
en [0 ,
2
δ
]
Está asociado a la ignición de combustible concentrado (por ejemplo: un fósforo), con x=radio de la llama.
Al principio la llama es pequeña, en un momento se alcanza un valor crítico de ignición y la llama crece hasta
alcanzar una nueva estabilidad. El gráfico tiene una pinta de “escalón”, tanto más empinada cuanto menor sea el δ .
Observación: “ x 2 − x 3 ” indica que las estabilidades se alcanzan cuando se anulan (en 0 y 1) la componente x 2
(proporcional a la superficie de la llama) y x 3 (proporcional al volumen).
Con RK4 (no con RK24 q se cuelga!), después d largo rato, el Matlab da una respuesta pero ésta requiere de 200000 puntos!!
Una alternativa es usar un método que no use el mismo paso siempre, sino que lo achique, o agrande según haga
falta. Presentamos (y empezamos a programar) el Método de Bogacki-Shampine : BS23 (el 23 hace alusión a que
compara en cada paso) un método de orden 2 y uno de orden 3, y achica el paso si no se cumple cierto criterio.
Escribamos el algoritmo de BS23, que también está en la página web de la materia (lirweb):
function [t,X]=BS23(f,t0,X0,tf,h,tol)
if nargin==4
h=abs(tf-t0)/100;
tol=0.001;
end
if nargin==5
tol=0.001;
end
k=2;
err=tol+1;
BANDERA=0;
t(1)=t0;
X(:,1)=X0;
hutil=h;
h1=hutil;
while(BANDERA==0)
hutil=min(h1,abs(tf-t(k-1)));
h1=hutil;
while(err>tol)
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
hutil=h1;
s1=f(t(k-1),X(:,k-1));
s2=f(t(k-1)+hutil/2,X(:,k-1)+s1*hutil/2);
s3=f(t(k-1)+hutil*(3/4),X(:,k-1)+s2*hutil*(3/4));
temp1=X(:,k-1)+hutil*(2*s1+3*s2+4*s3)/9;
s4=f(t(k-1)+hutil,temp1);
err=((6*s2+8*s3-5*s1-9*s4)/72)*hutil;
h1=hutil*0.7;
%pause
end
t(k)=t(k-1)+hutil;
X(:,k)=temp1;
%pause
%h1=min(h1*4,h);
h1=min(h1*2,10*h);
if t(k)==tf
BANDERA=1;
end
err=tol+1;
k=k+1;
end
-------------------------------------------------------------------------------------------------------Y tomamos el mismo problema:
>> f=@(t,x)
x.^2- x.^3
>> delta=0.00001;
>> [t,x ]=BS23(f ,0 ,delta ,2/delta ,2, 0.0000001);
>> plot(t,x,' o ')
>> size(t)
% necesita del orden de la sexta parte de los puntos q RK4 (y RK24 se colgaba)
35000 (aprox) esperando un poquiito
>> delta=0.0001;
>>[t,x ]=BS23(f ,0 ,delta ,2/delta ,20, 0.001);
>> plot( t, x,' o ')
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
1.4
1.2
1
0.8
0.6
0.4
0.2
0
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
2
5
x 10
Idem
(casi inmediatamente)
En los casos razonables es más rápido!!!
Con programas del matlab:
>> ode23s(f,[0 2/delta],delta)
1.4
1.2
1
0.8
0.6
0.4
0.2
0
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
2
5
x 10
>> ode45(f,[0 2/delta],delta)
1.4
1.2
1
0.8
0.6
0.4
0.2
0
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
2
5
x 10
----------------------------------------------------------------------------------------------------.
Queremos plantear a continuación otro tipo de ecuación diferencial:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Ejemplo:
(tipo oscilador armónico)
 x' ' (t ) − 2 * cos(t ) * .x' (t ) + x(t ) = sin( 2 * t )

Hallar x : [0,2] → R tal que 
x ( 0) = 2

x ( 2) = 3

. Este es un Problema de CONTORNO.
Solución:
Tenemos datos en ambos bordes del intervalo [0,2], pero no podemos usar directamente ninguno de los métodos
que vimos, ya que si ponemos: haciendo la representación (el cambio de coordenadas):
 
x   x
X (2)


X =  1  =   el problema queda :  

X ' = 
x
sin(2 * t ) − X (1) + 2 * cos(t ) * X (2) 
 
 2   x' 

⇒
x2
  X (0) =  ?  no conocemos la velocidad inicial!!!!!
 x'  

X ' =   = 
?
 
 
 x' '   sin(2t ) − x1 + 2 cos(t ) x 2  
X (1)(t = 2) = 3
Cómo podemos encararlo?
Una idea natural es “probar”: Es decir, ensayo un valor supuesto para V(0) (la velocidad inicial) y fijarse cuan cerca
(o lejos) estamos de que X(2)=3
>> f=@(t,X) [X(2) ; sin(2*t)-X(1)+2*cos(t)*X(2) ]
>> V=0.5;
% como 1er conjetura, como la pendiente d la recta por (0,2) y (2,3) es 0.5 pruebo “apuntar” derecho
>> [t ,X ]=RK24(f,0,[2;0.5],2,0.01);
>> X(end)
Supuestamente no va a dar 3 justo.
ans =
-1.9871
Se propone ir probando otros valores de V, hasta obtener resultados que mejoren la “puntería”.
De hecho a ésta búsqueda se la llama ”SHOOTING”.
Podemos probar un poquito a mano y luego tratar de programar una forma más sistemática (por ejemplo probando
con distintos v entre -10 y 10 cada 0.1 (con un ciclo for) y luego refinando).
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
>>k=1;
>> for v=-10: 0.5 :10
[t ,X ]=RK24(f,0,[2;V],2,0.01);
Valfin(k)=X(1,end)
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
K=k+1;
end
>> plot(Valfin)
Y localizamos cuál es el k para el que Valfin está más cerca de 3 y guardamos ese V.
Una forma más sistemática consistiría en plantearlo como un problema de búsqueda de soluciones de una ecuación
(aunque en realidad lo anterior no se descarta, ya que había que tener una idea previa de por dónde hallar la
solución) y resolverlo con Newton-Raphson, o Bisección, u otro método.
Por ejemplo, programamos:
function xf=valorfinal(v)
f=@(t,X) [X(2) ; sin(2*t)-X(1)+2*cos(t)*X(2) ]
[t,X]=RK24(f,0,[2;V],2,0.01);
xf=X(end)
y a partir del v que teníamos de la búsqueda anterior (pongámosle v=1.2), resolvemos:
>>sol=NR_MULTI(@valorfinal,1.2,8)
1.2341
(pongámosle)
>>[t,X]=RK24(f,0,[2;sol],2,0.01);
>>X(1,end)
ans=
3.0000
>>plot(t,x) % la solución del Problema de Contorno
>> [t ,X ]=RK24(f,0,[2;sol],2,0.01);
>> X(1,end)
ans =
3.0000
>> plot(t,X(1,:))
3.5
3
2.5
2
0
0.2
0.4
0.6
0.8
1
1.2
1.4
1.6
1.8
2
********************************************************************************************************
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Planteamos otro problema de contorno:
Ejercicio:
 X 1 (t ) 


(
)
X
t


2
3 x1
:
[
0
,
3
]
→
,
(
)
=
X
R
X
t
Hallar
 X (t ) 
 3 





 t ⋅ X (t )




2


 X ′(t ) = X (t )



1



 X (t ) − X (t ) 

1 
 3


tal que 
X (0) = 1

2


X 2 (3) = 1.5


X 3 (3) = 0


Resolución:
 X (0) = a
 1

Creamos una función H que reciba como entrada valores a y b, de modo que asignando  X (0) = 1 resuelva el problema de
2

 X 3 (0) = b
valores iniciales con dichos datos, y que para la X solución del mismo devuelva como valor de H el vector columna:
  a   X (3) − 1.5 
 X (3) = 1.5
 a   0

2
2








de manera que si H   =   entonces 
‐y como también pedimos
H   = 

b   0
X 3 (3) = 0



  b   X 3 (3)


X 2 (0) = 1 entonces tendremos la solución del problema de contorno.
Para la solución usemos, por ejemplo RK4. Entonces programamos:
function
valH=H(v) %v=(a;b), o sea v(1)=a y v(2)=b
f=@(t,X)
[t*X(2) ; X(1); X(3)-X(1) ];
[t,X]=RK4(f,0,[v(1);1;v(2)],3,0.01);
valH=[X(2,end)-1.5;X(3,end)];
Y disparamos algunos valores de prueba.
>> H([0.2;0.4])
ans =
13.1237
‐21.4529
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> H([0.3;‐2])
ans =
14.6929
‐73.8748
>> H([‐0.9;0.001])
ans =
‐4.1367
16.9160
Este último parece un punto de partida adecuado para buscar una solución, es decir hallando donde H(0)=(0;0).
Usemos de nuevo NR_MULTI
>>sol=NR_MULTI(@H, [-0.9;0.001],10)
sol =
-0.6364
-0.2878
Verifiquemos:
>> H(sol)
ans =
1.0e-015 *
-0.2220
0.5516
Muy aceptable (casi [0;0])
Calculemos la solución y veamos que cumple lo pedido:
>> f=@(t,X) [t*X(2) ; X(1); X(3)‐X(1) ];
[t,X]=RK4(f,0,[sol(1);1;sol(2)],3,0.01);
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> X(:,1)
ans =
‐0.6364
1.0000
‐0.2878
>> X(:,end)
ans =
2.3915
1.5000
0.0000
Y se ve que cumple las condiciones de contorno:
X (0) = 1
2
X 2 (3) = 1.5
X 3 (3) = 0
Problema de Eventos
Llamamos así a aquellos problemas donde se busca la solución de una ecuación diferencial en un intervalo [to,T], donde to está
dado, y el T corresponde a un tiempo a determinar donde ocurre que la solución, en tiempo T, satisface alguna condición –
dependiendo de X(T) y las derivadas de X en T (allí “sucede”un cierto evento).
Podemos, por lo general, también plantear dicho problema como una búsqueda de ceros de una función –univariada o
multivariada‐.
A continuación vemos un ejemplo:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Consideremos el siguiente Problema de Eventos:
Cierto móvil de masa 1 responde a la siguiente ley de movimiento:
( y ' ) 2 + y. y ' ' = 1

y (0) = 1

 y ' (0) = 0

Halle T>0 tal que la energía cinética (
1
1
.masa. velocidad 2 = .1.( y ' ) 2 ) del mismo sea 1 (en unidades [m]. [v] 2 ).
4
2
2
O sea, las que sean unidades de masa por las que sean las de velocidad al cuadrado, o sea que resolviendo
numéricamente como si no hubiera unidades.
Resolución Numérica:
Planteamos:

1 − ( y' ) 2
 y' ' =
y

=
y
(
0
)
1

 y ' (0) = 0



y


 1 − ( y 2 ).^ 2 

=
Y
'
y


2
2



 y1   y 
 y'  
2 


y
con Y =   =   ⇒ Y ' =   =  1 − ( y 2 )  , o sea, 
1



 y' '  
 y2   y' 

1


y1


 Y (0) =  

0
Y armamos una función que para cada T calcule la energía cinética en T:
function ec=G(T)
f=@(t,Y) [Y(2) ; (1-Y(2).^2)/Y(1) ];
[t,Y]=ode45(f,[0 T],[1;0]);
ec=(Y(end,2)).^2*0.5
T=0.5210
Y en línea de comandos planteamos la solución de G(T) - 1 = 0
4
>> Gmenos1_4=@(T)
G(T)-0.25
>> T=NR_MULTI(Gmenos1_4,0.5,12);
>>
1.0000
En este caso, en realidad puede confirmarse que este valor es correcto, resolviendo la ecuación:
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
( y ' ) 2 + y. y ' ' = 1 equivale a : ( y. y ' )' = 1 ⇒ y. y ' = t + k ⇔ (
y2
y2 t2
q
)' = t − k ⇒
= − k .t + ⇒ y 2 = t 2 − 2k .t + q ⇔
2
2
2
2
⇔ y 2 = (t − k ) 2 + q − k 2 ⇔ y = (t − k ) 2 + q − k 2 sup y>0.
Con y(0)=1=q
Y’=
t−k
(t − k ) 2 + 1 − k 2
−k
⇒ k=0
1
Y’(0)=0=
y (t ) = t + 1 ⇒ y ' (t ) =
t
2
t2 +1
⇒ ( y ' (t ) )
2
1
1 t2
1
1
t2
t2
2
= 2
⇒ ( y ') =
= ⇒ 2
= ⇒ 2t 2 = t 2 + 1 ⇒ t 2 = 1 ⇒ t = 1
2
2
2 t +1 4
t +1 2
t +1
pues t>o.
-----------------------------------------------------------------------------------------------.
Ahora vamos a considerar brevemente otro tema acerca del Análisis de Frecuencias de una serie de datos.
La cuestión puede tratarse a partir del caso continuo – con ventajas e inconvenientes-, pero en esta ocasión
preferiremos verlo directamente para series de datos discretos, que podemos ver como secuencias de mediciones
temporales (series de tiempo) y lo que queremos es medir la contribución de las diferentes frecuencias a los valores
de la serie.
Dada una serie temporal: ( x 0 , x1 ,............, x N −1 ) (es decir x(n)= x n con n=0,1,……,N-1)
La idea es escribirla como: x(n) =
N −1
∑e
− 2πif
f =0
n
N
t
con X ( f ) = X f =
.X f
1 N −1 2πif N
.∑ e
.x(t )
N t =0
La igualdad anterior vale porque el producto escalar:
< x(n), e
− 2πil
N
con
si
n
N
>= ∑ X f < e
n
− 2πif
n
N
,e
− 2πil
n
N
n
n
− 2πif
− 2πil
1
N
N
e
.e
dn = δ ( f , l ) la Delta de Kronecker , ya que:
∫
2π 0
l= f
es
e
− 2πif
t
N
.e
− 2πil
t
N
N
=1
∫e
con
0
si
n
N
− 2πif
− 2πil
1
N
N
>= ∑ X f .
e
.
e
dn
2π ∫0
l≠ f
queda 0 por la periodicidad de e
2πi
k
N
.
− 2πif
n
N
.e
− 2πil
n
N
dn = 2π
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
Luego: < x(n), e
− 2πil
n
N
>= X f
N −1
Recapitulando:
x = ∑ X f .e
− 2πif
n
N
f =0
 − 2πif Nn 
es la descomposición de x en la b. o. n. e
donde F es el conjunto

 f ∈F

de frecuencias representables.
Para que valga la representación, debemos tener un conjunto de N frecuencias, que en realidad son simétricas
respecto del 0 (para una señal real), es decir f en [−
- y en realidad las distintas son de 0 a
N N
, ] (pero por periodicidad podemos asumir f en [0,N-1],
2 2
N
).
2
Esto es equivalente a no exceder la Frecuencia de Nyquist, - para estimar lo que ocurre con frecuencia de 1
segundo hace falta realizar muestreo al menos cada medio segundo-.
t
1 N −1 2πif
Recordemos X f = .∑ e N .xt
N t =0
Si
1 N −1
.∑ xt
N t =0
n=0
X0 =
n=1
1 N −1 2πi
X 1 = .∑ e N .xt
N t =0
(el promedio de xt )
constante en arg=0
t
Si
Etcétera.
Para cada f se gira e
2πif
t
N
y se mira la proyección (que es máxima cuando xt da los conjugados girando a la misma
velocidad y sentido opuesto).
Esto requeriría O ( N .N ) = O ( N 2 )
con distintas velocidades angulares.
Pero hay una forma más aguda de hacerlo:
Mirar la contribución de los promedios como frecuencia N (en lugar de 0).
( Si N es entero e
2πi
N
N
= e 2πi 0 = 1 )
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
N
N
, luego
,……., etc. Con ellas, y usando la periodicidad para cada intervalo
2
4
N N N
frecuencial, sólo hace falta ver las contribuciones de frecuencias
N,
,
, ,……………, 1 (y las demás se
2 4 8
Luego mirar la frecuencia
deducen de estas).
Esto requiere (si N = 2 k ) los datos para
N= 2 k ,
N
N
= 2 k −1 ,
= 2 k − 2 ,………….,
2
4
(N
N
2
→ Nyquist )
= 21
=
k datos
(por N)
y
log 2 N = k .
Luego con N .k = N . log 2 N datos reconstruimos la descomposición frecuencial.
Este esquema, que permite calcularla con un algoritmo O( N . log 2 N ) << O( N 2 ) se llama TRANSFORMADA
RAPIDA de FOURIER (FFT) por Fast Fourier Transform.
(Si N = 2 20 ≅ 10 6 ⇒ N 2 ≅ 1012 = 1000.000.000.000
y
N . log 2 N ≈ 20.000.000 )
Hay varias sutilezas y “rebusques” cuando N ≠ 2 k , en los que no entraremos.
Usaremos las funciones fft (y su inversa: ifft)
de MATLAB.
Una observación útil es que si la serie no es estacionaria (si tiene tendencias de mayor orden que 0 – lineales (o de
mayor orden aún)-) la representación en frecuencias converge lentamente – porque tienen componentes en cada
frecuencia- , y la representación discreta adolece por lo general de “aliasing” (superposición de frecuencias).
Por ello es útil extraer previamente (si corresponde) las tendencias lineales (eventualmente otras, pero las lineales
son, por mucho, las más usuales). Ello puede hacerse hallando el polinomio de cuadrados mínimos de orden 1, y
restándoselo a la señal.
Un par de ejemplos:
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
1ro) Una en que sea estacionaria: (verificación ver que polyfit(x,1) tiene 1er coeficiente 0 (la pendiente))
Podemos bajarla de la página, pero la construímos previamente con, por ejemplo:
>> t=0:255;
>> x=2*exp(2*pi*i*5*t/255)+2*exp(-2*pi*i*5*t/255)-3*exp(2*19*i*pi*t/255)-3*exp(-2*pi*19*i*t/255)+randn(size(t));
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> plot(t,x)
>> X=fft(x);
>> plot(abs (X))
Habrá solo dos frecuencias dominantes.
Podemos eliminar el ruido anulando las frecuencias menores.
>> M=max(abs(X));
>> XL=X;
>> for k=1:max(size(XL))
if abs(XL(k))<0.1*M
XL(k)=0;
end
end
>> plot(XL)
>> XL=abs(ifft(XL));
>> plot(XL)
% es el 10% del maximo
------------------------------------------------------------------------------------Ejercicio:
Hacer lo mismo con otra señal: x= lo mismo + 0.01*t.
Retirar primero la parte lineal (guárdese en xlin ) con polyfit .
Solución:
>> plot(x)
>> xlin=polyval(polyfit(x,1),t);
>>xestacionaria=x-xlin;
>>plot(xestacionaria)
>> X=fft(x);
>> plot(X)
>> M=max(abs(X));
>>XL=X;
>> for k=1:max(size(XL))
if abs(XL(k))<0.1*M
% es el 10% del maximo
XL(k)=0;
end
end
>> plot(XL)
>> plot(abs(XL))
>> plot(t,x,t,xL)
Métodos Numéricos
Romina Cardo & Álvaro Corvalán
METODOS NUMERICOS – GUÍA DE ESTUDIO
>> xestacionaria=abs(ifft(XL));
>> xlimpia=xestacionariaL+xlin
>> plot(xlimpia)
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
15
800
700
10
600
5
500
0
400
300
-5
200
-10
-15
100
0
50
100
150
200
250
0
300
0
50
100
150
200
250
300
15
10
5
0
-5
-10
-15
0
50
100
150
200
250
300
Comparamos la serie y su limpiada….. MUY ACEPTABLE
15
15
10
10
5
5
0
0
-5
-5
-10
-10
-15
0
50
100
150
200
250
300
-15
0
50
100
150
200
250
300
Descargar