Ejercicio: 1Eva2018TI_T1 Tanque esférico canchas deportivas

literal a
Planteamiento: Para seleccionar el rango para h=[a,b], se observa que el tanque puede estar vacío, a=0 o lleno al máximo,
b=2R = 2(3)=6, con lo que se obtiene:
h =[0.0, 6.0]
conociendo la proporción con el valor máximo, se tiene un valor inicial para h0 para las iteraciones.
Primero se calcula el volumen máximo h=2R:
V = \frac{\pi h^{2} (3R-h)}{3} Vmax = \frac{\pi}{3} (2R)^2 (3R-2R) Vmax = \frac{4\pi }{3}R^{3}= 113.09Se aproxima el valor de h suponiendo que el volumen de llenado del tanque es proporcional a la altura h. Es tan solo un criterio, no es el valor real, pero es un punto de partida. Puede seleccionar otro criterio mientras lo describa en la evaluación.
h_0 = (6)\frac{30}{113.09} = 1.59literal b
Desarrollo analítico:
Usar Newton-Raphson con tolerancia 1e-6
V = \frac{\pi h^{2} (3R-h)}{3} \frac{\pi h^{2} (3R-h)}{3} - V = 0se busca V=30, siendo R=3
f(h) = \frac{\pi h^{2} (3(3)-h)}{3} - 30 = 0 f(h) = \frac{\pi }{3}h^2 (9-h)-30 f(h) = \frac{\pi }{3}(9h^2 -h^3)-30 f'(h) = \frac{\pi }{3}(18h-3h^2)el punto siguiente de iteración es:
h_{i+1} = h_{i} -\frac{f(h)}{f'(h)}itera = 0, h= 1.59
f(1.59) = \frac{\pi }{3}(9(1.59)^2 -1.59^3)-30 = -10.3826 f'(1.59) = \frac{\pi }{3}(18(1.59)-3(1.59)^2)= 27.3234 h_{i+1} = h_{i} -\frac{f(h)}{f'(h)} h_{1} = 1.59 -\frac{-10.3826}{27.3234} =1.97Errado = | 1.97-1.59 | = 0.38
aún no se alcanza la tolerancia, se procede con una nueva iteración
itera = 1, h= 1.97
f(1.97) = \frac{\pi }{3}(9(1.97)^2 -1.97^3)-30 = -1.4298 f'(1.97) = \frac{\pi }{3}(18(1.97)-3(1.97)^2)= 33.0694 h_{2} = 1.97 -\frac{-1.4298}{33.0694} =2.0132Errado = | 2.0132 - 1.97 | = 0.0432
aún no se alcanza la tolerancia, se procede con una nueva iteración
la iteración 2 de deja como tarea
Desarrollo con algoritmo:
con lo que se realiza la tabla de iteraciones:
método de Newton-Raphson
i ['xi', 'fi', 'dfi', 'xnuevo', 'tramo']
0 [ 1.59 -10.3826 27.3234 1.97 0.38 ]
1 [ 1.97 -1.4298 33.0694 2.0132 0.0432]
2 [ 2.0132e+00 -3.4547e-01 3.3704e+01 2.0235e+00 1.0250e-02]
3 [ 2.0235e+00 -8.6687e-02 3.3854e+01 2.0260e+00 2.5606e-03]
4 [ 2.0260e+00 -2.1938e-02 3.3891e+01 2.0267e+00 6.4731e-04]
5 [ 2.0267e+00 -5.5637e-03 3.3901e+01 2.0268e+00 1.6412e-04]
6 [ 2.0268e+00 -1.4118e-03 3.3903e+01 2.0269e+00 4.1641e-05]
7 [ 2.0269e+00 -3.5827e-04 3.3904e+01 2.0269e+00 1.0567e-05]
8 [ 2.0269e+00 -9.0925e-05 3.3904e+01 2.0269e+00 2.6819e-06]
9 [ 2.0269e+00 -2.3076e-05 3.3904e+01 2.0269e+00 6.8062e-07]
raíz en: 2.0269054968263562
En valor práctico 2.026 m usando flexómetro, a menos que use medidor láser con precisión 10-6 usará más dígitos con un tanque de 6 metros de altura ganará una precisión de una gota de agua para usar en duchas o regar el césped .

c) El orden de convergencia del error observando las tres primeras iteraciones es cuadrático
Algoritmo con Python
# 1Eva2018TI_T1 Tanque esférico canchas deportivas
# Ejemplo 1 (Burden ejemplo 1 p.51/pdf.61)
import numpy as np
def newton_raphson(fx,dfx,x0, tolera, iteramax=100,
vertabla=False, precision=4):
'''fx y dfx en forma numérica lambda
xi es el punto inicial de búsqueda
si no converge hasta iteramax iteraciones
la respuesta es NaN (Not a Number)
'''
itera=0
xi = x0
tramo = abs(2*tolera)
if vertabla==True:
print('método de Newton-Raphson')
print('i', ['xi','fi','dfi', 'xnuevo', 'tramo'])
np.set_printoptions(precision)
while (tramo>=tolera):
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 h: (np.pi/3)*(9*h**2-h**3)-30
dfx = lambda h: (np.pi/3)*(18*h-h**2)
x0 = 1.59
tolera = 0.000001
# PROCEDIMIENTO
xi= newton_raphson(fx,dfx,x0, tolera, vertabla=True)
# SALIDA
print('raíz en: ', xi)
# GRAFICA
import matplotlib.pyplot as plt
a = 0
b = 3
muestras = 21
xj = np.linspace(a,b,muestras)
fj = fx(xj)
plt.plot(xj,fj, label='f(x)')
plt.plot(xi,0, 'o')
plt.axhline(0)
plt.xlabel('x')
plt.ylabel('f(x)')
plt.grid()
plt.legend()
plt.show()