Logo Studenta

interporlaciondenewton

Esta es una vista previa del archivo. Inicie sesión para ver el archivo original

# Polinomio interpolación
# Diferencias Divididas de Newton
# Tarea: Verificar tamaño de vectores,
# verificar puntos equidistantes en x
class interpolaciondeNewton():
 import numpy as np
 import sympy as sym
 import matplotlib.pyplot as plt
 # INGRESO , Datos de prueba
 xcoordenadas = np.array([-1, -0.5, 0, 0.5,1])
 funcioni = np.array([-0.04, 0.14, 1, 0.14,0.04])
 # PROCEDIMIENTO
 # Tabla de Diferencias Divididas Avanzadas
 titulo = ['i ','xi ','fi ']
 niteraciones = len(xcoordenadas)
 ki = np.arange(0,niteraciones,1)
 tabla = np.concatenate(([ki],[xcoordenadas],[funcioni]),axis=0)
 tabla = np.transpose(tabla)
 # diferencias divididas vacia
 finita = np.zeros(shape=(niteraciones,niteraciones),dtype=float)
 tabla = np.concatenate((tabla,finita), axis=1)
 # Calcula tabla, inicia en columna 3
 [n,m] = np.shape(tabla)
 diagonal = n-1
 j = 3
 while (j < m):
 # Añade título para cada columna
 titulo.append('F['+str(j-2)+']')
 # cada fila de columna
 i = 0
 paso = j-2 # inicia en 1
 while (i < diagonal):
 denominador = (xcoordenadas[i+paso]-xcoordenadas[i])
 numerador = tabla[i+1,j-1]-tabla[i,j-1]
 tabla[i,j] = numerador/denominador
 i = i+1
 diagonal = diagonal - 1
 j = j+1
 # Interpolación de newton
 # caso: puntos en eje x
 puntosDivididos = tabla[0,3:]
 n = len(finita)
 # expresión del polinomio con Sympy
 x = sym.Symbol('x')
 polinomio = funcioni[0]
 for j in range(1,n,1):
 factor = puntosDivididos[j-1]
 termino = 1
 for k in range(0,j,1):
 termino = termino*(x-xcoordenadas[k])
 polinomio = polinomio + termino*factor
 # simplifica multiplicando entre (x-xi)
 polinomiosimple = polinomio.expand()
 # polinomio para evaluacion numérica
 puntox = sym.lambdify(x,polinomiosimple)
 # Puntos para la gráfica
 muestras = 101
 a = np.min(xcoordenadas)
 b = np.max(xcoordenadas)
 puntoxi = np.linspace(a,b,muestras)
 puntofi = puntox(puntoxi)
 # SALIDA
 np.set_printoptions(precision = 4)
 print('Tabla interpolación de newton')
 print([titulo])
 print(tabla)
 print('Interpolación: ')
 print(puntosDivididos)
 print('polinomio: ')
 print(polinomio)
 print('polinomio simplificado: ' )
 print(polinomiosimple)
 # Gráfica
 plt.plot(xcoordenadas,funcioni,'o', label = 'Puntos')
 plt.plot(puntoxi,puntofi, label = 'Polinomio')
 plt.legend()
 plt.xlabel('x coordenadas')
 plt.ylabel('funcion(i)')
 plt.title('Interpolación - Newton')
 plt.show()

Continuar navegando