Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Apunte Numerico Lab PDF
Apunte Numerico Lab PDF
Facultad de Ingeniería
Depto. Ingeniería Quimica
APUNTE
DE
CÁLCULO NUMÉRICO
AUTORES
TABLA DE CONTENIDOS
Tema 4: Interpolación_________________________________________________________14
Tema 1
Algunos aspectos del MATLAB
a) Números complejos: MatLab trae incorporado el trabajo con números complejos, y para ello
reconoce la letra i como la unidad imaginaria; ejemplo:
>> a = 1+i;
>> b = -5+2i
Para nombrar los ejes de los gráficos, se puede utilizar la pantalla gráfica viendo en las opciones, o usando
el comando
xlabel(‘nombre del eje x’)
ylabel(‘nombre del eje y’)
title(‘título’)
Todos los comandos van en minúsculas. Recordar que MatLab diferencia entre mayúsculas y minúsculas.
El nombre de la función debe ser igual al del archivo .m donde esta se guarda. Dicho nombre debe cumplir
ciertas características:
Es posible generar un archivo de datos en MatLab, para posteriormente abrirlo en otra rutina o
subprograma. Asimismo, es posible guardar archivos tipo .m como ascii, para ser abierto en otro tipo de
documentos, en particular, en EXCEL.
3 Apun te d e Cá lcu lo Numérico
Para guardar un archivo con extensión tipo .m basta usar el comando save. Considerar la matriz A
en el workspace.
Si se usa solo el comando save, guarda todas las matrices existentes en la pantalla.
El archivo debe guardarse como tipo ascii (caracteres) para poder ser reconocido por otro
programa. Se usa el comando save de la misma forma. Considerar un vector b para el ejercicio.
>>save vector b –ascii –tabs % guarda el vector b en un archivo tipo ascii llamado vector, que
después puede ser abierto con EXCEL. El comando tabs permite
respetar las tabulaciones, si las hubiera.
Observaciones:
Comandos de interés:
Tema 2
Sistemas de ecuaciones lineales.
La resolución del problema Ax=b, donde A es una matriz cuadrada de m×m y b un vector de m×1, da
origen a la teoría de sistemas de ecuaciones. Este problema tendrá solución siempre y cuando la matriz A
tenga inversa, lo que es equivalente a decir que el determinante de la matriz no es cero, o que cero no es
valor propio de A, i.e. todas las filas y columnas de A son linealmente independientes.
Como calcular la matriz inversa A-1, es muy costoso computacionalmente (en MatLab se hace con el
comando inv(A)), se recurren a dos tipos de métodos, los directos y los indirectos.
- Métodos directos: Son aquellos que operando sobre la matriz A, ya sea factorizándola o
intercambiando columnas, permiten encontrar la solución x.
- Métodos indirectos: Sin alterar la matriz A, se genera una sucesión de vectores X0, X1…Xn de
modo que dicha sucesión converja a la solución del sistema.
Gauss
Métodos Directos LU
Chol.
S.E.L.
Jacobi
P.C.G
- Factorización LU
Consiste en decomponer la matriz A en dos matrices, una matriz triangular superior U y una triangular
inferior L. A partir de esto se genera el Método de Thomas (ver problema 7 lab 2). También requiere
que la matriz sea no singular (determinante distinto de cero.) En MatLab, el comando usado es:
[L,U]= lu(A). Este comando devuelve la matriz L triangular inferior y una matriz U
“psicológicamente” triangular superior, puesto que devuelve la matriz sin permutar, en el caso que la
matriz requiera ser permutada. (ver la idea del pivoteo cuando los elementos de la fila pivote son 0).
Con esta descomposición, el sistema a resolver es:
(L*U)*x=b
5 Apun te d e Cá lcu lo Numérico
[L,U,P] = lu(A), devuelve la matriz triangular superior L, la matriz triangular inferior U y una matriz
de permutación P, que fue necesario hacer para que la matriz U quedara triangular inferior. Como
hubo que permutar la matriz A para factorizarla, para resolver el sistema hay que permutar el vector b
y el sistema a resolver es:
(L*U)*x = P*b
- Cholesky
Consiste en descomponer a en una matriz R de modo que A=R*Rt. Esta factorización es más
restrictiva pues requiere que la matriz A sea una matriz simétrica ( que A=At en el caso de las
matrices reales) y definida positiva (que los valores propios de A sean todos mayores que cero). En
MatLab el comando a usar es:
R= chol (A)
El problema 3 del laboratorio 3, tiene como objetivo ver como se usan estos comandos y medir los
tiempos de resolución de los métodos pre definidos en MatLab, a saber: \, lu, chol y el comando inv. Se
observa que el comando \ es el más rápido. Le sigue el método de Cholesky, el comando inv y luego lu.
Este orden se debe a que las rutinas predefinidas en el MatLab funcionan más rápido que los programas.
El condicionamiento de una matriz indica si el sistema propagará errores al utilizar algún método para
resolverlo.
Sea el sistema:
Ax = b
Si el vector b, o la matriz A sufren alguna perturbación en sus elementos: la matriz será bien condicionada
si el resultado obtenido no se altera mayormente con respecto al resultado del sistema inicial. Por el
contrario, si el resultado sufre severos cambios al introducir una pequeña perturbación en b o A, el sistema
es mal condicionado y la solución está sujeta a mucho error.
El índice que permite establecer si una matriz o el sistema está bien o mal condicionado es el ‘número de
condición’, que puede ser calculado como:
µ = A ⋅ A −1
También se calcula como el menor valor propio de la matriz A. Este valor lo entrega el comando MatLab:
Si el número de condición para cualquiera de las dos formas es cercano a 1, la matriz está bien
condicionada; de lo contrario, si es mucho mayor a uno, el sistema está mal condicionado.
Esta idea se ve en el problema 4 del laboratorio 3, donde se construye la matriz de Hilbert, que es muy mal
condicionada, perturbándose el vector b en orden de 10-6 y se comparan los valores. La solución del sistema
perturbado dista mucho de la solución original, por lo que el sistema es muy mal condicionado.
6 Apun te d e Cá lcu lo Numérico
Los métodos iterativos son los métodos indirectos. Su nacimiento se debe a la existencia de las matrices
ralas o ‘sparse’, la cual tiene en muchas posiciones el cero, que no necesariamente son matrices banda o
tridiagonales. A decir verdad, estas últimas son un caso especial de una matriz dispersa o rala.
Los métodos directos, además de ocupar mucha memoria, perturban el carácter disperso de una matriz,
puesto que la factorización va creando elementos no nulos en posiciones inicialmente nulas. Este
problema se conoce como el problema de llenado, el cual aumenta la propagación de los errores de
redondeo en la solución del sistema, además de encarecer el costo computacional de los métodos.
La idea es generar una sucesión de soluciones Xi de modo que esta sucesión converja a la solución x.
La convergencia de la solución está garantizada por los teoremas vistos en clases. Uno de estos criterios es
que la norma de la matriz de iteración (que no es la misma que la matriz A del sistema) sea menor que
uno. Basta con que una norma cumpla esta condición, para que la sucesión converja a la solución.
La matriz almacenada como ‘full’, es una matriz que guarda todas las posiciones, incluso los ceros. En
cambio la matriz ‘sparse’, almacena la matriz sin las posiciones nulas (no guarda ceros), por lo que se
transforma en una manera más económica de trabajar con las matrices dispersas.
La ventaja es que MatLab permite hacer algunas operaciones con matrices sparse sin que éstas pierdan
dicha condición. El comando speye permite crear la matriz identidad pero de manera sparse. Si se desea
pasar una matriz full a una matriz sparse se realiza:
>>A=sparse (M);
>>B=full(A);
El conteo de elementos no nulos (distintos de cero) en una matriz, se hace con el comando nnz.
El problema 5 del laboratorio 4 tiene como objetivos: crear una matriz rala como full y verificarla con el
comando nnz, para mostrar que la matriz está compuesta mayoritariamente de ceros. Luego pasarla a una
matriz sparse y comparar su tiempo de resolución con una full, para notar que una matriz sparse permite
un ahorro de memoria y de tiempo para solución.
Además, ver que las matrices pueden generarse sin pasar primero por matrices full, usando el comando
speye, spdiags (análogo al comando diags pero hecha sparse) y luego construir la matriz de iteración para
el método de Jacobi.
7 Apun te d e Cá lcu lo Numérico
Toma la matriz A y la descompone en tres matrices: D (diagonal principal de A), -E (matriz triangular
inferior) y -F (matriz triangular superior, es decir, desde la diagonal principal para arriba posee
elementos).
A=D–E–F
J es la matriz a la cual se le estudia la convergencia usando el teorema señalado en la sección 2.3 (lo de la
norma). Para calcularla se utiliza la norma infinito, porque ésta es más resistente a los cambios.
Jacobi es un método convergente cuando la matriz es de diagonal dominante. Es decir, que el elemento de
la diagonal principal en valor absoluto, es mayor que la suma de los valores absolutos de los elementos de
la fila correspondiente.
n
aii > ∑ aij
i =1
j =!
Notar que si A es sparse, la generación de las matrices D con el comando diag, -E con el comando tril y -F
con el comando triu devuelven matrices sparse. La construcción de este sistema está resuelta en el
problema 4 de la guia 3 y puede utilizarse con el algoritmo planteado en el problema 6, cambiando sólo la
matriz de iteración.
Para las matrices D, -E y -F, usadas anteriormente, la matriz de iteración J está elegida de la siguiente
manera:
J = ( D – E)
Los métodos iterativos deben detenerse una vez que se considera que la sucesión converge. En la teoría, la
sucesión converge en el infinito. Como en la práctica no existe, se debe detener la iteración una vez que se
llegue a un grado aceptable de medición, dado por la precisión que se busca. Un test sugerido es el
siguiente:
mk
x k +1 − x k < tol
1 − mk
x k −1 − x k
mk =
x k − x k +1
El Gradiente Conjugado es un método que depende mucho del número de condicionamiento y requiere
que la matriz sea simétrica y definida positiva.
El gradiente conjugado posee un origen distinto a los anteriores, viene de la minimización de una función
objetivo. El MatLab usa el comando ‘pcg’ para el gradiente conjugado. En realidad, es un gradiente
conjugado precondicionado, esto se debe a que el gradiente conjugado converge muy lentamente si la
matriz es mal condicionada. A veces se usan precondicionadores (que es lo que hace esta rutina), que
deben elegirse con cuidado, porque el precondicionar una matriz puede alterar sus características de
simetría y definida positiva.
>>X=pcg(A,b,tol, maxit)
El problema 6, muestra como se usa el gradiente conjugado y compara su uso con el método de Gauss
Seidel.
9 Apun te d e Cá lcu lo Numérico
Tema 3
Mínimos cuadrados
El objetivo de los cuadrados mínimos es encontrar la función φ(x) que ajuste una dispersión de puntos de
“la mejor forma posible”. Esta forma resulta de la minimización de la suma de todos los cuadrados de las
distancias entre la función y los puntos que se disponen. Esta función puede ser una función polinomial o
cualquier otra.
m 2
∑ϕ
i =1
( xi ) − yi (3.1)
El problema se reduce entonces a encontrar una función φ que sea una combinación lineal de las funciones
dadas para ajustar el modelo (por ejemplo, ajustar los puntos a una función polinomial), tal que se cumpla
la condición anterior.
Esto genera el siguiente problema a resolver: Ax=b, con A una matriz rectangular de m filas y n columnas,
con n, el número de elementos de la base que genera a φ.
Recordar los 3 casos:
- n>m : El sistema está sobredeterminado (tenemos más ecuaciones que incógnitas) y la
base sería una combinación lineal (ver el ejemplo propuesto 2 del lab 4).
- n=m : El sistema tiene solución única (caso de interpolación - tema 4-).
- n<m : El sistema tendría infinitas soluciones.
3.1 Matriz QR
El caso de los mínimos cuadrados trata acerca del último caso (n < m). Lo que se persigue es encontrar un
vector x tal que la norma de los residuos sea mínima (condición similar a la anterior, de hecho, de ahí
viene la ec 3.1), es decir:
r 2 = b − A⋅ x 2 (3.2)
At ⋅ r = 0 → At ⋅ (b − A ⋅ x) = 0 → At ⋅ A ⋅ x = At ⋅ b
La última ecuación se conoce como sistema de ecuaciones normales y es un sistema cuadrado que tendrá
solución si A es de rango completo, es decir, rango(A)=n. Además, A es simétrica y definida positiva, por
ende, se podrían aplicar los métodos de resolución de ecuaciones, como Cholesky, Gauss Seidel y el
gradiente conjugado, pero también se sabe que la matriz At⋅A es muy mal condicionada, por lo que se
prefiere otra solución: el de utilizar la descomposición de A en dos matrices: A=Q⋅R, donde:
En virtud de lo anterior:
Q⋅Q t = I
10 Apun te d e Cá lcu lo Numérico
At ⋅ A ⋅ x = At ⋅ b
R t ⋅ Q t ⋅ (Q ⋅ R ) ⋅ x = R t ⋅ Q t ⋅ b
Rt ⋅ I ⋅ R ⋅ x = Rt ⋅ Qt ⋅ b
R ⋅ x = Qt ⋅ b
A veces, los problemas no lineales pueden ser reducidos a lineales mediante un proceso de linealización,
que consiste en dejar el modelo pedido como lineal mediante alguna transformación matemática. Algunos
casos se verán a continuación:
Este modelo puede transformarse a lineal si se invierte la variable x, con ello el ajuste de mínimos
cuadrados obedece a una recta y los puntos a trabajar ya no son x, sino sus inversos.
y = A ⋅ exp(b ⋅ x ) → ln( y ) = ln A + b ⋅ x
Para un modelo exponencial planteado, el problema puede ser linealizado al aplicar logaritmo, con
ello se genera la ecuación de una recta, con la salvedad que los puntos y se les debe aplicar el
logaritmo y luego ser usados en la solución del sistema. La pendiente de la recta da directamente
el valor de b, mientras que el valor de A viene dado por la exponencial del coeficiente.
y = A ⋅ x b → ln( y ) = ln A + b ⋅ ln x
El modelo potencial se linealiza para un b desconocido (Ojo, como b hay que determinarlo, esto
no es un modelo polinomial!), donde los datos x, y deben pasar a sus respectivos logaritmos.
El MatLab permite trabajar con polinomios, incluso encontrar el polinomio que mejor ajuste en el sentido
de los mínimos cuadrados a un conjunto de puntos dados. A continuación se presentará la forma de
ingresar un polinomio a MatLab y algunos de los comandos más usados.
n −1
Sea el polinomio P( x ) = an x + an −1 x +… a 0
n
11 Apun te d e Cá lcu lo Numérico
El polinomio se ingresa a MatLab como un vector fila de la forma: P = [an an-1 … a0]
Y=polyval(P,x) : Devuelve un vector Y que contiene los valores que resultan de evaluar x en el
polinomio P.
r=roots(P) : r es un vector que contiene las raíces del polinomio P.
P=poly(r) : P es un polinomio formado a partir de las raíces r.
P=polyfit(x,y,n) : si x e y son los puntos que se disponen y n es el grado del polinomio; P es el
polinomio de grado n que mejor ajusta en el sentido de los mínimos cuadrados al
conjunto de puntos x e y.
La primera rutina (Aj_Pol) genera y devuelve una matriz A de m×n que deben ser ingresados. Esta matriz
corresponde a la matriz de problemas de mínimos cuadrados, cuando la base elegida es un polinomio de
grado n y los puntos elegidos para construir la función que mejor los aproximará son los puntos
equiespaciados en el intervalo [0,1].
La segunda rutina permite estudiar el condicionamiento de la matriz AT⋅A, mostrando que el sistema está
mal condicionado. Luego se muestran las propiedades de la matriz Q.
La última parte muestra como se encuentra el polinomio de grado 5 que ajusta a la función exp(x), para los
puntos dados. Esto se hace generando la matriz A (ya hecha en la rutina Aj_pol) y resolviendo el sistema
de ecuaciones Ax=b con el comando \ en Matlab. El comando polyval permite evaluar el polinomio c en él
o los puntos tt.
⎛ 2 ⋅π ⋅ t ⎞ ⎛ 2 ⋅π ⋅ t ⎞
B = 1 + eα t + cos ⎜ ⎟ + sin ⎜ ⎟
⎝ 12 ⎠ ⎝ 12 ⎠
12 Apun te d e Cá lcu lo Numérico
La matriz resulta de la evaluación de los puntos x, que contiene el archivo, en cada uno de los elementos
de la base. De esta manera, la rutina para encontrar los coeficientes es:
Obervación: notar el uso del comando ones para generar la columna de unos que exige la base.
2 ⋅ x i ⋅ a + 2 ⋅ y i ⋅ b + c = x i2 + y i2
Así, el sistema de ecuaciones queda claramente definido. Los valores de x e y son conocidos; resta sólo
encontrar los valores de a, b, c. La matriz en este caso, se forma como se muestra en la rutina:
Observaciones:
- Notar que la generación del vector b se usa el punto, pues se desea multiplicar cada elemento por si
mismo.
- Se usan ecuaciones paramétricas para graficar la circunferencia.
- El vector p contiene los 3 coeficientes buscados. Por el orden que fue formada la matriz, el elemento
1 corresponde al valor de a, el elemento 2 al de b y el 3 al de c.
13 Apun te d e Cá lcu lo Numérico
sin 2 ( x) + co s 2 ( x) = 1
Debidos a esto, MatLab da un warning acerca de la repetición de ecuaciones. Se puede eliminar cualquier
columna (recordar que la matriz debe ser de rango completo). Esto se hace en la rutina con el comando
A=A(:,2:3).
load rango
m=length(t);
A=[ones(m,1) cos(pi*t).^2 sin(pi*t).^2 ];
x=A\y;
A=A(:,2:3);
x=A\y;
tt=0:0.01:1;
mod=x(1)*cos(pi*tt).^2+ x(2)*sin(pi*tt).^2
plot(t,y,'o',tt,mod,'-')
14 Apun te d e Cá lcu lo Numérico
Tema 4
Interpolación
Si se tiene un conjunto de puntos, al cual se le desea ajustar una curva, lo lógico y la mínima exigencia
que se le hace a la curva que pretende ajustar a dichos puntos, es que pase por todos ellos. Por lo tanto, la
interpolación consiste en construir una curva que pase por todos los puntos.
La principal diferencia que existe con los mínimos cuadrados, es que los últimos buscan un ajuste que
minimiza distancias, pero no necesariamente exige que esta curva pase por los puntos
La interpolación puede ser de dos formas:
Interpolación
- Polinomial
No se dará mayor detalle en este laboratorio, sólo saber que los L(x) son los polinomios de Legendre
asociados a los puntos. (ver su construcción en las diapositivas del curso)
n
P ( x ) = ∑ y i L( x )
i =1
Y si se desea contruir un polinomio de interpolación, se puede usar el comando polyfit del MatLab
(visto en en la sección anterior), recordando que el grado del polinomio n debe ser igual al número de
puntos menos uno (n = m − 1).
El comando polyfit entrega un polinomio de la manera: [an an-1 ... a0]
El problema es que estos polinomios pueden comenzar a oscilar si n crece mucho, así que se busca
una solución diferente para evitar estos problemas (fenómeno de Runge)
- Spline
El spline es una función cúbica por tramos, es decir, hace un ajuste polinomial cúbico entre dos
puntos. Este ajuste se hace para todos los puntos que se dispongan. La ventaja es que al ser de un
grado 3, no oscila como un polinomio de alto grado.
Para que un polinomio cúbico sea una spline, debe cumplir que:
Ejemplo 4.1: Comparación entre interpolación y ajuste de mínimos cuadrados (problema 1 c) Lab.5)
El siguiente programa construye los polinomios de ajuste para n = 5 y para n = 10 para la función seno.
Primero se generan los puntos (11 puntos) y luego se construyen los dos polinomios de ajuste. Se ve
claramente en la figura 3.1 que el polinomio de grado 10 es de interpolación, porque pasa por todos los
puntos, mientras que el de 5 no lo hace. EL vector xx es sólo un conjunto de puntos que sirve para graficar
los polinomios determinados con el comando polyfit. Para evaluar los puntos se usa el comando polyval,
que funciona de la forma:
>>Y=polyval(P,xx)
X= 0:10;
Y= sin(x);
C5=polyfit(x,y,5);
C10=polyfit(x,y,10);
xx=0:0.1:10;
Plot(x,y,’x’,xx,polyval(C5,xx),’—‘, x,y,’y’,xx,polyval(C10,xx),’-‘)
Figura 3.2: Fenómeno de Runge Figura 3.3: aproximación de la función usando spline
La rutina anterior permite visualizar el conocido fenómeno de Runge. Primero, se determinan los puntos
usados para construir los polinomios de interpolación, luego se determinan con el comando polyval, los
polinomios de grado 6 (C6) y de grado 10 (C10) para aproximar la función.
La figura 3.2 muestra que los polinomios sólo aproximan en una región (al centro) a la función pedida. En
los extremos, los polinomios comienzan a oscilar y esta oscilación se hace cada vez más fuerte debido al
aumento del grado del polinomio. El polinomio de grado 10 es mucho más oscilante que el de grado 6.
Esto puede evitarse si se usan splines para interpolar la función, como se muestra en la figura 3.3. Esta
curva es mucho mejor aproximada por una spline, además de tener la ventaja de evitar las oscilaciones
La figura 3.4 muestra los puntos que componen la pieza. Se ve que existen esquinas o puntos de
discontinuidad que impiden usar una sola spline para dibujarla, por lo que se deben hacer tres splines para
evitarlos. De cualquier forma, la función seguirá teniendo sus esquinas, pero ahora está bien representada
por 3 splines en la figura 3.5
Parametrizacion Parametrizacion
de x de y
Para dibujar la espiral se necesitan encontrar puntos intermedios x e y que pertenezcan a la espiral. Esto se
hace parametrizando la curva con la variable t. Una vez conocidos estos valores, se puede graficar la
espiral, tal como se muestra en la figura 3.7
Ejemplo 4.5: Más acerca del fenómeno de Runge (problema propuesto 1 Lab.5)
La idea de este problema es ver que, a medida que aumentan los puntos usados para construir el polinomio
de interpolación, mayores son las oscilaciones que el polinomio genera al tratar de aproximar la función.
En la figura 3.8 se aprecia que el crecimiento de puntos sólo aproxima de buena forma la región del centro
de la curva, pasado ésta, se observan oscilaciones.
La situación no es tan mala, porque sí existen funciones que se aproximan mejor, con más puntos. La
función seno no es una función “mal comportada”. A medida que el grado del polinomio de interpolación
aumenta, la exactitud se hace cada vez mayor. Si se hace un polinomio de grado 7, la aproximación es casi
perfecta
Tema 5
Integración numérica
La idea es hallar la integral de una función f continua en el intervalo [a,b] donde se pretende integrar.
n
I = ∫ p ( x) ⋅ f ( x) → ∑ Ai ⋅ f ( xi ) + R
b
a
i =1
La integral se transforma en un producto de un factor por la función evaluada en alguna partición del
intervalo. Como este producto no es exacto, hay un resto R.
A veces es más cómodo ingresar la función como una variable string y una forma es usando el comando
inline. Por ejemplo, para ingresar la función exp(-x2)
>>t = inline(‘exp(-x.^2)’)
La idea es ingresar la función no como archivo, sino como un parámetro y con ello ahorrar memoria. La
desventaja está en que una función definida como inline no puede recibir valores que no sean los de la(s)
variable(s) con la(s) que se vaya a trabajar. Por ejemplo, en el caso anterior, sólo recibe valores de x.
Una vez ingresada la función en MatLab, esta puede evaluarse mediante el siguiente comando:
>>Y=feval(t,x)
Donde t es la función ingresada como inline, x un punto o un vector e Y es un número o un vector que
resulta de la evaluación de x en la función.
21 Apun te d e Cá lcu lo Numérico
quadl (tol=10-6)
Para integrales dobles, utilizar dblquad(función, a, b, c, d, tol), donde a y b los intervalos donde está el
rectángulo asociado a la variable x, c y d son los intervalos de integración de y.
Por ejemplo, una manera de conocer la tolerancia de los comandos utilizados es realizar lo siguiente
(problema 3 del lab. de integración)
>> q=inline('exp(-x.^2)');
>> e1=quad(q,-1,1)
e1 =
1.49364827606288
>> e2=quad(q,-1,1,1e-6)
e2 =
1.49364827606288
>> s1=quad('sqrt',0,1)
s1 =
0.66665956927202
>> s2=quad('sqrt',0,1,1e-6)
s2 =
0.66665956927202
22 Apun te d e Cá lcu lo Numérico
h ⎛ n −1
⎞
I= ⋅ ⎜ f (a ) + f (b) + ∑ f ( xi ) ⎟
2 ⎝ i =1 ⎠
R = −n ⋅
h3
⋅ f ''(θ ) = −
( b − a ) ⋅ h2 ⋅ f ''(θ )
12 12
θ ∈ [ a, b ]
Si luego, se escribe:
>>trap(t,0,20)
1
∫e
x2
Lo que resulta entonces es: ⋅dx con 20 subintervalos.
0
La misma mecánica se sigue tanto para las funciones definidas en la librería, que no es necesario
ingresarlas, como las ingresadas como inline.
El comando format long, permite ver todos los decimales de un número. Puede ir tanto en el programa
como en el main de MatLab.
>>format long
>>f=inline(‘x.^2’)
f = Inline function:
f(x) = x.^2
>>g =inline(‘exp(-x.^2)’)
g = Inline function:
g(x) = exp(-x.^2)
Esta última función no necesita ser definida como inline, puesto que ya está definida en la librería del
MatLab. Una función que está ya definida, como el logaritmo (log) o la raíz cuadrada (sqrt) basta sólo con
llamarla entre comillas.
Importante: las funciones definidas son sqrt(x) y log(x), no funciones complejas del tipo sqrt(x+1), esta
última debe ser definida como inline.
El programa recibe la función y los intervalos de integración a y b.
h ⎛ n −1 n −1
⎞
I= ⋅ ⎜ f (a ) + f (b) + 4 ⋅ ∑ f ( x2i +1 ) + 2 ⋅ ∑ f ( x2i ) ⎟
3 ⎝ i =0 i =1 ⎠
R = −n ⋅
h5 ( IV )
⋅ f (θ ) = −
( b − a ) ⋅ h4 ⋅ f IV (θ )
90 180
θ ∈ [ a, b ]
Esta regla hace diferencia entre los puntos de integración pares e impares. El algoritmo resultante es el
siguiente.
function int=simpson(funct,a,b,N)
Notar que debido a la división de números pares e impares que hace el algoritmo, el paso se parte en 2⋅N y
una vez separados, se aplica el algoritmo sumando las componentes pares e impares por separado,
multiplicando por sus respectivos factores.
Para las mismas integrales, se cambia en el caso 1 a) el comando trap por simpson:
24 Apun te d e Cá lcu lo Numérico
>>format long
>>f=inline(‘x.^2’)
f = Inline function:
f(x) = x.^2
Se espera, en este último caso, que la solución sea exacta, ya que Simpson, entrega soluciones exactas
para polinomios de segundo grado.
El nacimiento de esta fórmula es distinto, ya que parte de la idea de que los Ai no se conocen. Para n
puntos de partición el algoritmo es:
b−a ⎛ n ⎛⎛ b − a ⎞ ⎞⎞
I= ⋅ ⎜ ∑ Ai ⋅ f ⎜ ⎜ ⎟ ⋅ ( xi + 1) + a ⎟ ⎟
2 ⎝ i =0 ⎝⎝ 2 ⎠ ⎠⎠
La diferencia radica en que los xi ya no son arbitrarios, sino que dependen de los puntos n.
Sobre el espacio vectorial de las funciones continuas definidas en el intervalo [a, b] a valores reales, se
define el siguiente producto interior:
b
< f , g >= ∫ f ( x) ⋅ g ( x)dx
a
Haga un programa general en MatLab, llamado testIIc.m que, usando integración de Gauss con los puntos
dados en la tabla, calcule el producto interior entre dos funciones. El programa deberá tener por entrada
los valores de a y b, y por salida el valor del producto interior.
xi Ai
± 0.861136311594053 0.347854845137455
± 0.339981043584856 0.652145154862547
Solución:
Primero se construye un programa genérico para esos valores de la cuadratura (lo ideal sería tener en el
MatLab una tabla para todos los valores de n). El programa resultante es:
function I=gauss(f,a,b)
x=[-0.861136311594053 -0.339981043584856 0.861136311594053 0.339981043584856];
A=[0.347854845137455 0.652145154862547 0.347854845137455 0.652145154862547];
u=(a+b)/2+(b-a)/2*x; % se aplica el cambio de variables
Y=feval(f,u); % se evalúa la función
I=0.5*(b-a)*A*Y'; % se realiza el producto Ai*ui
Luego, las funciones deben ser ingresadas como inline. El resto queda propuesto.
f=inline('exp(-x)');
N=10:10:100;
error=[];
for n=N;
integ=trap(f,0,1,n);
error=[error abs(integ-(1-exp(-1)))];
end
loglog(N,error,'o:',N,(1./N).^2,'-')
Esta rutina pretende probar la observación dada en el enunciado del problema 2. Para establecer que el
error es de orden 2, se grafica el error que sale de la diferencia entre el cálculo de la integral con el método
de los trapecios y el valor verdadero, que es conocido. Con ello, se genera una tabla de valores entre N y el
error, almacenada en dos vectores: n y error. El ciclo for es para hacer variar el paso N y obtener los datos
de la integración. Ahora bien, si se grafica la función 1/n2 contra n en un gráfico logarítmico, la gráfica es
una línea recta de pendiente -2. Si el error fuera de orden 2, la pendiente de un gráfico logarítmico entre N
y el error, debería tener la misma pendiente, es decir, serían paralelas. En efecto:
y como h=1/N
g=inline('sqrt(x)');
N=10:10:100;
error=[]; log f(N) = -2⋅log(N) para la función n vs 1/n2
for n=N;
integ=trap(g,0,1,n);
error=[error abs(integ-2/3)]; log(ε) = -alpha⋅log(N)+b
end
loglog(N,error,'o:',N,(1./N).^2,'-') y como h=1/N
m=length(N);
A=[ones(m,1) -log(N)']; error =C/N alpha = C⋅h alpha con C=10 b
b=log(error)';
z=A\b; Se obtiene un orden de 1.4811
Alpha=z(2)
figure
loglog(N,error,'o:',N,(1./N).^Alpha,'-')
27 Apun te d e Cá lcu lo Numérico
Tema 6
Ecuaciones no lineales.
El objetivo de este tema es resolver ecuaciones y sistemas de ecuaciones no lineales usando técnicas
numéricas y con ayuda del MatLab.
A continuación se presenta una breve descripción de los algoritmos clásicos usados para resolver
ecuaciones no lineales tanto en una variable, como en varias variables (sistemas de ecuaciones lineales).
Está basado en el teorema del valor medio, que señala que si la función a resolver es continua en el
intervalo de solución y sea f(a)<f(b). Para cada f(a)<z<f(b) debe existir un x0 que pertenezca al intervalo
de solución. En particular, si f(a) y f(b) tienen signos opuestos, este x0 debe ser 0. Así, conocido un
intervalo donde hay un cero o raíz, lo que se hace es partir el intervalo en dos, luego evaluar la función en
los puntos extremos del intervalo ya cortado. Si existe un cambio de signo en f(xa)⋅f(xb), implica que hay
una raíz en el intervalo y este se vuelve a cortar. Así sucesivamente hasta encontrar una raíz. La
aproximación puede obtenerse mediante el gráfico de la función. Es un método de convergencia lento,
pero siempre converge si el intervalo es adecuado. Se le llama método de convergencia garantizada por
ser lento, pero siempre encuentra la solución. No depende de la distancia entre la solución y el valor que
se dio como inicial. Sólo sirve para una variable.
Se utiliza cuando es muy difícil conocer la raíz de la ecuación o función. Es lo mismo que utilizar Newton
Rapson, pero no se conoce la derivada, pero se necesitan 2 puntos de apoyo al principio, para comenzar a
trabajar. Es extensivo también a sistemas de ecuaciones.
28 Apun te d e Cá lcu lo Numérico
Los sistemas de ecuaciones pueden componerse como funciones a valores vectoriales, es decir, agrupar las
funciones en una función F que es un vector. En virtud de esto, las funciones son ingresadas como
matrices dentro de la plataforma, ya sea como inline o como archivos. Por ejemplo:
Este sistema puede agruparse como un vector, para luego ser resuelto con técnicas que veremos
posteriormente. Considerar para esta agrupación, el siguiente cambio de variables:
x = x(1) ; y = x(2)
Con ello, la función F puede construirse con las dos ecuaciones de la forma:
⎡ f ⎤ ⎡ x 2 + x ⋅ y + y 2 − 1⎤
F = ⎢ 1⎥ = ⎢ ⎥
⎣ f2 ⎦ ⎣ y + x2 ⎦
Notar que las ecuaciones, independiente del número de variables que tengan, deben tener la forma
f ( x, y , z , w..) = 0
Así, la manera de ingresar el vector en MatLab (con el cambio de variables realizado) es:
f=inline('[x(2)-x(1).^2;x(1).^2+x(2).^2-4]');
fzero : permite encontrar soluciones para una ecuación no lineal (1 variable), se debe correr tantas
veces como raíces se tengan.
>>fzero(f,x0,tol)
El comando fzero, permite encontrar las raíces de una ecuación, para ello, se debe tener una aproximación
inicial de la solución, que puede obtenerse mirando un gráfico de ella. Su sintaxis es:
29 Apun te d e Cá lcu lo Numérico
>>x=fzero(‘f’,x0)
Donde:
x : Solución de la ecuación no lineal.
f : Función a resolver. Puede ser un objeto inline o un archivo.
x0 : Solución aproximada inicial
A continuación se presentan unos ejemplos del uso del comando fzero para la solución de ecuaciones no
lineales.
a) x 2 = 2
b) x 3 − 3 x + 1 = 0
c) cos( x) = x
Caso 1
Se sabe que las raíces son 2 y − 2 . Basta utilizar como aproximación 1.41 y -1.41 para encontrar las
raíces. Con ello, la función ingresada es:
>> f=inline('x.^2-2')
f = Inline function:
f(x) = x.^2-2
>> fzero(f,1.4)
ans = 1.4142
La misma idea debe repetirse para hallar la segunda, usando la correspondiente aproximación inicial.
Caso 2
Aquí las raíces ya no son claras, y debe recurrirse a un gráfico para poder verlas. Por ende, primero
graficar esta función, recordando el comando feval visto en tema anterior y el ingreso de la función de la
forma f(x)=0 (ya está en esa forma):
x=-10:0.1:10
f=inline('x^3-3*x+1')
f = Inline function:
f(x) = x^3-3*x+1
plot(x,feval(f,x))
30 Apun te d e Cá lcu lo Numérico
Del gráfico, se pueden extraer aproximaciones de raíces para luego aplicar en conjunto con el comando
fzero. Se debe ejecutar 3 veces, una por cada raíz que se tenga.
>> fzero(f,1.4)
ans = 1.5321
>> fzero(f,0)
ans = 0.3473
>> fzero(f,-1.2)
ans = -1.8794
Caso 3
La idea es la misma, graficar y luego encontrar la raíz que se ve en el gráfico.
x=-2:0.1:2;
f=inline('cos(x)-x')
f =
Inline function:
f(x) = cos(x)-x
>> plot(x,feval(f,x),x,0)
>> fzero(f,1)
ans =
0.7391
Comentario, el plot (x,0) permite que aparezca el eje x de modo de facilitar la localización de la raíz
inicial con el gráfico.
Para resolver un sistema de ecuaciones no lineales existe un comando en MatLab llamado fsolve. Al igual
que fzero, este comando necesita de una aproximación inicial, que ya no será tan fácil de visualizar
gráficamente puesto que ya la solución X no es un número, sino un vector de n componentes, según las
variables que el sistema tenga. Este resuelve el sistema usando el método de mínimos cuadrados
El comando básicamente funciona de la siguiente manera:
X=fsolve(‘F’,X0)
Donde
y − x2 = 0
x2 + y 2 = 4
La solución puede obtenerse fácilmente debido a que sólo basta despejar una variable en función de la
otra. La solución se hará usando el comando fsolve.
Si se desea ingresar una función como archivo, se usa el concepto de matrices. Cada función se ubica en
una columna como sigue:
function F=experimento(x)
F=[x(2)-x(1).^2;x(1).^2+x(2).^2-4]
Como se ve, la primera función se ubica en la primera columna de la matriz y en la segunda se ubica la
otra. En este caso, x es un vector de dos componentes, que en su primer elemento tiene la aproximación
para x, y en la segunda para la variable y, pues así fueron definidas las incógnitas.
Luego, se usa el comando fsolve de la siguiente manera (puede ser en pantalla o en un archivo diferente):
>>X=fsolve(‘experimento’,X0)
X0=[1.41,1.41]
La respuesta corresponde a:
X=[1.2496 1.5616];
>>F=inline('[x(2)-x(1)^2;x(1)^2+x(2)^2-4]')
>>X= fsolve(F,[1.41,1.41], optimset('fsolve'))
Optimization terminated successfully:
First-order optimality is less than options.TolFun.
X=[1.2496 1.5616];
function F=Lpq2(x)
K0=1.04;
K1=0.48;
K2=0.45;
AGV1=250;
AGV2=500;
F1=K1/K0-(1-AGV1/x(1))^x(2);
F2=K2/K0-(1-AGV2/x(1))^x(2);
F=[F1;F2];
Luego, ejecutar fsolve como se indicó antes. En este caso, la solución inicial se encontró usando
parámetros reportados en bibliografía para sistemas similares.
X0=[1000;0.41];
X=fsolve(‘lpq2’,X0)
El programa que se presentará recibe como parámetros el intervalo donde se desea conocer la solución, o
un intervalo donde haya una sola raíz y la tolerancia deseada para la solución. Lo que hace el programa es
evaluar la función en cada uno de los extremos del intervalo y ver si hay cambio de signo. Si no lo hay, el
intervalo no es adecuado, puesto que no tiene una raíz. Luego, verifica si el producto de la evaluación de
las funciones se anula en cero. Si lo hace, es porque ya ha encontrado una raíz y el programa termina. De
lo contrario, parte el intervalo por la mitad y sigue buscando de la misma manera anterior.
33 Apun te d e Cá lcu lo Numérico
function raiz=bisec(funct,a,b,tol)
fa=feval(funct,a)
fb=feval(funct,b)
if (fa*fb>0)
error('la función tiene el mismo signo en los extremos')
end
while (abs(b-a)>tol)
if (fa*fb==0)
if (fa==0)
raiz=a
else
raiz=b
end
else
raiz=(a+b)/2
fraiz=feval(funct,raiz)
if (fa*fb>0)
a=raiz
fa=fraiz
else
b=raiz
fb=fraiz
end
end
end
Ejercicio propuesto: Bajo las mismas condiciones, verificar los resultados del ejemplo 1 usando el
programa anterior.
El algoritmo del método de Newton Rhapson se obtiene de las sucesivas aproximaciones usando la
ecuación de la recta tangente a la curva en los puntos de aproximación. Este resulta en:
f ( x)
x k +1 = x k −
f '( x)
Para este caso, el método requiere de una aproximación inicial de la raíz, que debe ser suficientemente
buena debido a que este método es muy sensible a dicha aproximación, la evaluación de la función en el
punto y del conocimiento de la derivada de la función. De él, se ve que el algoritmo falla si la derivada de
la función se anula, por lo que este es un requisito para que el algoritmo funcione. Si no se tiene certeza de
este hecho, es necesario proteger al programa de situaciones como esta. Esto se ve en la línea de error
implementada en el programa.
34 Apun te d e Cá lcu lo Numérico
El programa, además de recibir la función, debe recibir la función derivada y el número máximo de
iteraciones. Lo que hace es evaluar la función, la derivada y calcular el algoritmo. El criterio de detención
usado es la variable corr. Esto porque:
f ( x)
corr = = x k − x k +1
f '( x)
El criterio de detención necesita el valor absoluto del miembro derecho, así que da lo mismo en que orden
se reste. Recordar que el criterio de parada usado es: x k − x k +1
function raiz=newton(f,Df,x0,tol,maxit)
k=0;
raiz=x0;
corr=tol+1;
while ((k<maxit) & (abs(corr))>tol)
k=k+1;
xk=raiz;
fxk=feval(f,xk);
Dfxk=feval(Df,xk);
if (Dfxk==0)
error('La derivada de la funcion se anula')
end
corr=fxk/Dfxk;
raiz=xk-corr;
end
if (abs(corr)>tol)
error('Se excedio el numero maximo de iteraciones')
end
El algoritmo es básicamente el mismo, sólo que ahora los x’s son vectores, al igual que la función y la
derivada ya no es un número, sino que corresponde a la matriz jacobiana de la función compuesta. A
modo de repaso, la matriz jacobiana se forma como:
⎡ f1x f1 y f1m ⎤
⎢f f2 y f 2 m ⎥⎥
⎢ 2x
⎢ ⎥
J =⎢ ⎥
⎢ ⎥
⎢ ⎥
⎢ ⎥
⎢⎣ f nx f ny f nm ⎥⎦
fij : La derivada de la ecuación i que conforma el sistema con respecto a la variable j de la cual esta
ecuación es dependiente.
35 Apun te d e Cá lcu lo Numérico
Ahora, el algoritmo falla cuando el determinante de la matriz es nula, es decir, la matriz no es invertible.
Como criterio de detención usa la variable corr y el argumento es el mismo que el usado para una
variable, sólo que ahora ya no se necesita el valor absoluto, sino que la norma, puesto que el sistema es
vectorial.
function raiz=newton2(f,Df,x0,tol,maxit)
k=0;
raiz=x0;
corr=tol+1;
while ((k<=maxit) & (norm(corr,inf)>tol))
k=k+1;
xk=raiz;
fxk=feval(f,xk);
Dfxk=feval(Df,xk);
if norm((Dfxk)<length(Dfxk))
error('La diferencial de la funcion es singular')
end
corr=fxk/Dfxk;
raiz=xk-corr;
end
if (norm(corr,int)>tol)
error('Se excedio el numero maximo de iteraciones')
end
Comentario:
- La jacobiana se ingresa al MatLab de la misma forma que una función vectorial, pero sólo que
para un sistema de 2 ecuaciones, ya se tendría una jacobiana de 2*2. (más claro con un ejemplo).
Ejemplo 6.5: Uso del programa Newton Rhapson para sistemas de varias variables
Sea el sistema:
x 2 + xy + y 2 = 1
y = x2
⎡ x 2 + xy + y 2 − 1⎤
F =⎢ ⎥
⎣ y − x2 ⎦
Para ingresar la función se utiliza el comando inline. Notar que todas las funciones deben ingresarse de la
forma f ( x, y ) = 0 . La función F es una función vectorial que se ingresa como un vector de 2*1.
f = Inline function:
f(x) = [x(1).^2+x(1)*x(2)+x(2).^2-1 ; x(2)-x(1).^2]
36 Apun te d e Cá lcu lo Numérico
⎡2x + y 2 y + x⎤
J = Df = ⎢
⎣ −2 x 1 ⎥⎦
Df = Inline function:
Df(x) = [2*x(1)+x(2) x(1)+2*x(2) ; -2*x(1) 1]
Luego se ingresan los parámetros requeridos para ejecutar el programa. Para encontrar una aproximación
inicial, a veces se debe tratar algebraicamente la solución. Por ejemplo, para este caso, reemplazando la
ecuación 2 en 1, se tiene un polinomio en x que puede ser resuelto para encontrar la solución inicial, que
resulta ser igual a la solución inicial en x. En este caso al parecer no tendría asunto, porque con esto ya se
tendría la solución. El punto es que no siempre se tienen aproximaciones para soluciones y a veces se
recurre a valores de bibliografía o un promedio entre dos valores donde se sabe que hay una solución.
>> tol=1e-12;
>> maxit=10;
>> x0=[-1:1];
>> raiz=newton2(f,Df,xo,tol,maxit)
>> P = x 2 + x 3 + x 4 − 1(= 0 )
>>roots(P)
37 Apun te d e Cá lcu lo Numérico
Tema 7
Ecuaciones Diferenciales Ordinarias.
Un problema stiff es análogo al concepto de condicionamiento de una matriz, sólo que ahora una pequeña
perturbación en la condición inicial del sistema puede alterar la solución de la ecuación diferencial.
Considere el PVI:
y’(x,y)=C (x,y)
y(0)=1
Si la solución del PVI se perturba en δ=0.01 el problema no será stiff, si la solución no sufre mayores
cambios. Si ante esta perturbación, el sistema sufre cambios notables (reflejados en su estabilidad) el
problema es stiff.
Independiente si la situación es stiff o no stiff, los comandos ode tienen la misma sintaxis, ésta es:
Solución función
>>[t,y]=ode45(‘t’,[t0 tf],[y0],options)
Intervalo de
Rango donde se solución Cond. Inicial
calcula la solución
>>options =odeset(‘reltol’1e-6,’abstol’,1e-8)
Los valores pueden cambiarse a los deseados. Este comando tiene más opciones que pueden ser
cambiadas.
Estos métodos son en general de paso variable, lo cual hace que la solución se conozca en puntos a lo
mejor no deseados. Si se quiere conocer la solución en ciertos puntos del intervalo, se puede definir un
38 Apun te d e Cá lcu lo Numérico
vector llamado tspan que contiene los puntos deseados, para luego usarlo en lugar del intervalo [t0 tf] en
el comando ode.
Este caso se resuelve mediante la aflicción directa del comando ode. La secuencia de paso se ilustra con el
siguiente ejemplo.
Considerar el PVI:
y’(t)=y(t), t∈ [0 1.5]
y(0)=1
function z=f(t,y)
z =y
En este caso, la variable z es lo que devuelve la función y se ingresa t, que es la variable independiente e y,
que es la variable representada en la EDO.
>> options=odeset('abstol',1e-6,'reltol',1e-4);
>> tspan=0:0.1:1.5;
>> [t,y]=ode45('f',tspan,1,options);
>> error=exp(t)-y
error =
1.0e-006 *
0
-0.0003
-0.0248
-0.0448
-0.0076
-0.0415
-0.0694
-0.0200
-0.0669
-0.1056
-0.0402
-0.1048
-0.1586
-0.0721
-0.1612
-0.0989
x' = y x(0) = 1
y ' = −x x(1) = 0
Es necesario modificar las ecuaciones para que sean de primer orden; esto se hace con un cambio de
variables:
Bajo el mismo principio que rige la formación de funciones vectoriales, el sistema puede formularse
matricialmente de la forma:
Con ello, el archivo generado es un vector de 2*1, que contiene las dos ecuaciones diferenciales que deben
resolverse simultáneamente, para luego aplicar el comando ode.
z=[y(2);-y(1)]; 0.6
0.4
0.2
-0.2
>> [t,y]=ode45('F',[0 2*pi],[1;0]);
>> plot(y(:,1),y(:,2)) -0.4
-0.6
-0.8
-1
-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1
m ⋅ u ''+ b ⋅ u '+ k ⋅ u = f
U ( 0 ) = u0
u ' ( 0 ) = v0
Este caso es el más complejo, pues se debe reducir a un sistema de ecuaciones cuyas componentes sean
todas de primer orden, para luego ingresarlas como sistema (caso 2) y resolver. Para ello, se debe realizar
el cambio de variables visto en el curso de EDO y repasado aquí, cuya base es despejar la ecuación en
función de la variable que tenga el mayor orden de la ecuación.
Sean:
u = y (1) ⇒ y (1) ' = u ' = y (2)
y (2) ' = y (1) '' = u '' = y (3)
u (0 ) = 1
v(0 ) = 0
f − k ⋅ u − b ⋅ u'
u' ' =
m
0.8
0.6
0.4
0.2
-0.2
-0.4
-0.6
-0.8
-1
0 10 20 30 40 50 60
Caso 2: f ( t ) = cos ( t )
0.15
function z=Flb(t,y)
m=1.2; 0.1
b=0.3;
0.05
k=15;
z=[y(2);(cos(t)-k*(y(1))-b*y(2))/m]; 0
-0.05
-0.1
-0.2
0 10 20 30 40 50 60
k
Caso 3: f ( t ) = cos ( w ⋅ t ) con w =
m
function z=Flc(t,y)
m=1.2;
b=0.3;
k=15;
om=sqrt(k/m)
z=[y(2);(cos(om*t)-k*(y(1))-b*y(2))/m];
function z=f3(t,y)
alfa=1000;
z=alfa*(y-sin(t))+cos(t);
Luego, se ingresa la solución del PVI (que es conocida) y se ejecuta el comando ode45. Para este caso, el
largo del vector es 1229 y con un error de 0,012. Recordar que Y es un vector columna que se compara
con la solución evaluada en todos los pasos. Como es un vector, se usa la norma.
exact=inline('exp(-1000*t)+sin(t)');
options=odeset('abstol',1e-3);
[t,y]=ode45('f3',[0 1],1,options);
plot(t,y,'+-')
error=norm(exact(t)-y,inf)
length(t)
Luego, el proceso se repite para el comando ode15s. En este caso el error es de 0,011 y con un largo de
40.
[t,y]=ode15s('f3',[0 1],1,options);
plot(t,y,'+-')
error=norm(exact(t)-y,inf)
length(t)
Lo anterior prueba que el ode15s es bastante más eficiente en la resolución del problema stiff, pues usa
menos pasos. El error no es tan relevante, pues cambia muy poco, manteniéndose en la tolerancia deseada.
43 Apun te d e Cá lcu lo Numérico
Ejercicios Resueltos
Temas 7 y 8
Ejercicio 1
Resolver usando el método de Newton Rhapson el sistema de ecuaciones no lineales
⎡ y = e− x ⎤
⎢ y ⎥
⎣x = e ⎦
Solución
Primero, reconocer la función a valor vectorial y la jacobiana del problema, que en este caso son::
⎡ y − e− x ⎤ ⎡e− x 1 ⎤
F =⎢ y ⎥
J =⎢ ⎥
⎣ x−e ⎦ ⎣1 −e y ⎦
Luego, se procede a ingresar las funciones al MatLab como ya se indicó. Notar que las funciones están de
la forma f(x,y)=0
>>G=inline(‘[x(2)-exp(-x(1));x(1)-exp(x(2))]’)
Paso 2 : Encontrar raíz aproximada (en este caso es posible hacerlo tratando algebraicamente la
función)
ln ( x ) = y ⇒ ln ( x ) − e − x
>>f=inline(‘log(x)-exp(-x)’);
>>x=-2:0.01:2;
>>plot(x,feval(f,x))
>>raiz=newton(G,DG,x0,tol,maxit)
Comentario
Este trabajo puede hacerse tanto en la pantalla como en un archivo de texto, que para los efectos es más
fácil manejarlo como rutero.
44 Apun te d e Cá lcu lo Numérico
Ejercicio 2
2
y = ex− x
Calcular el área encerrada por
( )
y = tan −1 x 2
Paso 1 : Graficar para encontrar una solución inicial. Es necesario darse un intervalo que es
ARBITRARIO.
>>x=-5:0.01:5;
>>plot(x,exp(x-x.^2),x,atan(x.^2))
De la intersección de las 2 curvas puede verse los puntos donde ambas ecuaciones se
intersectan.
>>f0=inline(‘exp(x-x.^2)-atan(x.^2)’;
La función objetivo está pensada en la idea de que el área será la función “grande” menos la
“chica” (cálculo 1-2)
>>a=fzero(f0,0.5)
>>b=fzero(f0,1)
Paso 4 : Integrar
>>I=quad(f0,a,b)
Ejercicio 3
La ecuación de Blasius
Cambio de variables
f = y (1)
f ' = y (1)' = y (2)
f ' ' = y (1)' ' = y (2 )' = y (3)
f ⋅ f '' y (1) ⋅ y (3)
f '''= − → y (3)' = −
2 2
Function F=edo(t,y)
F=[y(2); y(3);(-y(1)+y(3))/2];
Paso 2 : ODE
>>[t,y]=ode45(‘F’,[0 10],[0;0;0.1])
>>plot(t,y(:,2))
function z=blasius(x)
[t,y]=ode45(‘F’,[0 10],[0;0;x]);
z=y(length(t),2)-1;
>>raiz=fzero(‘blasius’,0.3)
c) Para resolver este caso basta acoplar la ecuación diferencial que genera el momento de la función. Ésta
se acopla en el archivo ingresado antes, con ello el sistema a resolver es:
function Z=p4c(t,y)
Z=[y(2); y(3);(-y(1)+y(3))/2;y(2)*(1-y(2))];
>>[t,y]=ode45(‘p4c’,[0 0.5],[0;0;0.3320;0])
>>mom=y(length(t),4)
Ejercicio 4
Perfil de temperatura en una aleta rectangular.
En una aleta triangular de un radiador, la distribución de la temperatura T se rige por la ecuación
diferencial:
d 2T h
− ⋅ (T − Ta ) = 0
dx 2 k
Donde:
Ta : Temperatura del aire (de 70 [F])
H : Coeficiente de transferencia de calor entre la aleta y el aire. (2.5 [Btu/(hr*ft2*F)])
K : Conductividad térmica de la aleta (212 Btu/(hr*ft2*F)])
dT
Para x = 3 [ft] calcular la temperatura T, sabiendo que a x = 1[ft], T = 179 [F] y = 20 [ F / ft ] .
dx
Usar cualquier método visto en clases.
∂ 2T h
− (T − Ta ) = 0 h
∂x 2 k
70 °F
h = 2.5 Btu h⋅ ft 2 ⋅° F
k = 212 Btu h⋅ ft 2 ⋅° F
Ta = 70° F
k
x = 3 ft
T (1) = 179° F
∂T
= 20 ° F ft x=1 x=3
∂x x =1
Paso 1
T = y (1)
T ' = y ' (1) = y (2)
Paso 2: Programar
function z=p1((t,y)
Ta=70;
h=2.5;
k=212;
z=[y(2);h/k*(y(1)-Ta)];
T=
221.8961
Ejercicio 5
Resorte acoplado resuelto mediante el método de Adams Moulton.
Considere el problema mecánico de 2 masas m1 y m2 interconectadas mediante un sistema de resortes
amortiguados como lo indica la figura.
El movimiento de las dos masas está modelado por el siguiente sistema de ecuaciones:
Re escriba el PVI como un sistema de ecuaciones de 4x4. Usando el método implícito de Adams Moulton
de orden 1(Euler implícito), escriba el sistema a programar.
Haga un programa en MatLab que resuelva la parte anterior.
Para un paso h=0.1, m1=1, m2=2, c1=2, c2=3, k1=10, k2=15, evalúe: x1(2) y x2(4).
48 Apun te d e Cá lcu lo Numérico
y(1) = x1 y (3 ) = x2
• •
y(2 ) = x1 y(4 ) = x2
• •
y(1) = y(2 )
1
[− c1 y(2 ) − k1 y(1) − c2 (y(2 ) − y(4 ) ) − k2 (y(1) − y(3) )]
•
y( 2 ) =
m
•
y(3 ) = y(4 )
y( 4 ) =
1
m
[− c2 (y(4 ) − y(3) ) − k2 (y(3) − y(1) )]
y (1) = 2 y (3) = 1
y (2 ) = 0 y (4 ) = 0
b)
⎡ 0 1 0 0 ⎤
⎢ ⎥
⎢ h ( k1 + k 2 ) h ( c1 + c 2 ) hk 2 hc 2 ⎥ ⎡ y1, i + 1 ⎤ ⎡ y1, i ⎤
− − ⎢ ⎥ ⎢ ⎥
⎢ m1 m1 m1 m1 ⎥ ⋅ ⎢ y 2, i + 1⎥ = ⎢ y 2, i ⎥
⎢ 0 0 0 1 ⎥⎥ ⎢ y 3, i + 1⎥ ⎢ y 3, i ⎥
⎢ ⎢ ⎥ ⎢ ⎥
⎢ hk 2 hc 2 hk 2 hc 2 ⎥ ⎣ y 4, i + 1⎦ ⎣ y 4, i ⎦
⎢ − − ⎥
⎣ m2 m2 m2 m2 ⎦
x = b/ A
c) Escribir programa
function f=f(t,y)
global m1,m2,c1,c2,k1,k2
f=[y(2);(-c1*y(2)-k1*y(1)-c2*(y(2)-y(4))-k2*(y(1)-y(3)))/m1;y(4);(-c2*(y(4)-y(2))-k2*(y(3)-y(1)))/m2];
49 Apun te d e Cá lcu lo Numérico
function [t,y]=ad_mult(t0,tf,h,y0)
global m1,m2,c1,c2,k1,k2
x(:,1)=y0;
t=t0:h:tf;
A=[1 -h 0 0;h*(k1+k2)/m1 1+(c1+c2)*h/m1 -h*k2/m1 -h*c2/m1; 0 0 1 -h; -hk2/m2 -h*c2/m2
h*k2/m2 1+h*c2/m2];
n=length(t);
for i=1:n-1
y(:,i+1)=A\y(:,i);
end
Ejercicio 6
Lanzamiento parabólico de una pelota de béisbol
La trayectoria de una pelota de béisbol que sale de un punto a un metro de altura se ha modelado por:
9.8
h( x) = tg (α ) ⋅ x 2 − +1
2 ⋅ v ⋅ cos 2 (α )
2
0
Solución
a=
0.1990
b) α=0,7
>> f=inline('x.^2');
>> I=quad(f,0,40)
I=
2.1333e+004
50 Apun te d e Cá lcu lo Numérico
Ejercicio 7: Problema 8
Intersección de raíces.
Se desea encontrar TODOS los puntos de intersección de las curvas:
x2
y = 2 ( x − 0.9 ) − 1
2
y = 1− e
4
La mejor forma para hacerlo es despejar la variable y para después resolver una ecuación no lineal en x.
Escriba un programa en MatLab que resuelva el problema.
Indique el número de puntos de intersección en R y todos los puntos de intersección encontrados.
Solución
>> f=inline('sqrt(1-(x.^2)/4-2.*(x+0.9).^2+1)');
>> plot(x,feval(f,x))
>> x1=fzero(f,raiz1)
>> x1=fzero(f,raiz2)
diego.seiltgens@vtr.net roverdug@udec.cl