s2Eva2025PAOII_T1 Trayectoria avión de papel

Ejercicio: 2Eva2025PAOII_T1 Trayectoria avión de papel

Muestras de trayectoria.

tj = [0, 0.4 , 0.8 , 1.2 , 1.6 , 2 , 2.4 , 2.8 , 3.2 ]
xj = [0, 1.3142, 2.5572, 4.0112, 5.4723, 6.818, 8.1856, 9.6158, 11.0212]
fj = [2, 2.0130, 1.6521, 1.26 , 1.0931, 0.897, 0.5822, 0.3083, 0.0934 ]

Opción: Se cambian los índices de los datos de entrada para diferenciar de los ti,xi,fi usados en el algoritmo de Lagrange.

literal a. Planteamiento

trayectoria avión de papel x,y

Con 9 muestras es posible crear un polinomio de grado 8. Sin embargo si el grado del polinomio es grande, pueden aparecer oscilaciones como en el ejercicio Interpolar - Pato en pleno vuelo.

La trayectoria según la gráfica del enunciado no presenta grandes variaciones en el intervalo. Como punto de partida se selecciona un punto en cada extremo, luego los puntos necesarios adicionales para un polinomio seleccionado de grado menor a 8.

Para un polinomio de grado 3, con 4 muestras, se incluyen los extremos y dos puntos intermedios, por ejemplo:

xi = [0, 2.5572, 8.1856, 11.0212]
fi = [2, 1.6521, 0.5822,  0.0934 ]

Se considera opcional describir la trayectoria de cada componente respecto a tiempo: x vs t, y vs t. Revisar conceptos básicos de cinemática.

literal b.

Usando el método de Lagrange con los puntos seleccionados

L_0 = \frac{(x-2.5572)(x-8.1856)(x-11.0212)}{(0-2.5572)(0-8.1856)(0-11.0212)} L_1 = \frac{(x-0)(x-8.1856)(x-11.0212)}{(2.5572-0)(2.5572-8.1856)(2.5572-11.0212)} L_2 = \frac{(x-0)(x-2.5572)(x-11.0212)}{(8.1856-0)(8.1856-2.5572)(8.1856-11.0212)} L_3 = \frac{(x-0)(x-2.5572)(x-8.1856)}{(11.0212-0)(11.0212-2.5572)(11.0212-8.1856)} p(x) = 2 L_0 +1.6521 L_1 +0.5822 L_2 + 0.0934 L_3

polinomio simplificado con el algoritmo, truncando a 4 dígitos cada coeficiente se obtiene:

p(x) = 0.0007888 x3 - 0.01507 x2 - 0.1026 x + 2.0

literal c. resultados con algoritmo

    valores de fi:  [2.     1.6521 0.5822 0.0934]
divisores en L[i]:  [-230.69814251  121.82188208 -130.6412841   264.51451339]

Polinomio de Lagrange, expresiones
0.013561602987979*x*(x - 11.0212)*(x - 8.1856) +
0.000353099717678867*x*(x - 8.1856)*(x - 2.5572) +
-0.00866933724855683*(x - 11.0212)*(x - 8.1856)*(x - 2.5572) +
-0.00445647793516493*x*(x - 11.0212)*(x - 2.5572)

Polinomio de Lagrange: 
0.000788887521936148*x**3 - 0.015076980044162*x**2 - 0.102651135756033*x + 2.0

                      3                      2                            
0.000788887521936148⋅x  - 0.015076980044162⋅x  - 0.102651135756033⋅x + 2.0
trayectoria avión de papel ejemplo simple

otro ejemplo, tratando de incorporar el ángulo de lanzamiento se usa el punto cercano al punto inicial.

trayectoria de avión de papel ejemplo grado 3

Con la gráfica se observa el error del polinomio con los puntos no considerados.

literal d.

El error de un punto se puede calcular como al diferencia entre el polinomio y la muestra en un punto no usado para generar el polinomio, por ejemplo usando índice 1 de la tabla:

>>> px(xj[1])-fj[1]
-0.1721532974199469

La cota sería el error mas grande, según lo desarrollado con el polinomio en cada caso. Queda como tarea revisar su propuesta de solución.

Algoritmo en Python

# 2Eva2025PAOII_T1 Trayectoria avión de papel
# polinomio de interpolación
import numpy as np
import sympy as sym
import matplotlib.pyplot as plt

# INGRESO
tj = [0, 0.4   , 0.8   , 1.2   , 1.6   , 2    , 2.4   , 2.8   , 3.2    ]
xj = [0, 1.3142, 2.5572, 4.0112, 5.4723, 6.818, 8.1856, 9.6158, 11.0212]
fj = [2, 2.0130, 1.6521, 1.26  , 1.0931, 0.897, 0.5822, 0.3083, 0.0934 ]

xi = [0, 2.5572, 8.1856, 11.0212]
fi = [2, 1.6521,  0.5822, 0.0934 ]

# PROCEDIMIENTO
# Vectores como arreglo, numeros reales
xi = np.array(xi,dtype=float)
fi = np.array(fi,dtype=float)
n = len(xi)

# Polinomio de Lagrange
x = sym.Symbol('x')
polinomio = 0*x   # sym.S.Zero en Sympy
divisorL = np.zeros(n, dtype = float)
for i in range(0,n,1):
    
    # Termino de Lagrange
    numerador = 1
    denominador = 1
    for j  in range(0,n,1):
        if (j!=i):
            numerador = numerador*(x-xi[j])
            denominador = denominador*(xi[i]-xi[j])
    terminoLi = numerador/denominador

    polinomio = polinomio + terminoLi*fi[i]
    divisorL[i] = denominador

polisimple = polinomio.expand() # simplifica los (x-xi)
px = sym.lambdify(x,polisimple) # evaluación numérica

# SALIDA
print('    valores de fi: ',fi)
print('divisores en L[i]: ',divisorL)
print()
print('Polinomio de Lagrange, expresiones')
#print(polinomio)
terminos = sym.Add.make_args(polinomio)
n_term = len(terminos)
for i in range(0,n_term,1):
    if i<(n_term-1):
        print(terminos[i],'+')
    else:
        print(terminos[i])
print()
print('Polinomio de Lagrange: ')
print(polisimple)
print()
sym.pprint(polisimple)

# Gráfica --------------
import matplotlib.pyplot as plt
muestras = 51   # resolución gráfica

a = np.min(xi)  # intervalo [a,b]
b = np.max(xi)
xk = np.linspace(a,b,muestras)
yk = px(xk)

plt.plot(xj,fj,'o', label = '[xj,yj]')
plt.plot(xi,fi,'o', label = '[xi,yi]')
plt.plot(xk,yk, label = 'p(x)')
plt.legend()
plt.xlabel('xi')
plt.ylabel('yi')
plt.title('Interpolación Lagrange')
plt.grid()
plt.show()

Ejemplos - Ejercicios resueltos de Métodos Numéricos