Ejercicio: 1Eva_IT2010_T2_MN Uso de televisores
literal a
El enunciado indica encontrar el máximo y luego el mínimo, por lo que la curva bajo análisis es la derivada de la función dp(x)/dx.
Adicionalmente, para encontrar los puntos se requiere usar el método de Newton-Raphson que corresponden a las raíces de dp(x)/dx. La función bajo análisis ahora es la derivada y para el método se su la derivada: d2p(x)/dx2.
Al usar el computador para las fórmulas, se usa la forma simbólica de la función p(x), para obtener dpx y d2px.
primera derivada:
-3.13469387755102*x*exp(-8*x/7)
+ 2.74285714285714*exp(-8*x/7)
+ 13.7142857142857*exp(-24*x/7)*sin(12*x/7)
- 6.85714285714286*exp(-24*x/7)*cos(12*x/7)
segunda derivada:
3.58250728862974*x*exp(-8*x/7)
- 6.26938775510204*exp(-8*x/7)
- 35.265306122449*exp(-24*x/7)*sin(12*x/7)
+ 47.0204081632653*exp(-24*x/7)*cos(12*x/7)
La gráfica requiere la evaluación las funciones, que por simplicidad de evaluación, su formas simbólicas se convierten a su forma ‘lambda’.
Con la gráfica se verifica que la raíz de dp(x)/dx (en naranja) pasa por el máximo y mínimo de p(x) (en azul).
que se obtienen con las siguientes instrucciones en Python:
# 1ra Evaluación I Término 2010
# tema 2. encendido tv
# Tarea: aplicar el método de Newton-Raphson
# solo se muestra la función y sus derivadas 1 y 2
import numpy as np
import sympy as sym
import matplotlib.pyplot as plt
# función bajo análisis en forma simbólica
x = sym.Symbol('x')
pxs = (1/2.5)*(-10*sym.sin(12*x/7)*sym.exp(-24*x/7) \
+ (48*x/7)*sym.exp(-8*x/7)+0.8)
# derivadas
dpxs = pxs.diff(x,1)
d2pxs = pxs.diff(x,2)
d2pxs = sym.expand(d2pxs)
# SALIDA
print('primera derivada: ')
print(dpxs)
print('segunda derivada: ')
print(d2pxs)
# conversion a lambda
pxn = sym.utilities.lambdify(x,pxs, 'numpy')
dpxn = sym.utilities.lambdify(x,dpxs, 'numpy')
d2pxn = sym.utilities.lambdify(x,d2pxs, 'numpy')
# observar gráfica
a = 0
b = 4
muestras = 51
tolera = 0.0001
xi = np.linspace(a,b, muestras)
pxi = pxn(xi)
dpxi = dpxn(xi)
d2pxi = d2pxn(xi)
# Gráfica
plt.plot(xi,pxi, label = 'pxi')
plt.plot(xi,dpxi, label = 'dpxi')
plt.plot(xi,d2pxi, label = 'd2pxi')
plt.axhline(0)
plt.legend()
plt.show()
literal b
Usando el método de Newton-Raphson a partir de la primera y segunda derivada según lo planteado, usando x0=0,se tiene:
f(x) = -3.13469387755102 x e^{(-8 x/7)}
+2.74285714285714 e^{(-8 x/7)}
+ 13.7142857142857 e^{(-24 x/7)} \sin\Big(\frac{12x}{7}\Big)
- 6.85714285714286 e^{(-24x/7)} \cos\Big(\frac{12x}{7}\Big)
f'(x) = 3.58250728862974 x e^{(- 8 x/7)}
- 6.26938775510204 e^{(- 8 x/7)}
- 35.265306122449 e^{(-24x/7)} \sin \Big(\frac{12x}{7}\Big)
+ 47.0204081632653 e^{(-24x/7)} \cos\Big(\frac{12x}{7}\Big)
itera = 0, x0 = 0
f(0) = -3.13469387755102 (0) e^{(-8 (0)/7)}
+2.74285714285714 e^{(-8 (0)/7)}
+ 13.7142857142857 e^{(-24 (0)/7)} \sin\Big(\frac{12(0)}{7}\Big)
- 6.85714285714286 e^{(-24(0)/7)} \cos\Big(\frac{12(0)}{7}\Big) = -4.1143
f'(0) = 3.58250728862974 (0) e^{(- 8 (0)/7)}
- 6.26938775510204 e^{(- 8(0)/7)}
- 35.265306122449 e^{(-24(0)/7)} \sin \Big(\frac{12(0)}{7}\Big)
+ 47.0204081632653 e^{(-24(0)/7)} \cos\Big(\frac{12(0)}{7}\Big) = 40.751
x_1 = 0 - \frac{-4.1143}{40.751} =0.101
error = | 0.101-0 |=0.101
itera = 1
f(0.101) = -3.13469387755102 (0.101) e^{(-8 (0.101)/7)}
+2.74285714285714 e^{(-8 (0.101)/7)}
+ 13.7142857142857 e^{(-24 (0.101)/7)} \sin\Big(\frac{12(0.101)}{7}\Big)
- 6.85714285714286 e^{(-24(0.101)/7)} \cos\Big(\frac{12(0.101)}{7}\Big) = -0.9456
f'(0.101) = 3.58250728862974 (0.101) e^{(- 8 (0.101)/7)}
- 6.26938775510204 e^{(- 8 (0.101)/7)}
- 35.265306122449 e^{(-24(0.101)/7)} \sin \Big(\frac{12(0.101)}{7}\Big)
+ 47.0204081632653 e^{(-24(0.101)/7)} \cos\Big(\frac{12(0.101)}{7}\Big) =23.2054
x_2 = 0.101 - \frac{-0.9456}{23.2054} =0.1417
error = | 0.1417-0.101 |=0.0407
itera = 2
f(0.1417) = -3.13469387755102 (0.1417) e^{(-8 (0.1417)/7)}
+2.74285714285714 e^{(-8 (0.1417)/7)}
+ 13.7142857142857 e^{(-24 (0.1417)/7)} \sin\Big(\frac{12(0.1417)}{7}\Big)
- 6.85714285714286 e^{(-24(0.1417)/7)} \cos\Big(\frac{12(0.1417)}{7}\Big) = -0.11005
f'(0.1417) = 3.58250728862974 (0.1417) e^{(- 8 (0.1417)/7)}
- 6.26938775510204 e^{(- 8 (0.1417)/7)}
- 35.265306122449 e^{(-24(0.1417)/7)} \sin \Big(\frac{12(0.1417)}{7}\Big)
+ 47.0204081632653 e^{(-24(0.1417)/7)} \cos\Big(\frac{12(0.1417)}{7}\Big) = 0.17957
x_3 = 0.1417 - \frac{-0.11005}{0.17957} =0.14784
error = | 0.14784- 0.1417 |=0.0061287
se observa que el error disminuye en cada iteración, por lo que el método converge.
Se continúan las operaciones con el algoritmo obteniendo:
i ['xi', 'fi', 'dfi', 'xnuevo', 'tramo']
0 [ 0. -4.1143 40.751 0.101 0.101 ]
1 [ 0.101 -0.9456 23.2054 0.1417 0.0407]
2 [ 1.4171e-01 -1.1005e-01 1.7957e+01 1.4784e-01 6.1287e-03]
3 [ 1.4784e-01 -2.1916e-03 1.7245e+01 1.4797e-01 1.2708e-04]
4 [ 1.4797e-01 -9.2531e-07 1.7231e+01 1.4797e-01 5.3701e-08]
raíz en: 0.1479664890264113
literal c
la otra raíz se encuentra con x0=1
i ['xi', 'fi', 'dfi', 'xnuevo', 'tramo']
0 [ 1. 0.3471 -2.207 1.1573 0.1573]
1 [ 1.1573 0.0539 -1.5338 1.1924 0.0352]
2 [ 1.1924 0.0024 -1.397 1.1941 0.0017]
3 [ 1.1941e+00 5.7065e-06 -1.3904e+00 1.1942e+00 4.1041e-06]
raíz en: 1.1941511721360376
Instrucciones en Python
# 1Eva_IT2010_T2_MN Uso de televisores
import numpy as np
import matplotlib.pyplot as plt
def newton_raphson(fx,dfx,xi, tolera, iteramax=100, vertabla=False, precision=4):
'''
funciónx y fxderiva en forma numérica lambda
xi es el punto inicial de búsqueda
'''
itera=0
tramo = abs(2*tolera)
if vertabla==True:
print('i', ['xi','fi','dfi', 'xnuevo', 'tramo'])
np.set_printoptions(precision)
while (tramo>=tolera and itera<iteramax):
fi = fx(xi)
dfi = dfx(xi)
xnuevo = xi - fi/dfi
tramo = abs(xnuevo-xi)
if vertabla==True:
print(itera,np.array([xi,fi,dfi,xnuevo,tramo]))
xi = xnuevo
itera = itera + 1
if itera>=iteramax:
xi = np.nan
print('itera: ',itera, 'No converge,se alcanzó el máximo de iteraciones')
return(xi)
# INGRESO
fx = lambda x: -3.13469387755102*x*np.exp(-8*x/7) \
+ 2.74285714285714*np.exp(-8*x/7) \
+ 13.7142857142857*np.exp(-24*x/7)*np.sin(12*x/7) \
- 6.85714285714286*np.exp(-24*x/7)*np.cos(12*x/7)
dfx = lambda x: (3.58250728862974*x - 6.26938775510204 \
- 35.265306122449*np.exp(-16*x/7)*np.sin(12*x/7) \
+ 47.0204081632653*np.exp(-16*x/7)*np.cos(12*x/7))*np.exp(-8*x/7)
x0 = 0.5
tolera = 0.0001
# PROCEDIMIENTO
respuesta = newton_raphson(fx,dfx,x0, tolera, vertabla=True)
# SALIDA
print('raíz en: ', respuesta)