Codigo en Matlab
Codigo en Matlab
Página 1 de 115
MATIAUDA MARIO EUGENIO
YACHECEN CARLOS GUSTAVO
EDITORIAL UNIVERSITARIA DE MISIONES
ISBN 978-950-579-190-3
Impreso en Argentina
©Editorial Universitaria
INDICE
UNIDAD 6 : APROXIMACIÓN
6.1 Polinomios de Chebyschev ................................................................................ 39
6.2 Aproximación mínimo-máximo (o de Chebyshev) .............................................. 39
6.3 Aproximación por valores propios ...................................................................... 39
6.4 Técnicas de aproximación.................................................................................. 39
6.4.1 Método de potencias.................................................................................... 39
6.4.2 Método de la potencia inversa ..................................................................... 40
Página 3 de 115
La solución numérica elemental con Octave
Página 4 de 115
La solución numérica elemental con Octave
Prólogo
Página 5 de 115
La solución numérica elemental con Octave
RESOLVER f(x) =0
ai bi
pi Con pi = punto medio
2
ab ab
Se toma el punto medio si f ( )0 ya hemos encontrado la raíz
2 2
ab ab ab
x . En caso contrario, si f ( ) f (b) 0 entonces hacemos a y
2 2 2
volvemos a subdividir el nuevo intervalo [a, b]. Si, por el contrario,
ab ab
f (a) f ( ) 0 entonces hacemos b y volvemos a empezar. Las
2 2
sucesivas subdivisiones del intervalo [a, b]. Van aproximando la raíz.
ba
Criterio de detención | pn pn1 | n 1
2n
Algoritmo bisect
h( x) x f ( x) o h( x) x f ( x) , R
Página 6 de 115
La solución numérica elemental con Octave
a, b .
Si también g '( x) a, b con una constante m1 , de modo que
existe en
Algoritmo fixed_point
Criterio de detención pn pN 1 0 o
pN pN 1
pN 0
pN
Algoritmo newton
g ( xn 1 )( xn 1 xn 2 )
xn xn 1
g ( xn 1 ) g ( xn 2 )
Algoritmo secant
Página 7 de 115
La solución numérica elemental con Octave
Genera aproximaciones del mismo modo que el método de la secante, pero incorpora
el acorralamiento de la raíz, asegurando que la misma quede entre dos iteraciones
sucesivas.
f (b) f (a)
y f (a ) ( x a) Como x1 es el valor de x para y=0, se tiene
ba
f (a) af (b) bf (a) x1 a x b
x1 a ( x a) si ó 1
f (b) f (a) f (b) f (a) x1 x1
Algoritmo regula
Genera la secuencia:
p0( 0) , p1( 0) g ( p0( 0) ), p2( 0) g ( p1( 0) ), p0(1) 2 ( p0( 0) ), p1(1) g ( p0(1) ),.......
(pn ) 2
donde indica que se usa la ecuación p pn 2 , para n 0.
2
pn
la cual genera cada tercer término; los demás usan la iteración del punto fijo en el
término anterior.
Para encontrar rápidamente una solución de la ecuación de punto fijo x = g(x) dada
una aproximación inicial P0; donde se supone que tanto g(x) y g'(x) son continuas,
|g’(x)|<1, y que la iteración de punto fijo ordinario converge lentamente (lineal) para p
Algoritmo steff
Página 8 de 115
La solución numérica elemental con Octave
Algoritmo horner
Algoritmo newtonhorner
Con
Página 9 de 115
La solución numérica elemental con Octave
c f ( x2 )
( x0 x2 )[ f ( x1 ) f ( x2 )] ( x1 x2 ) 2 [ f ( x0 ) f ( x2 )]
b
( x0 x2 )( x1 x2 )( x0 x1 )
( x1 x2 )[ f ( x0 ) f ( x2 )] ( x0 x2 )[ f ( x1 ) f ( x2 )]
a
( x0 x2 )( x1 x2 )( x0 x1 )
La gran ventaja de este método es que se pueden localizar tanto las raíces reales
como las imaginarias.
que pasa por los puntos ( xn3 , f ( xn3 ), ( xn2 , f ( xn2 ), ( xn1 , f ( xn1 ), y
calcular posteriormente las derivadas de dicha parábola.
Algoritmo muller
Algoritmo muller2
Página 10 de 115
La solución numérica elemental con Octave
INTERPOLACION
Con > 0,
f ( x) P( x) x a, b
El uso de los polinomios tiene consigo ventajas como su derivabilidad e integrabilidad,
dando también polinomio.
El planteo del problema será hallar un polinomio interpolante que brinde una
aproximación precisa en todo el intervalo, de allí la no adecuación de los polinomios
de Taylor que concentran la información alrededor de un punto, dígase x0 .
f ( xk ) P( xk ) k 0,1, 2,....n
n
P( x) f ( x0 ) Ln,0 ( x) ..... f ( xn ) Ln,n ( x) f ( xk )Ln,k ( x)
k 0
Con
Ln,k ( x)
x x0 x x1 ... x xk 1 x xk 1 ... x xn
xk x0 xk x1 ... xk xk 1 xk xk 1 ... xk xn
Ln,k ( x)
n
x xi k 0,1, 2,....n
i 0 xk xi
ik
Algoritmo lagrange
Página 11 de 115
La solución numérica elemental con Octave
f ( N 1) ( )
f ( x) PN ( x) ( x a) ( N 1)
( N 1)!
donde ξ es un valor intermedio entre x y a. En el caso general, donde
buscamos un polinomio P (x) tal que él y todas sus derivadas hasta un cierto
orden M coincidan con una función f (x) en los puntos { x i }i=0,..,N, se utilizan
los denominados polinomios base de Hermite Hi,j (x), que son polinomios de
grado menor o igual que
(N + 1)(M + 1) – 1 dados por las siguientes condiciones:
l H i, j
1 si l j y k i
( xk )
x l
0 si l j o k i
A partir de los polinomios base de Hermite, el polinomio interpolador de Hermite se
define como:
N M
j f
P( x) ( xi ) H i , j ( x)
i 0 j 0 x j
Algoritmo hermite
Página 12 de 115
La solución numérica elemental con Octave
x0 P0 N 0,0
x1 P1 N1,0 P0,1 N1,1
x2 P2 N 2,0 P1,2 N 2,1 P0,1,2 N 2,2
i más grande
x3 P3 N30 P2,3 N3,1 P1,2,3 N3,2 P0,1,2,3 N3,3
x4 P4 N 4,0 P3,4 N 4,1 P2,3,4 N 4,2 P1,2,3,4 N 4,3 P0,1,2,3,4 N4,4
Desplazarse hacia la derecha aumenta el grado del polinomio
( x xi j ) N i , j 1 ( x xi ) N i 1, j 1
Ni, j
xi xi j
Algoritmo neville1
Algoritmo neville2
Página 13 de 115
La solución numérica elemental con Octave
f1 f 0
f ( x0 , x1 )
x1 x0
f ( x1 ,..., xn ) f ( x0 ,..., xn1 )
Para orden n : f ( x0 , x1 ,..., xn )
xn x0
Página 14 de 115
La solución numérica elemental con Octave
Si se busca aproximar un valor de x que se ubica cerca del centro de la tabla, no son
adecuadas las expresiones de Newton.
Se emplean las fórmulas de diferencias centradas, según sea el caso, y dada la
amplitud de expresiones se mencionan la de Stirling.
P( x) P2 m 1 x f x0
sh
2
f x1 , x0 f x0 , x1 s 2h 2 f x1 , x1 , x0
s s 2 1 h3
2
f x 1 , x0 , x1 , x2 f x2 , x1 , x0 , x1 ...
s 2 s 2 1 s 2 4 ... s 2 m 1 h 2 m f x m ,....xm
2
s s 2 1 ... s 2 m 2 h 2 m1
2
f x m ,....xm 1 f x m1 ,....xm
para n=2m+1 impar, y si n=2m es par se elimina el último término de la misma
expresión.
Algoritmo divdiff1
Algoritmo newpoly
Página 15 de 115
La solución numérica elemental con Octave
n n
P2 n1 ( x) f ( x j ) Pn, j ( x) f '( x j ) Pn, j ( x)
j 0 j 0
h j 1c j 1 2 h j 1 h j c j h j c j 1 a j 1 a j a j a j 1
3 3
hj h j 1
Para j 0,1,..., n 1
h = al paso entre nodos para j 0,1,..., n 1 y an f xn
Siendo:
c j 1 c j 3d j h j
h2j
a j 1 a j 2c j c j 1
hj
2c c j 1 con b j
1
a j 1 a j b j h j j
3 hj 3
b j 1 b j h j c j c j 1
el conjunto c
n
j j 0
serán las incógnitas.
Al conocer los c j , se podrán hallar los coeficientes b j y d j , para poder generar los
A
n 1
polinomios cúbicos j j 0
.
Algoritmo linear_spline
Algoritmo spline_eval
Página 16 de 115
La solución numérica elemental con Octave
1 h4
f '( x0 ) 25 f ( x0 ) 48 f ( x0 h) 36 f ( x0 2h) 16 f ( x0 3h) 3 f ( x0 4h) f (5) ( )
12h 5
Con 0 entre x0 y x0 4h
P( x) a0 a1 ( x x0 ) a2 ( x x0 )( x x1 )
a3 ( x x0 )( x x1 )( x x2 ) ... aN ( x x0 )...( x xN 1 )
Algoritmo diffnew
Página 17 de 115
La solución numérica elemental con Octave
Algoritmo difflim
Rh1 h / 2 R j 1 h
R(h) R j 1
2 j 1 1
La técnica (extrapolante) es aplicable siempre y cuando el error de truncado para una
fórmula sea del tipo:
m 1
M h
j 1
j
j
O(h m )
Algoritmo diffext
x1
h
P( x)dx 2 f ( x ) f ( x )
x0
0 1
x2
h
P( x)dx 3 f ( x ) 4 f ( x ) f ( x )
x0
0 1 2
Página 18 de 115
La solución numérica elemental con Octave
x3
3h
x P ( x ) dx f ( x0 ) 3 f ( x1 ) 3 f ( x2 ) f ( x3 )
0
8
M 1
h
f ( x)dx ( f (a) f (b)) h f ( xk )
b
a 2 k 1
Algoritmo traprl
xn
h
f ( x)dx 3 f ( x ) 4 f ( x ) 2 f ( x ) 4 f ( x ) ... 2 f ( x
x0
0 1 2 3 n2 ) 4 f ( xn1 ) f ( xn )
h 2h M 1 4h M
2k 3
b
a
f ( x)dx
3
( f (a) f (b))
3 k 1
f ( x )
k 1
f ( x2 k 1 )
Algoritmo simprl
Página 19 de 115
La solución numérica elemental con Octave
1 k 2
Rk ,1 Rk 1,1 hk 1 f (a (2i 1)hk ) k 2,3,..., n
2 i 1
R1,1
R2,1 R2,2
R3,1 R3,2 R3,3
.
. O
Rn ,1 L L L Rn ,n
R( J , K 1) R( J 1, K 1)
R( J , K ) R( J , K 1)
4K 1
para 1 K J .
Algoritmo de romber
Página 20 de 115
La solución numérica elemental con Octave
Para aproximar:
J
h 2
f ( x)dx f ( xk 1 ) f ( xk )
b
a 2 k 1
Mediante el uso de la regla del trapecio y sucesivamente cada vez mayor el número
de subintervalos de [a, b]. En la iteración J-ésima para f (x) en los 2J+1 puntos
igualmente espaciados.
Algoritmo trapezoidal
Presentación general
b n
( x) f ( x)dx ai f ( xi )
a i 1
Los x1 ,..., xn representan los ceros del polinomio Pn ( x) , de grado n, de una familia que
verifica ortogonalidad:
( x) 1
a, b 1,1
Los polinomios ortogonales son polinomios de Legendre
1 dn 2
n
x 1
n
Pn ( x) n P0 ( x) 1
2 n ! dx
Página 21 de 115
La solución numérica elemental con Octave
2 1 xi2
xi raíces del polinomio y ai 2
n 2 Pn 1 ( xi )
Tanto los xi como los ai están tabulados para reemplazar en
b n
f ( x)dx ai f ( xi )
a i 1
Algoritmo gausslegendre
n
e
x
f ( x)dx ai f '( xi )
0 i 1
d n x n
Ln ( x) e
dx n
e x
x
Y
(n !) 2
ai
xi L '( xi )
2
n
1
f ( x)
dx f ( xi )
1 1 x 2
n i 1
4 f ( x4 k 1 ) f ( x4 k )
Página 22 de 115
La solución numérica elemental con Octave
Algoritmo adapt
Algoritmo srule
Algoritmo gauss_q
Página 23 de 115
La solución numérica elemental con Octave
2 6 24 3 12 2 6 24
i 0,1,..., N 1.
para i en (ti , ti 1 )
yi 1 yi ( n ) hn
i 1 (h) T (ti , yi ) f ( n ) i , y(si ) i 0,1, 2,..., N 1
h n 1!
con el error local de truncamiento = (h ) n derivada admitida .
n
1 hf (t , y )
h 1
2 hf t , y O(h 2 )
2 2
h 2
3 hf t , y O (h3 )
2 2
4 hf t h, y 3 O (h 4 )
1
y (t h) y (t ) 1 2 2 2 3 4 cuarto orden
6
Algoritmo rk4
i m 1, m,..., N 1
Página 25 de 115
La solución numérica elemental con Octave
A. De dos pasos
w0 w1 1
h
wi 1 wi 3 f (ti , wi ) f (ti 1 , wi 1 ) i 1,2,..., N 1
2
5 3
El error local de truncamiento es i 1 (h) y ( i ) h 2 con algún i entre
12
( ti 1 , ti 1 ).
B. de tres pasos
w0 w1 1 w2 2
h
wi 1 wi [23 f (ti , wi ) 16 f (ti 1 , wi 1 ) 5 f (ti 2 , wi 2 )]
12
i 2,3,..., N 1
3
El error local de truncamiento es i 1 (h) y ( 4) ( i )h3 con algún i entre
8
(ti 2 , ti 1 ) .
C. De cinco pasos
w0 , w1 1 , w2 2 , w3 3 , w4 4
h
wi 1 wi 1901 f (ti , wi ) 2774 f (ti1, wi1 ) 2616 f (ti2 , wi2 ) 1274 f (ti3 , wi3 ) 251 f (ti4 , wi4 )
720
i 4,5,..., N 1
El error local de truncamiento es i 1 (h)
95 ( 6)
y ( i ) h 5 con algún i entre
288
(ti 4 , ti 1 ) .
Para los implícitos se debe usar ti1 , f (ti1 , y(ti1 )) como un nodo de interpolación
ti 1
Página 26 de 115
La solución numérica elemental con Octave
A. De dos pasos
f n f n 1 f n ,
2 f n f n 2 2 f n 1 f n
C. De cuatro pasos
w0 w1 1 w2 2 w3 3
h
wi 1 wi 251 f (ti 1 , wi 1 ) 646 f (ti , wi ) 264 f (ti 1, wi 1 ) 106 f (ti 2 , wi 2 ) 19 f (ti 3 , wi 3 )
720
i 3, 4,..., N 1
Algoritmo abm
Página 27 de 115
La solución numérica elemental con Octave
Algoritmo milne
4.1.6 Predictor-Corrector
un*1 un hf n
h
un 1 un [ f n f (t n 1 , un*1 )]
2
El paso explícito constituye un factor de predicción, mientras que la implícita se llama
corrector. Este tipo de métodos disfrutan de la orden de precisión del método
corrector. Sin embargo, el ser explícito, se somete a una restricción de estabilidad que
suele ser el mismo que el del método predictor. Por lo tanto, no son adecuados para
integrar un problema de Cauchy en intervalos no acotados.
Algoritmo heun
Página 28 de 115
La solución numérica elemental con Octave
SISTEMAS LINEALES
Ax b
Planteo generalizado:
R1 a11 x1 a12 x2 ... a1n xn b1
R2 a21 x1 a22 x2 ... a2 n xn b2
Sustitución hacia atrás, solamente si todos los elementos de la diagonal son no ceros.
Primero calcula xN bN / aNN y entonces realiza:
bk j k 1 akj x j
N
xk para k N 1, N 2,...,1.
akk
Algoritmo backsub
Página 29 de 115
La solución numérica elemental con Octave
2 2 2 2
Algoritmo gjelim
5.3 PIVOTEO
ak1 ai , j
max
sk sj
j 1,2,..., n
Y se realiza R1 Rk
Algoritmo gauss con pivoteo
Página 30 de 115
La solución numérica elemental con Octave
A=IS
Con
1 0 0
m 1
21
I= 0 Matriz triangular inferior cij 0 para i j
mn1 mn ,n 1 1
a11(1) a12(1) a1(1)n
(2)
0 a22
S= ( n 1) Matriz triangular superior c 0 para i j
an 1,n ij
0 0 an( n,n)
La solución para ISx=B puede ser obtenida definiendo y=Sx, entonces se resuelven
los dos sistemas:
1°) Iy=B para y
2°) Sx=y para x
5.4.1 Factorización LU
Lk 1 0 p
L ; U U k 1
mt 1 0 ukk
Página 31 de 115
La solución numérica elemental con Octave
Donde m y p son vectores columna, ambos con k-1 componentes. Tenga en cuenta
que m, p y ukk son desconocidos.
Así, se establece que la matriz A se puede descomponer en LU trataremos de
determinarlos.
Realización del producto LU, se deduce que:
Lk 1U k 1 Lk 1 p
LU
mt S m p ukk
t
k 1
Lk 1U k 1 Lk 1 p Ak 1 r
mtU m p ukk s t
t
akk
k 1
Lk 1U k 1 Ak 1 ,
Lk 1 p r ,
m tU k 1 s t ,
m t p ukk akk .
Tenga en cuenta que la primera ecuación tiene por hipótesis la inducción, y por lo
tanto Lk 1 y U k 1 son determinadas de manera única. Además, ni Lk 1 ni U k 1
son singulares (o Ak 1 también seria singular, contradiciendo la hipótesis). Por lo
tanto:
Lk 1 p r p Lk11r ,
mtU k 1 s t mt s tU k11 ,
mt p ukk akk ukk akk mt p
Página 32 de 115
La solución numérica elemental con Octave
Algoritmo lufact
Matrices de permutación
Página 33 de 115
La solución numérica elemental con Octave
Matrices características
a) Choleski : para una definida positiva requiere menos operaciones que IDI t
pero implica hallar n raíces cuadradas; con I con aii 1 y D diagonal con
aii 0 . A puede factorizarse como IDI t .
b) Doolittle o de Crout : para matrices de banda que disponen sus elementos no
nulos en derredor de la diagonal. Las más comunes, p=q=2 y los de p=q=4,
pentadiagonales.
Las primeras, asociadas a aproximaciones de splines cúbicos o
aproximaciones lineales por parte en problemas de valores de contorno, los
pentadiagonales de utilidad para problemas de valores de frontera.
El trabajar con matrices de banda facilita los algoritmos de factorización (por el
número de operaciones).
a1 2u 2n 1 ... a1 N u N
n 1
b1
u n
1
a1 1
a2 1u1n 1 a2 3u3n 1 ... a2 N u N
n 1
b2
u n
2
a2 2
a N 1u1n 1 a N 2u 2n 1... a NN 1u N
n 1
1 bN
u n
N
a NN
Algoritmo jacobi
Página 35 de 115
La solución numérica elemental con Octave
Algoritmo gseid
cw = w (D + wL)−1 b
Página 36 de 115
La solución numérica elemental con Octave
aii j i aij i
a jj i j aij j
ó
Con la desigualdad estricta en al menos una fila o columna, entonces los métodos
iterativos convergen.
( k 1) rii( k )
xi
(k )
x i q
aii
Página 37 de 115
La solución numérica elemental con Octave
rk es el negativo del gradiente de f en x = xk, con lo que se puede mostrar, ya que las
direcciones pk son conjugadas entre sí, que una expresión para tales direcciones es:
pkT Ark
pk 1 rk T pk
pk Apk
Algoritmo conjgrad
Página 38 de 115
La solución numérica elemental con Octave
APROXIMACIÓN
P( x) mx c
y (b) y(a) y (a) y ( x2 ) (a x2 ) y (b) y(b)
m c
ba 2 2(b a)
El teorema de descenso Gerschgorin es útil para determinar los límites globales a los
valores propios de una matriz Anxn. El término "global", los límites que encierran todos
los valores propios.
n
Dada Anxn Ri z C / z aii aij Ri=es el círculo en el plano complejo con
j 1
j i
aii como centro.
n
Algoritmo Gerschgorin
Sea una matriz A que posee una base de autovectores tal que en módulo su
autovalor máximo λmax es único. Sea un vector u1 no ortogonal al subespacio
engendrado por los autovectores del autovalor λ max, entonces, si definimos la
secuencia
un
Limn ( sign((u , u n n 1
))) n
es un autovector de max
un
u n 1
un A
kun 1k
dominante 1 2 3 ... n 0 .
Algoritmo power1
Página 40 de 115
La solución numérica elemental con Octave
Algoritmo invpow
x (0)t Ax (0)
:q
(0)
x
x (0)t x (0)
Para elegir q se considera que si x es vector propio de A respecto al valor propio ,
x t Ax
se dará que Ax x , entonces x Ax x x y t
t t
xx
6.4.4 METODO CLASICO DE JACOBI
simétrica Anxn :
Algoritmo jacobi1
Página 41 de 115
La solución numérica elemental con Octave
Algoritmo house
6.4.7 Algoritmo QR
Supongamos que A es una matriz simétrica real, En la sección anterior vimos cómo el
método de Householder se utiliza para construir una matriz tridiagonal similar. El
método QR se utiliza para encontrar todos los valores propios de una matriz
tridiagonal. rotaciones similares a los que utiliza el método de Jacobi se utilizan para
construir una matriz ortogonal Q1 = Q y una triangular superior R = R1 de manera que
A1 = A tiene la factorización:
A(i 1) = R(i )Q(i ) = Q(i )t A(i ) Q(i ) Q(i )t A(i )Q(i )
Algoritmo qr1
Algoritmo qr2
Este método permite obtener de una matriz Anxn una matriz Q con columnas
ortonormales y R, una matriz triangular superior de tal forma que A = Q*R.
Algoritmo grams
Página 42 de 115
La solución numérica elemental con Octave
Forma general:
f1 ( x1 , x2 ,..., xn ) o
f 2 ( x1 , x2 ,..., xn ) o
f n ( x1 , x2 ,..., xn ) o
Algoritmo newtons
Método de Broyden
A1 J ( x )
(0)
z
x (1) x (0)
e
(1) ( 0 )
x x es el vector ortogonal
Algoritmo broyden
Página 43 de 115
La solución numérica elemental con Octave
y '' f ( x, y, y ') en a, b
Sujeta a: y(a) y(b)
y1 (b)
y ( x) y1 ( x) y2 ( x) (Solución única de la ecuación diferencial
y2 (b)
con valor en la frontera).
Página 44 de 115
La solución numérica elemental con Octave
h 2 '' h3 ''' h 4 ( 4)
y( xi 1 ) y( xi h) y( xi ) hy ( xi )
'
y ( xi ) y ( xi ) y (i )
2 6 24
h 2 '' h3 ''' h 4 ( 4)
y( xi 1 ) y( xi h) y( xi ) hy ( xi ) '
y ( xi ) y ( xi ) y (i )
2 6 24
Sumando estas dos ecuaciones y aplicando el teorema del valor intermedio, podemos
''
llegar a las fórmulas de diferencias centradas para y ( xi ) e y ' ( xi ) (aquí no
se detalla).
La utilización de las fórmulas de diferencias centradas de:
y '' ( xi ) p( xi ) y ' ( xi ) q( xi ) y( xi ) r ( xi ) genera la ecuación:
Página 45 de 115
La solución numérica elemental con Octave
y ( xi 1 ) 2 y ( xi ) y ( xi 1 ) y ( xi 1 ) y ( xi 1 )
p( xi ) ...
2
h 2h
q( xi ) y ( xi ) r ( xi )
h2
12
2 p( xi ) y ''' (i ) y ( 4) ( i )
Este método de deferencias finitas con (h 2 ) para el error de
Página 46 de 115
La solución numérica elemental con Octave
Af xx
2 Bf xy Cf yy Df x Ef y Ff G
2 f 2 f
( x, y ) 2 ( x, y ) g ( x, y ) Si g ( x, y) 0 se obtiene la ecuación de Laplace.
x 2 y
f ( x, y) r ( x, y) ( x, y) en S, frontera de la región U.
U ( x, y) / a xb, c y d
El método de resolución consiste en una adaptación del método de diferencias finitas
para problemas con valor de frontera tomando:
( a b) (d c)
h y k obteniendo una cuadrícula con los puntos de red, en
n m
cada punto de red utilizamos la serie de Taylor en la variable x alrededor de xi para
generar la fórmula de la diferencias centradas.
2 f f ( xi 1 , y j ) 2 f ( xi , y j ) f ( xi 1 , y j ) h2 4 f
( xi , yi ) ( i , y j )
x 2 h2 12 x 4
i ( xi 1 , xi 1 )
Lo mismo para la variable y alrededor de yi
2 f f ( xi , y j 1 ) 2 f ( xi , y j ) f ( xi 1 , y j 1 ) h2 4 f
( xi , yi ) ( xi , j )
y 2 k2 12 y 4
j ( y j 1 , y j 1 )
Página 47 de 115
La solución numérica elemental con Octave
f ( xi 1 , y j ) 2 f ( xi , y j ) f ( xi 1 , y j ) f ( xi , y j 1 ) 2 f ( xi , y j ) f ( xi 1, y j 1 )
h2 k2
h2 4 f h2 4 f
g ( xi , y j ) ( i , y j ) ( xi , j )
12 x 4 12 y 4
i 1, 2,...(n 1) j 1, 2,...( m 1)
Para condiciones de frontera:
f ( x0 , y j ) r ( x0 , y j ) j 0,1,..., m
f ( xn , y j ) r ( xn , y j ) j 0,1,..., m
f ( xi , y0 ) r ( xi , y0 ) i 1, 2,..., n 1
f ( xi , ym ) r ( xi , ym ) i 1, 2,..., n 1
Para un error de truncado del orden O(h2 k 2 ) , se tendrá:
con i , j aproximando a f ( xi , y j )
h 2 h
2
Página 48 de 115
La solución numérica elemental con Octave
Sea la EDP c
t 2 x 2
con las condiciones de frontera u(0, t) = 0 = u(1, t), 0 < t < 1
y con las condiciones iniciales u(x, 0) = sen(πx), 0 ≤ x ≤ 1 y ut(x, 0) = 0,
0≤x≤1
Página 49 de 115
La solución numérica elemental con Octave
Página 50 de 115
La solución numérica elemental con Octave
ANEXO
GNU OCTAVE
Página 51 de 115
La solución numérica elemental con Octave
Página 52 de 115
La solución numérica elemental con Octave
Interfaz qtOctave
La interfaz gráfica permite, entre otras cosas, trabajar con el interprete de órdenes de
Octave, ver el listado de variables, editar un archivo .m, y ver el histórico de órdenes.
Página 53 de 115
La solución numérica elemental con Octave
# Ejemplo de carga
# [c,yc,err,P]=bisect(0,2,0.001)
# función 'x*sin(x)-1'
f=input('ingrese f(x) entre comillas en términos de x');
f=inline(f,'x');
err=0;
P=[a b err];
ya=feval(f,a);
yb=feval(f,b);
if ya*yb>0,break,end
max1=1+round((log(b-a)-log(delta))/log(2));
for k=1:max1,
c=(a+b)/2;
yc=feval(f,c);
if yc==0,a=c;
b=c;
elseif yb*yc>0,
b=c;
yb=yc;
else
a=c;
ya=yc;
end
err=abs(b-a)/2;
P=[P;a b err];
if b-a<delta,break,end
end
c=(a+b)/2;
yc=feval(f,c);
err=abs(b-a)/2;
disp(c);
disp(yc);
disp(err);
disp(' X0 X1 ERROR');
disp(P);
end
Dada la función f(x)= xsenx-1, hallar una raíz en el intervalo [0,2] por el
método de la bisección y una tolerancia de 10-3. Igual para x3+4x2-10 en
-4
[1,2] y tolerancia de 10
octave:4> [c,yc,err,P]=bisect(0,2,0.001)
ingresef(x) entre comillas en términos de x 'x*sin(x)-1'
'x*sin(x)-1'
1.1138
-5.3832e-004
4.8828e-004
X0 X1 ERROR
0.00000 2.00000 0.00000
1.00000 2.00000 0.50000
1.00000 1.50000 0.25000
1.00000 1.25000 0.12500
1.00000 1.12500 0.06250
1.06250 1.12500 0.03125
1.09375 1.12500 0.01563
1.10938 1.12500 0.00781
1.10938 1.11719 0.00391
Página 54 de 115
La solución numérica elemental con Octave
1.11328 1.11719 0.00195
1.11328 1.11523 0.00098
1.11328 1.11426 0.00049
c = 1.1138
yc = -5.3832e-004
err = 4.8828e-004
P =
0.00000 2.00000 0.00000
1.00000 2.00000 0.50000
1.00000 1.50000 0.25000
1.00000 1.25000 0.12500
1.00000 1.12500 0.06250
1.06250 1.12500 0.03125
1.09375 1.12500 0.01563
1.10938 1.12500 0.00781
1.10938 1.11719 0.00391
1.11328 1.11719 0.00195
1.11328 1.11523 0.00098
1.11328 1.11426 0.00049
Página 55 de 115
La solución numérica elemental con Octave
disp('Condición |p(i+1)-p(i)| < tol no se satisfizo')
tol
disp('Por favor, examine la secuencia de iteraciones')
p = p'
disp('Si observa convergencia, incremente el número máximo de
iteraciones')
disp('Si hay divergencia, intente otro p0 o reescriba g(x)')
disp('si |g''(x)|< 1 cerca de la raíz')
end
Tomando su equivalente
y = sqrt(10./x - 4*x);
Página 56 de 115
La solución numérica elemental con Octave
octave:9> newton(1.5,0.0001,10)
ingresef(x) entre comillas en términos de x 'x^3+4*x^2-10'
'x^3+4*x^2-10'
ingrese la derivada de f(x) entre comillas, en términos de x '3*x^2+8*x'
'3*x^2+8*x'
Xi F(Xi) F(Xi) ErrorAbs ErrorRel
1.50000 0.00000 0.00000 0.00000 0.00000
1.37333 0.13435 18.75000 0.12667 0.09223
1.36526 0.00053 16.64480 0.00807 0.00591
1.36523 0.00000 16.51392 0.00003 0.00002
ErrorAbsoluto:
3.2001e-005
Error Relativo:
2.3440e-005
ans = 1.3652
Página 57 de 115
La solución numérica elemental con Octave
Para la función cosx-x , hallar una raíz con aprox. iniciales 0.5 y π/4,
tolerancia para p1=0.01, para f de 0 01 y 10 iteraciones, por el método de la
secante
octave:10> [p1,y1,err,P]=secant(0.5,pi/4,0.01,10)
ingresef(x) entre comillas en términos de x 'cos(x)-x'
'cos(x)-x'
P0 P2 Xi F(Xi) ErrAbs ErrorRelativo
0.50000 0.78540 0.00000 0.00000 0.00000 0.00000
0.78540 0.73638 0.73638 0.00452 0.04901 0.06656
0.73638 0.73906 0.73906 0.00005 0.00267 0.00362
ErrorAbsoluto:
0.0026740
ErrorRelativo:
0.0036181
p1 = 0.73906
y1 = 4.5177e-005
err = 0.0026740
P =
0.50000 0.78540 0.00000 0.00000 0.00000 0.00000
0.78540 0.73638 0.73638 0.00452 0.04901 0.06656
0.73638 0.73906 0.73906 0.00005 0.00267 0.00362
Página 58 de 115
La solución numérica elemental con Octave
Página 59 de 115
La solución numérica elemental con Octave
Página 60 de 115
La solución numérica elemental con Octave
Aplicar el método de Steffensen. Recordando el problema de f(x)=cos x –x con
newton.
octave:14> [p,Q]=steff(0.25*pi,0.01,0.01,4)
ingrese f(x) entre comillas en términos de x 'cos(x)-x'
'cos(x)-x'
ingrese la derivada de f(x) entre comillas, en términos de x '(x)-sin(x)-1'
'(x)-sin(x)-1'
p = 0.73819
Q =
0.78540 0.70046 0.76834
0.73819 0.00000 0.00000
Página 61 de 115
La solución numérica elemental con Octave
for k = 1:n
% iteraciones de
niter = 0; x = x0; diff = tol + 1;
while niter <= nmax & diff >= tol
[pz ,b] = horner(a,x); [dpz ,b] = horner(b,x);
xnew = x - pz/dpz; diff = abs(xnew -x);
niter = niter + 1; x = xnew;
end
if niter >= nmax
fprintf(' falla de convregencia con máximo ' ,...
'número de iteraciones\n');
end
% Deflación
[pz ,a] = horner(a,x); raiz(k) = x; iter(k) = niter;
end
return
Emplear el método de Muller para cosx–x con po=0.5 p1=π/3.5, p2= π/3.5
octave:17> [p2,y2,err,P]=muller(0.5,pi/3.5,pi/4,0.01,0.001,12)
ingresef(x): 'cos(x)-x '
'cos(x)-x '
p2 = 0.78540
y2 = -0.078291
err = [](0x0)
P =
0.50000 0.89760 0.78540 0.00000 0.00000
z=-2*c/(b+disc);
p=P(3)+z;
%clasifica las entradas de p para hallar las dos más cercanas a p
if abs(p-P(2))<abs(p-P(1))
Q=[P(2) P(1) P(3)];
P=Q;
Y=feval(f,P);
end
if abs(p-P(3))<abs(p-P(2))
R=[P(1) P(3) P(2)];
P=R;
Y=feval(f,P);
end
%Reemplaza las entradas de P más alejadas de p con p
P(3)=p;
Y(3) = feval(f,P(3));
y=Y(3);
[p2,y2,err,P]=muller2(0.5,pi/3.5,pi/4,0.01,0.001,12)
ingresef(x): 'cos(x)-x'
'cos(x)-x'
p2 = 0.73897
y2 = 1.9532e-004
err = 0.046430
Página 64 de 115
La solución numérica elemental con Octave
w=length(X);
n=w-1;
L=zeros(w,w);
for k=1:n+1
V=1;
for j=1:n+1
if k~=j
V=conv(V,poly(X(j)))/(X(k)-X(j));
end
end
L(k,:)=V;
end
%Determina los coeficientes del polinomio interpolatorio de Lagrange
C=Y*L;
Página 65 de 115
La solución numérica elemental con Octave
for n = 1:length(x)-1
H(n,:) = hermit(0,y(n),dy(n),x(n + 1)-x(n),y(n + 1),dy(n + 1));
end
function H = hermit(x0,y0,dy0,x1,y1,dy1)
% para obtener los coef. de Hermite para un conjunto de múltiples
subintervalos.
A = [x0^3 x0^2 x0 1; x1^3 x1^2 x1 1;
3*x0^2 2*x0 1 0; 3*x1^2 2*x1 1 0];
b = [y0 y1 dy0 dy1]'; %
H = (A\b)';
n = length(x);
Página 66 de 115
La solución numérica elemental con Octave
for k = n-1:-1:1
f(1:k) = f(2:k+1) + ...
( xdach - x(n-k+1:n) ) ./ ...
( x(n-k+1:n) - x(1:k) ) .* ...
( f(2:k+1) - f(1:k) );
end
p = f(1);
Dados los siguientes valores x-y, generar el valor de x=1.4 por Neville
x=[1.0 1.3 1.6 1.9 2.2];
y=[0.7651977 0.6200860 0.4554022 0.2818186 0.1103623];
%rpta = 251654
for i = n:-1:1
for j = 1:i
Q(j) = (xx-x(j))*Q(j+1) - (xx-x(j+n+1-i))*Q(j);
Q(j) = Q(j)/(x(j+n+1-i)-x(j));
end
end
y = Q(1);
Página 67 de 115
La solución numérica elemental con Octave
n = length ( xi );
m = length ( fi );
if ( n ~= m )
disp ( 'error divdiff : número de ordendas y número de valores de la
función deben ser iguales' )
return
end
nf = fi;
for j = 2:n
for i = n:-1:j
nf(i) = ( nf(i) - nf(i-1) ) / ( xi(i) - xi(i-j+1) );
end
end
Página 68 de 115
La solución numérica elemental con Octave
n=length(X);
D=zeros(n,n);
D(:,1)=Y';
for j=2:n
for k=j:n
D(k,j)=(D(k,j-1)-D(k-1,j-1))/(X(k)-X(k-j+1));
end
end
C=D(n,n);
for k=(n-1):-1:1
C=conv(C,poly(X(k)));
m=length(C);
C(m)=C(m)+D(k,k);
end
Página 69 de 115
La solución numérica elemental con Octave
% un conjunto dado de puntos de interpolación y los valores
% de la función
%
% forma de la llamada:
% ls = linear_spline ( xi, fi )
% linear_spline ( xi, fi )
%
% Entrada:
% xi vector que contiene los puntos de interpolación
% (orden ascendente)
% fi vector que contiene los valores de la función
%
%
% Salida:
% ls matriz de tres columnas
% - primer columna: puntos de interpolación
% - segunda columna: valores de la función
% - tercer columna: piezas lineales
%
% Nota:
% para evaluar el interpolante lineal a trozos aplicar el
% algoritmo SPLINE_EVAL para la salida de esta rutina
%
n = length ( xi );
m = length ( fi );
if ( n ~= m )
disp ('Número de ordenadas y valores de la función, debe ser igual')
return
end
b = zeros (n,1);
b(1:n-1) = ( fi(2:n) - fi(1:n-1) ) ./ ( xi(2:n) - xi(1:n-1) );
if ( nargout == 0 )
disp ( [ xi' fi' b ] )
else
ls = [ xi' fi' b ];
end
Página 70 de 115
La solución numérica elemental con Octave
% conjunto de valores de la variable independiente
%
% secuencia de llamado:
% y = spline_eval ( sp, x )
% spline_eval ( sp, x )
%
% ingresos:
% sp matriz conteniendo la información que define la
% función spline
% - típicamente será la la salida de
% LINEAR_SPLINE, CUBIC_NAK o CUBIC_CLAMPED
% x valor(es) de la variable independiente donde se
% evalúa la función spline
% - escalar o vector
%
% salida:
% y valor(es) de la función spline
%
% NOTA:
% rutina que acompaña a las CUBIC_NAK,
% CUBIC_CLAMPED y LINEAR SPLINE
%
[p c] = size ( sp );
npts = length ( x );
for i = 1 : npts
piece = max ( find ( sp(1:p-1) < x(i) ) );
if ( length ( piece ) == 0 )
piece = 1;
end
x0=X(1);
df=A(2);
prod=1;
n1=length(A)-1;
for k=2:n1
prod=prod*(x0-X(k));
df=df+prod*A(k+1);
end
for n=1:2
h=h/10;
H(n+1)=h;
D(n+1)=(feval(f,x+h)-feval(f,x-h))/(2*h);
E(n+1)=abs(D(n+1)-D(n));
R(n+1)=2*E(n+1)*(abs(D(n+1))+abs(D(n))+eps);
end
n=2;
while((E(n)>E(n+1))&(R(n)>toler))&n<max1
h=h/10;
H(n+2)=h;
D(n+2)=(feval(f,x+h)-feval(f,x-h))/(2*h);
E(n+2)=abs(D(n+2)-D(n+1));
Página 72 de 115
La solución numérica elemental con Octave
R(n+2)=2*E(n+2)*(abs(D(n+2))+abs(D(n+1))+eps);
n=n+1;
end
n=length(D)-1;
L=[H' D' E'];
%Ingreso - f es la función
% - x es el punto de diferenciación
% - delta es la tolerancia para el error
% - toler es la tolerancia para el error relativo
%Salida - D es la matriz de derivadas aproximadas
% - err es la cota de error
% - relerr es la cota de error relativo
% - n es la coordenada de la "mejor aproximación"
% Si f es archivo M usar el llamado
%[D,err,relerr,n]=diffext(@f,x,delta,toler).
% Si f es una función anónima llamar como
%[D,err,relerr,n]=diffext(f,x,delta,toler).
%
err=1;
relerr=1;
h=1;
j=1;
D(1,1)=(f(x+h)-f(x-h))/(2*h);
while relerr > toler & err > delta & j <12
h=h/2;
D(j+1,1)=(f(x+h)-f(x-h))/(2*h);
for k=1:j
D(j+1,k+1)=D(j+1,k)+(D(j+1,k)-D(j,k))/((4^k)-1);
end
err=abs(D(j+1,j+1)-D(j,j));
relerr=2*err/(abs(D(j+1,j+1))+abs(D(j,j))+eps);
j=j+1;
end
Página 73 de 115
La solución numérica elemental con Octave
[n,n]=size(D);
for k=1:(M-1)
x=a+h*k;
s=s+feval(f,x);
end
s=h*(feval(f,a)+feval(f,b))/2+h*s;
Página 74 de 115
La solución numérica elemental con Octave
h=(b-a)/(2*M);
s1=0;
s2=0;
for k=1:M
x=a+h*(2*k-1);
s1=s1+feval(f,x);
end
for k=1:(M-1)
x=a+h*2*k;
s2=s2+feval(f,x);
end
s=h*(feval(f,a)+feval(f,b)+4*s1+2*s2)/3;
while((err>tol)&(J<n))|(J<4)
J=J+1;
h=h/2;
s=0;
for p=1:M
x=a+h*(2*p-1);
s=s+feval(f,x);
end
R(J+1,1)=R(J,1)/2+h*s;
M=2*M;
for K=1:J
R(J+1,K+1)=R(J+1,K)+(R(J+1,K)-R(J,K))/(4^K-1);
Página 75 de 115
La solución numérica elemental con Octave
end
err=abs(R(J,J)-R(J+1,K+1));
end
Página 76 de 115
La solución numérica elemental con Octave
% Cuadratura de Gauss-Legendre.
% USAR I = gaussQuad(func,a,b,n)
% Ingreso:
% func = handle de la function a integrar.
% a,b = límites de integración.
% n = orden de integración.
% Salida:
% I = integral
c1 = (b + a)/2; c2 = (b - a)/2; % constants de mapeo
[x,A] = gaussNodos(n); % pesos y abcisas nodales
sum = 0;
for i = 1:length(x)
y = feval(func,c1 + c2*x(i)); % Función en nodo i
sum = sum + A(i)*y;
end
I = c2*sum;
Página 77 de 115
La solución numérica elemental con Octave
while(state==iterating)
n=m;
for j=n:-1:1
p=j;
SR0vec=SRmat(p,:);
err=SR0vec(5);
tol=SR0vec(6);
if (tol<=err)
%prueba de exactitud
if (err<tol)
SRmat(p,:)=SR0vec;
SRmat(p,4)=SR1vec(3)+SR2vec(3);
SRmat(p,5)=err;
else
SRmat(p+1:m+1,:)=SRmat(p:m,:);
m=m+1;
SRmat(p,:)=SR1vec;
SRmat(p+1,:)=SR2vec;
state=iterating;
end
end
end
end
quad=sum(SRmat(:,4));
err=sum(abs(SRmat(:,5)));
SRmat=SRmat(1:m,1:6);
Página 78 de 115
La solución numérica elemental con Octave
function pn=legen_pw(n)
pbb=[1]; if n==0, pn=pbb; break; end
pb=[1 0]; if n==1, pn=pb; break; end
for i=2:n;
pn=((2*i-1)*[pb,0]-(i-1)*[0, 0, pbb])/i;
pbb=pb; pb=pn;
end
Página 79 de 115
La solución numérica elemental con Octave
function py = poly_itg(p)
% poly_itg(p) integra un polinomio p que es una
% serie de potencias. El resultado también es una serie de potencias.
n=length(p);
py = [p.*[n:-1:1].^(-1),0];
I =
0.5000
Página 80 de 115
La solución numérica elemental con Octave
Y(1)=ya;
for j=1:M
k1=h*feval(f,T(j),Y(j));
k2=h*feval(f,T(j)+h/2,Y(j)+k1/2);
k3=h*feval(f,T(j)+h/2,Y(j)+k2/2);
k4=h*feval(f,T(j)+h,Y(j)+k3);
Y(j+1)=Y(j)+(k1+2*k2+2*k3+k4)/6;
end
R=[T' Y'];
Página 81 de 115
La solución numérica elemental con Octave
if n<5, return, end;
F=zeros(1,4);
F=feval(f,T(1:4),Y(1:4));
h=T(2)-T(1);
for k=4:n-1
%Predictor
p=Y(k)+(h/24)*(F*[-9 37 -59 55]');
T(k+1)=T(1)+h*k;
F=[F(2) F(3) F(4) feval(f,T(k+1),p)];
%Corrector
Y(k+1)=Y(k)+(h/24)*(F*[1 -5 19 9]');
F(4)=feval(f,T(k+1),Y(k+1));
end
A=[T' Y'];
F=zeros(1,4);
F=feval(f,T(1:4),Y(1:4));
h=T(2)-T(1);
pold=0;
yold=0;
for k=4:n-1
%Predictor
pnew=Y(k-3)+(4*h/3)*(F(2:4)*[2 -1 2]');
%Modifier
pmod=pnew+28*(yold-pold)/29;
T(k+1)=T(1)+h*k;
F=[F(2) F(3) F(4) feval(f,T(k+1),pmod)];
%Corrector
Y(k+1)=Y(k-1)+(h/3)*(F(2:4)*[1 4 1]');
pold=pnew;
yold=Y(k+1);
F(4)=feval(f,T(k+1),Y(k+1));
end
octave:15> milne(T,Y)
ingrese f entre comillas en términos de t,y '0.5*(t-y) '
'0.5*(t-y) '
ans =
0.00000 1.00000
0.25000 0.89750
0.50000 0.83640
0.75000 0.81190
1.00000 0.81958
1.25000 0.85582
1.50000 0.91709
1.75000 1.00062
2.00000 1.10362
2.25000 1.22399
2.50000 1.35950
2.75000 1.50855
3.00000 1.66937
Página 83 de 115
La solución numérica elemental con Octave
# --------
# Llamada
# X = backsub(A,B)
# Parametros
# A Matriz de coeficientes triangular
# superior obtenida de gauss(A)
# B Vector lado derecho de la ecuacion
# Devuelve
# X Vector de Solucion
#Ejemplo carga X = backsub([4 -1 2 3;0 -2 7 -4;0 0 6 5;0 0 0 3],[20;-
7;4;6])
n = length(B);
det1 = A(n,n);
X = zeros(n,1);
X(n) = B(n)/A(n,n);
Página 84 de 115
La solución numérica elemental con Octave
for r = n-1:-1:1,
det1 = det1*A(r,r);
if det1 == 0, break, end
X(r) = (B(r) - A(r,r+1:n)*X(r+1:n))/A(r,r);
end
end
if Aug(p,p)==0
'A es singular. No hay solución única'
break
end
%etapa de eliminación para columna p
for k=p+1:N
m=Aug(k,p)/Aug(p,p);
Aug(k,p:N+1)=Aug(k,p:N+1)-m*Aug(p,p:N+1);
end
end
%sustituación hacia atrás en [U|Y]
X=backsub(Aug(1:N,1:N),Aug(1:N,N+1));
Página 85 de 115
La solución numérica elemental con Octave
Resolver un sistema triangular (cuadrada), dada la matriz de coefcientes A y
el vector independiente B , empleando triangularización superior más
sustitución hacia atrás
octave:22> A=[1 2 2 4;2 0 4 3;4 2 2 1;-3 1 3 2]; % no singular
octave:23> B=[13 28 20 6]';
octave:24> uptrbk(A,B)
ans =
3.00000
-1.33333
5.00000
0.66667
%Gjelim
%eliminación de Gauss-Jordan.
%Opciones: formato en numero racional
% conteo de operaciones
% todas las etapas
%forma de llamado: Gjelim(A)
%hold off
%
tol=1e-20;
[n,m]=size(P);
format compact
disp(' ')
h=input('Números racionales? y/n: ','s');
q=input('Conteo de operaciones? y/n: ','s');
g=input('todas las etapas? y/n: ','s');
disp(' ')
disp('matriz inicial')
if h=='y'
disp(rats(P))
else
disp(P)
end
if g=='y';
disp('[presione Enter en cada paso para seguir]')
disp(' ')
pause
end
Página 86 de 115
La solución numérica elemental con Octave
%busca un pivot
j=1;
for i=1:n,
if j <= m
found=0;
if abs(P(i, j)) <= tol %fin está en línea 101
while (found == 0) %
%busca de unos e intercambio de filas si hace falta
for s=i:n,
if (abs(P(s, j)) > tol)
if (found == 0)
found=1;
if s~=i
for r=j:m,
temp=P(i, r);
P(i, r)=P(s, r);
P(s, r) = temp;
end
swaps = m-j+1;
totswaps = totswaps + swaps;
if g=='y'; %todas las etapas
disp('intercambio filas')
if h=='y'
disp(rats(P))
else
disp(P)
end
if q=='y'
disp('intercambio de elmentos:')
disp(swaps)
end
disp('--------------------')
pause
end %todas las etapas
end
end
end
end
if (found==0)
if (j <= m)
j = j + 1;
end
end
if j>m
found=1;
end
end %
if j > m
found = 0;
end
else
found = 1;
end %parte línea 51
j = j + 1;
end
end %fin loop i
Página 88 de 115
La solución numérica elemental con Octave
if h=='y'
disp(rats(P))
else
disp(P)
end
if q=='y'
disp('Total de sumas, multiplicaciones, intercambio elementos:')
ops=[totadds totmults totswaps];
disp(ops)
disp('--------------------')
end
disp(' ')
format loose
function v = swapRows(v,i,j)
% Swap rows i and j of vector or matrix v.
% USAGE: v = swapRows(v,i,j)
temp = v(i,:);
v(i,:) = v(j,:);
v(j,:) = temp;
Página 89 de 115
La solución numérica elemental con Octave
%Ingreso - A es matriz N x N
% - B matriz N x 1
%salida - X matriz N x 1 conteniendo solución de AX = B.
[N,N]=size(A);
X=zeros(N,1);
Y=zeros(N,1);
C=zeros(1,N);
R=1:N;
for p=1:N-1
%Intercambia fila p y j
C=A(p,:);
A(p,:)=A(j+p-1,:);
A(j+p-1,:)=C;
d=R(p);
R(p)=R(j+p-1);
R(j+p-1)=d;
if A(p,p)==0
'A es singular. Sin solución única'
break
end
%resuelve para Y
Y(1) = B(R(1));
for k=2:N
Y(k)= B(R(k))-A(k,1:k-1)*Y(1:k-1);
end
%resuelve para X
X(N)=Y(N)/A(N,N);
for k=N-1:-1:1
X(k)=(Y(k)-A(k,k+1:N)*X(k+1:N))/A(k,k);
end
Página 92 de 115
La solución numérica elemental con Octave
end
dP = abs(Pold-P);
err = norm(dP);
relerr = err/(norm(P)+eps);
Pold = P;
Z = [Z;P'];
if (err<delta)|(relerr<delta), break, end
end
end
if nargin<3
tol=1e-10;
end
r = b + A*b;
y = -r;
z = A*y;
s = y'*z;
t = (r'*y)/s;
x = -b + t*y;
for k = 1:numel(b);
r = r - t*z;
if( norm(r) < tol )
return;
end
B = (r'*z)/s;
y = -r + B*y;
z = A*y;
s = y'*z;
Página 93 de 115
La solución numérica elemental con Octave
t = (r'*y)/s;
x = x + t*y;
end
end
%El método del gradiente conjugado ayuda a resolve el sistema Ax=b, con A
simétrica, sin calcula inversa de A. Sólo requiere poca memoria, siendo
adecuado para sistemas de gran escala.
%es más rápido que otros como eliminación Gaussiana, si A está bien
condicionada. Por ejemplo,
%n=1000;
%[U,S,V]=svd(randn(n));
%s=diag(S);
%A=U*diag(s+max(s))*U'; % A es simétrica, bien condicionada
%b=randn(1000,1);
%tic,x=conjgrad(A,b);toc
%tic,x1=A\b;toc
%norm(x-x1)
%norm(x-A*b)
%El GC es de dos a tres veces más rápido que A\b, que emplea eliminación
Gaussiana
%Inicializar parámetros
lambda=0;
cnt=0;
err=1;
state=1;
while ((cnt<=max1)&(state==1))
Y=A*X;
%Normaliza Y
[m j]=max(abs(Y));
c1=m;
dc=abs(lambda-c1);
Y=(1/c1)*Y;
V=X;
[n n]=size(A);
A=A-alpha*eye(n);
lambda=0;
cnt=0;
err=1;
state=1;
while ((cnt<=max1)&(state==1))
%Normaliza Y
[m j]=max(abs(Y));
c1=m;
dc=abs(lambda-c1);
Y=(1/c1)*Y;
Página 96 de 115
La solución numérica elemental con Octave
lambda=alpha+1/c1;
V=X;
[m1 p]=max(abs(D-diag(diag(D))));
[m2 q]=max(m1);
p=p(q);
while (state==1)
%elim. cero Dpq y Dqp
t=D(p,q)/(D(q,q)-D(p,p));
c=1/sqrt(t^2+1);
s=c*t;
R=[c s;-s c];
D([p q],:)=R'*D([p q],:);
D(:,[p q])=D(:,[p q])*R;
V(:,[p q])=V(:,[p q])*R;
[m1 p]=max(abs(D-diag(diag(D))));
[m2 q]=max(m1);
p=p(q);
Página 97 de 115
La solución numérica elemental con Octave
if (abs(D(p,q))<epsilon*sqrt(sum(diag(D).^2)/n))
state=0;
end
end
D=diag(diag(D));
[n,n]=size(A);
for k=1:n-2
s=norm(A(k+1:n,k));
if (A(k+1,k)<0)
s=-s;
end
r=sqrt(2*s*(A(k+1,k)+s));
W(1:k)=zeros(1,k);
W(k+1)=(A(k+1,k)+s)/r;
W(k+2:n)=A(k+2:n,k)'/r;
V(1:k)=zeros(1,k);
V(k+1:n)=A(k+1:n,k+1:n)*W(k+1:n)';
c=W(k+1:n)*V(k+1:n)';
Q(1:k)=zeros(1,k);
Q(k+1:n)=V(k+1:n)-c*W(k+1:n);
A(k+2:n,k)=zeros(n-k-1,1);
A(k,k+2:n)=zeros(1,n-k-1);
A(k+1,k)=-s;
A(k,k+1)=-s;
A(k+1:n,k+1:n)=A(k+1:n,k+1:n) ...
-2*W(k+1:n)'*Q(k+1:n)-2*Q(k+1:n)'*W(k+1:n);
end
T=A;
Página 98 de 115
La solución numérica elemental con Octave
%Inicializar parámetros
[n,n]=size(A);
m=n;
while (m>1)
S=A(m-1:m,m-1:m);
if abs(S(2,1))<epsilon
A(m,m-1)=0;
A(m-1,m)=0;
else
shift=eig(S);
[j,k]=min([abs(A(m,m)-shift(1)) abs(A(m,m)-shift(2))]);
end
[Q,U]=qr(A-shift(k)*eye(n));
A=U*Q+shift(k)*eye(n);
m=m-1;
end
D=diag(A);
Página 99 de 115
La solución numérica elemental con Octave
%Inicializar parametros
[n,n]=size(A);
m=n;
D=zeros(n,1);
B=A;
while (m>1)
while (abs(B(m,m-1))>=epsilon)
%Calcula shift
S=eig(B(m-1:m,m-1:m));
[j,k]=min([abs(B(m,m)*[1 1]'-S)]);
%factorización QR de B
[Q,U]=qr(B-S(k)*eye(m));
%Calcula siguiente B
B=U*Q+S(k)*eye(m);
end
if nargin < 5
tol = 1e-8;
end
if nargin < 4
maxits = 50;
end
if nargin < 3
x0 = [1 1]';
end
if nargin < 2
help broyden
error('dos entradas como mínimo')
end
syms x1 x2
B = [diff(fcn1,x1) diff(fcn1,x2);diff(fcn2,x1) diff(fcn2,x2)];
x1 = x0(1);
x2 = x0(2);
h = inline(fcn1,'x1','x2');
g = inline(fcn2,'x1','x2');
f(1:2,1) = [h(x1,x2);g(x1,x2)];
B = eval(B);
x = [x1 x2]';
for k=1:maxits
s = B\(-f);
x = x + s;
fnew = [h(x(1),x(2));g(x(1),x(2))];
y = fnew-f;
if abs(fnew-f) < tol
break
end
f = fnew;
B = B + ((y-B*s)*s')/(s'*s);
end
% - - - - - - - - - - - - - - - - - - - - - - - - -
%
% este programa implementa el meétodo de disparo lineal
%
% para resolver el PVF
%
% x'' = p(t)x'(t) + q(t)x(t) + r(t)
%
% sobre [a,b] con x(a) = alpha y x(b) = beta
%
Página 103 de 115
La solución numérica elemental con Octave
% Usa el cambio de variable y = x' y las
%
% funciones p(t)x'(t) + q(t)x(t) + r(t)
%
% p(t)x'(t) + q(t)x(t)
%
% para formar fn1.m y fm2.m
% - - - - - - - - - - - - - - - - - - - - - - - - -
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%
% Aplica el método de Runge-Kutta para un orden má alto para resolver:
%
% u'' = p(t)u'(t) + q(t)u(t) + r(t)
% con u(a) = alpha y u'(a) = 0
%
% v'' = p(t)v'(t) + q(t)v(t)
% con v(a) = 0 y v'(a) = 1
%
% Define y almacena la función fn1(t,Z)y fn2(t,Z)
% en los archivos m fn1.m y fn2.m
% function W = fn1(t,Z)
% x = Z(1); y = Z(2);
% W = [y, (2*t*y/(1 + t^2) - 2*x/(1 + t^2) + 1)];
% function W = fn2(t,Z)
% x = Z(1); y = Z(2);
% W = [y, (2*t*y/(1 + t^2) - 2*x/(1 + t^2))];
%.......................................................................
% inicia una sección que entra la/s funcion(es) necesarias para el ejemplo
% en archivos m(s) ejecutando el comando diary command en este script.
% el método de programación preferido no usa estas etapas.
% uno debe entrar la función8es) en los M con un editor.
delete output;
delete fn1.m;
diary fn1.m; disp('funcion W = fn1(t,Z)');...
disp('x = Z(1); y = Z(2);');...
disp('W = [y, (2*t*y/(1 + t^2) - 2*x/(1 + t^2) + 1)];');...
diary off;
delete fn2.m;
diary fn2.m; disp('funcion W = fn2(t,Z)');...
disp('x = Z(1); y = Z(2);');...
disp('W = [y, (2*t*y/(1 + t^2) - 2*x/(1 + t^2))];');...
diary off;
fn1(0,[0,0]);
fn2(0,[0,0]);
% . fn1.m fn2.m rks4.m se usan
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%
% Usa el método disparo lineal para resolver
% el PVF x'' = 2t/(1+t^2) x' - 2/(1+t^2) + 1
% con x(0) = 1.25 y x(4) = -0.95.
%
% Entrar los extremos de [a,b].
% Entrar valor inicial x(a) en alpha.
% Entrar valor terminal x(b) en beta.
% Entrar número de subintervalos en m.
a = 0;
b = 4;
alpha = 1.25;
beta = -0.95;
Za = [alpha 0];
[T,Z] = rks4('fn1',a,b,Za,m);
U = Z(:,1)';
%~~~~~~~~~~~~~~~~~~~~~~~h
% inicio sección gráfica
%~~~~~~~~~~~~~~~~~~~~~~~
a = 0;
b = 4;
c = -1.25;
d = 1.75;
plot([a b],[0 0],'b',[0 0],[c d],'b');
axis([a b c d]);
axis(axis);
hold on;
plot(T,X,'-g');
if m<=30,
plot(T,X,'or');
end;
xlabel('t');
ylabel('x');
Mx1 = 'La solución del disparo lineal a x`` = f(t,x,x`).';
title(Mx1);
grid;
hold off;
figure(gcf);
clc;
%............................................
% inicio sección impresión resultados.
%............................................
Mx2 = ' t(k) x(k)';
clc,...
disp(''),disp(Mx1),disp(''),disp(Mx2),disp(points')
function [T,Z]=rks4(F,a,b,Za, M)
h=(b-a)/M;
T=zeros(1,M+1);
Z=zeros(M+1,length(Za));
T=a:h:b;
Z(1,:)=Za;
for j=1:M
k1=h*feval(F,T(j),Z(j,:));
k2=h*feval(F,T(j)+h/2,Z(j,:)+k1/2);
k3=h*feval(F,T(j)+h/2,Z(j,:)+k2/2);
k4=h*feval(F,T(j)+h,Z(j,:)+k3);
Z(j+1,:)=Z(j,:)+(k1+2*k2+2*k3+k4)/6;
end
octave:4> disparo_lineal
function W = fn1(t,Z)
x = Z(1); y = Z(2);
W = [y, (2*t*y/(1 + t^2) - 2*x/(1 + t^2) + 1)];
function W = fn2(t,Z)
x = Z(1); y = Z(2);
W = [y, (2*t*y/(1 + t^2) - 2*x/(1 + t^2))];
La solución del disparo lineal a x`` = f(t,x,x`).
t(k) x(k)
0.00000 1.25000
0.20000 1.31731
0.40000 1.32643
0.60000 1.28165
0.80000 1.18928
1.00000 1.05673
1.20000 0.89191
1.40000 0.70276
1.60000 0.49699
1.80000 0.28198
2.00000 0.06473
2.20000 -0.14818
2.40000 -0.35052
2.60000 -0.53644
2.80000 -0.70043
3.00000 -0.83726
3.20000 -0.94201
3.40000 -1.01000
3.60000 -1.03678
3.80000 -1.01812
4.00000 -0.95000
%
% Aproxima la solución del problema nolineal del valor de frontera
%
% Y'' = F(X,Y,Y'), A<=X<=B, Y(A) = ALPHA, Y(B) = BETA:
%
%
% ENTRADA: Intervalo A,B; condiciones de contorno ALPHA, BETA; número de
% subintervalos N; tolerancia TOL; máximo número de iteraciones M.
% SALIDA: Approximaciones W(1,I) a Y(X(I)); W(2,I) TO Y'(X(I))
% por cada I=0,1,...,N o un mensaje de que el número de iteraciones
% ha sido excedido.
% EJEMPLO
% Resolver por diferencias finitas la
% EDO con valor de frontera
% y ''= (32+2*x^3-y*y')/8, 1<=x<=3,
% y(1) = 17 , y(3) = 43 / 3 .
% Usando h = 0.5; 0.2; 0.05; 0.025.
% Solución: (La solución exacta es y(x) = x2 +16 / x ).
TRUE = 1;
FALSE = 0;
fprintf(1,'este es el método de disparo no lineal.\n');
fprintf(1,'Ingrese la funcion F(X,Y,Z) en términos de x, y, z.\n');
fprintf(1,'seguida de la deriv. parcial de F respecto a y en \n');
fprintf(1,'la siguiente línea seguida de la de F respecto a \n');
fprintf(1,'z o y-prima en la línea siguiente. \n');
fprintf(1,'ejemplp: (32+2*x^3-y*z)/8 \n'); %z=y' {f(x,y,y'}
fprintf(1,' -z/8 \n'); %fy:=-z/8 {df/dy}
fprintf(1,' -y/8 \n'); %fy1:=-y/8 {df/dy'}
s = input('');
F = inline(vectorize(s),'x','y','z');
s = input('');
FY = inline(vectorize(s),'x','y','z');
s = input('');
FYP = inline(vectorize(s),'x','y','z');
OK=0;
while OK == 0
fprintf(1,'Ingrese extremos derecho e izquierdo en líneas separadas.\n');
A = input(' ');
B = input(' ');
if A >= B
fprintf(1,'extremo izquierdo debe ser menor que el derecho.\n');
else OK = 1;
end;
end;
fprintf(1,'Ingrese Y(%.10e).\n', A);
ALPHA = input(' ');
fprintf(1,'Ingrese Y(%.10e).\n', B);
BETA = input(' ');
TK = (BETA-ALPHA)/(B-A);
fprintf(1,'TK = %.8e\n', TK);
fprintf(1,'Ingresa nuevo TK? Entre Y o N.\n');
AA = input(' ','s');
if AA == 'Y' | AA == 'y'
fprintf(1,'ingrese nuevo TK\n');
TK = input(' ');
end;
OK = 0;
while OK == 0
fprintf(1,'Ingrese un entero > 1 par el número de subintervalos.\n');
% EJEMPLO DE CARGA
% f1=@(x)0*x+10
% f2=@(x)0*x+100
% f3=@(x)0*x+50
% f4=@(x)0*x
% U=dirich(f1,f2,f3,f4,4,4,0.5,0.001,20)
%Inicializa parámetros y U
n=fix(a/h)+1;
m=fix(b/h)+1;
ave=(a*(feval(f1,0)+feval(f2,0)) ...
+b*(feval(f3,0)+feval(f4,0)))/(2*a+2*b);
U=ave*ones(n,m);
%Condiciones de borde
U(1,1:m)=feval(f3,0:h:(m-1)*h)';
U(n,1:m)=feval(f4,0:h:(m-1)*h)';
U(1:n,1)=feval(f1,0:h:(n-1)*h);
U(1:n,m)=feval(f2,0:h:(n-1)*h);
U(1,1)=(U(1,2)+U(2,1))/2;
U(1,m)=(U(1,m-1)+U(2,m))/2;
U(n,1)=(U(n-1,1)+U(n,2))/2;
U(n,m)=(U(n-1,m)+U(n,m-1))/2;
%parametros SOR
w=4/(2+sqrt(4-(cos(pi/(n-1))+cos(pi/(m-1)))^2));
%Refinando aproximaciones
err=1;
cnt=0;
while((err>tol)&(cnt<=max1))
err=0;
for j=2:m-1
for i=2:n-1
relx=w*(U(i,j+1)+U(i,j-1)+U(i+1,j)+U(i-1,j)-4*U(i,j))/4;
U(i,j)=U(i,j)+relx;
if (err<=abs(relx))
err=abs(relx);
end
end
end
cnt=cnt+1;
end
U=flipud(U');
Elíptica
Página 110 de 115
La solución numérica elemental con Octave
Se plantea la ecuación de Laplace, div(div)=0 en R={(x,y):0≤x≤4,0≤y≤4}con
las CF dadas por:
u(x,0)=10 y u(x,4)=100 para 0<x<4 y
u(0,y)=50 y u(4,y)=0 para 0<y<4
se toma h=0.5 para x e y, o sea 64 cuadrados en la malla
octave:13> f1=@(x)0*x+10;
octave:14> f2=@(x)0*x+100;
octave:15> f3=@(x)0*x+50;
octave:16> f4=@(x)0*x;
octave:17> U=dirich(f1,f2,f3,f4,4,4,0.5,0.001,20)
U =
Columns 1 through 6:
75.00000 100.00000 100.00000 100.00000 100.00000 100.00000
50.00000 72.56216 79.88936 81.64786 80.52445 76.68815
50.00000 60.35926 65.34734 66.17761 63.76179 57.91969
50.00000 53.52760 54.96319 53.95345 50.42541 43.98667
50.00000 48.78785 47.02429 44.24762 39.99980 33.76675
50.00000 44.59979 40.09850 36.01288 31.55942 26.04620
50.00000 39.51325 32.75749 28.14616 24.17901 19.88825
50.00000 30.69626 23.27224 19.63521 17.12241 14.67547
30.00000 10.00000 10.00000 10.00000 10.00000 10.00000
Columns 7 through 9:
100.00000 100.00000 50.00000
68.30843 49.30347 0.00000
47.24210 28.90547 0.00000
33.83481 19.07627 0.00000
25.03420 13.56482 0.00000
18.97039 10.14874 0.00000
14.65245 8.05973 0.00000
11.69142 7.43778 0.00000
10.00000 10.00000 5.00000
% Ejemplo de carga
% f=@(x)sin(pi*x)+sin(3*pi*x)
% crnich(f,0,0,1,0.5,1,11,11)
%Inicializa parámetros y U
h=a/(n-1);
k=b/(m-1);
r=c^2*k/h^2;
s1=2+2/r;
s2=2/r-2;
%Condiciones de borde
U(1,1:m)=c1;
U(n,1:m)=c2;
U(2:n-1,1)=feval(f,h:h:(n-2)*h)';
Vd(1,1:n)=s1*ones(1,n);
Vd(1)=1;
Vd(n)=1;
Va=-ones(1,n-1);
Va(n-1)=0;
Vc=-ones(1,n-1);
Vc(1)=0;
Vb(1)=c1;
Vb(n)=c2;
for j=2:m
for i=2:n-1
Vb(i)=U(i-1,j-1)+U(i+1,j-1)+s2*U(i,j-1);
end
X=trisys(Va,Vd,Vc,Vb);
U(1:n,j)=X';
end
U=U'
function X=trisys(A,D,C,B)
%Entradas – A es la subdiagonal de la matríz de coeficientes
% - D es la diagonal principal de la matríz de coeficientes
% - C es la diagonal superior de la matríz de coeficientes
% - B es el vector constante del sistema lineal
%SALIDA - X es el vector solución
N=length(B);
for k=2:N
mult=A(k-1)/D(k-1);
D(k)=D(k)-mult*C(k-1);
B(k)=B(k)-mult*B(k-1);
end
X(N)=B(N)/D(N);
for k= N-1:-1:1
X(k)=(B(k)-C(k)*X(k+1))/D(k);
end
Ecuación de calor
Otro ejemplo:
octave:20> f=@(x)sin(pi*x)+sin(3*pi*x);
octave:21> U=crnich(f,0,0,1,0.5,1,11,11)
U =
Columns 1 through 7:
0.00000 1.11803 1.53884 1.11803 0.36327 0.00000 0.36327
0.00000 -0.09292 0.02699 0.38379 0.78084 0.95342 0.78084
0.00000 0.21099 0.33069 0.33501 0.27955 0.24804 0.27955
0.00000 0.03534 0.09171 0.16788 0.23696 0.26507 0.23696
0.00000 0.05357 0.09342 0.11414 0.12045 0.12113 0.12045
0.00000 0.02137 0.04359 0.06500 0.08118 0.08727 0.08118
0.00000 0.01683 0.03099 0.04092 0.04645 0.04818 0.04645
0.00000 0.00887 0.01723 0.02432 0.02916 0.03089 0.02916
0.00000 0.00585 0.01100 0.01493 0.01736 0.01817 0.01736
0.00000 0.00339 0.00649 0.00900 0.01065 0.01122 0.01065
0.00000 0.00211 0.00400 0.00548 0.00642 0.00674 0.00642
Columns 8 through 11:
1.11803 1.53884 1.11803 0.00000
0.38379 0.02699 -0.09292 0.00000
0.33501 0.33069 0.21099 0.00000
0.16788 0.09171 0.03534 0.00000
0.11414 0.09342 0.05357 0.00000
0.06500 0.04359 0.02137 0.00000
Página 113 de 115
La solución numérica elemental con Octave
0.04092 0.03099 0.01683 0.00000
0.02432 0.01723 0.00887 0.00000
0.01493 0.01100 0.00585 0.00000
0.00900 0.00649 0.00339 0.00000
0.00548 0.00400 0.00211 0.00000
U =
Columns 1 through 7:
0.00000 1.11803 1.53884 1.11803 0.36327 0.00000 0.36327
0.00000 -0.09292 0.02699 0.38379 0.78084 0.95342 0.78084
0.00000 0.21099 0.33069 0.33501 0.27955 0.24804 0.27955
0.00000 0.03534 0.09171 0.16788 0.23696 0.26507 0.23696
0.00000 0.05357 0.09342 0.11414 0.12045 0.12113 0.12045
0.00000 0.02137 0.04359 0.06500 0.08118 0.08727 0.08118
0.00000 0.01683 0.03099 0.04092 0.04645 0.04818 0.04645
0.00000 0.00887 0.01723 0.02432 0.02916 0.03089 0.02916
0.00000 0.00585 0.01100 0.01493 0.01736 0.01817 0.01736
0.00000 0.00339 0.00649 0.00900 0.01065 0.01122 0.01065
0.00000 0.00211 0.00400 0.00548 0.00642 0.00674 0.00642
Columns 8 through 11:
1.11803 1.53884 1.11803 0.00000
0.38379 0.02699 -0.09292 0.00000
0.33501 0.33069 0.21099 0.00000
0.16788 0.09171 0.03534 0.00000
0.11414 0.09342 0.05357 0.00000
0.06500 0.04359 0.02137 0.00000
0.04092 0.03099 0.01683 0.00000
0.02432 0.01723 0.00887 0.00000
0.01493 0.01100 0.00585 0.00000
0.00900 0.00649 0.00339 0.00000
0.00548 0.00400 0.00211 0.00000
%Inicializa parámetros y U
h=a/(n-1);
k=b/(m-1);
r=c+k/h;
r2=r^2;
r22=r^2/2;
s1=1-r^2;
s2=2-2*r^2;
U=zeros(n,m);
Ecuación de onda