Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
restrepo
GitHub Repository: restrepo/ComputationalMethods
Path: blob/master/homework/Homework_2018_1_05_1032478036.ipynb
934 views
Kernel: Python 3

Tarea

a) Construir una funcion que retorne L0(x),L1(x)L_{0}(x),L_{1}(x)... para reconstruir el polinomio de lagrange

Pn(x)=L0f(x0)+L1f(x1)+...\begin{equation} P_{n}(x)=L_{0}f(x_{0})+L_{1}f(x_{1})+... \end{equation}

para los puntos (3.,8.),(10.,6.5),(21.3,3.)

b) Verificar que dicho polinomio es Pn(x)=0.005216x20.1465x+8.486\begin{equation} P_{n}(x)=-0.005216x^2 - 0.1465x + 8.486 \end{equation}

c) Evaluar L0(x0),L1f(x1),L2f(x2),Lif(xj)L_{0}(x_{0}),L_{1}f(x_{1}),L_{2}f(x_{2}),L_{i}f(x_{j}) con i distinto de j

from sympy import symbols from sympy import Poly from sympy import polys from scipy import interpolate import pandas as pd import numpy as np

a) Se ingresan los puntos, se establece el orden del polinomio y se define la función que calcula LjL_{j}

df=pd.DataFrame({ 'x':[3,10,21.3],'y':[8.,6.5,3.]}) #se crea el dataframe con las coordenadas de los puntos dados n=2 #orden del polinomio x = symbols('x') '''se define x como un símbolo y no como variable para ingresarla en la siguiente función sin que tome un valor específico''' #se define la función que calcula L_{j} para algún subíndice j def L(j): l=1 for i in range(n+1): #hasta n+1 para que incluya el valor n if i!=j : #por definición, solo se agregan términos a la productoria cuando i es diferente de j l*=polys.polytools.poly((x-df.x[i])/(df.x[j]-df.x[i])) #define la productoria usando polinomios return l

Se imprime en pantalla cada LjL_{j}

print ("L_0= {}\n\nL_1= {}\n\nL_2= {}".format(Poly(L(0).args,x).as_expr(),Poly(L(1).args,x).as_expr(),Poly(L(2).args,x).as_expr()))
L_0= 0.0078064012490242*x**2 - 0.244340359094457*x + 1.66276346604215 L_1= -0.0126422250316056*x**2 + 0.307206068268015*x - 0.807838179519596 L_2= 0.00483582378258136*x**2 - 0.0628657091735577*x + 0.145074713477441

Teniendo cada LjL_{j} se multiplican por el correspondiente f(xj)f(x_{j}) para reconstruir Pn(x)P_{n}(x)

Pn=(L(0)*df.y[0])+(L(1)*df.y[1])+(L(2)*df.y[2]) print("El polinomio de Lagrange es:\n\nPn(x)= {}".format(Poly(Pn.args,x).as_expr()))
El polinomio de Lagrange es: Pn(x)= -0.00521578136549849*x**2 - 0.146480556534234*x + 8.48638370189219

b) Se comprueba el polinomio Pn(x)P_{n}(x) obtenido con el que retorna la función interpolate.lagrange de Scipy

P=interpolate.lagrange(df.x,df.y) print(P)
2 -0.005216 x - 0.1465 x + 8.486

c) Se evaluan L0(x0),L1f(x1),L2f(x2),Lif(xj)L_{0}(x_{0}),L_{1}f(x_{1}),L_{2}f(x_{2}),L_{i}f(x_{j}) con i distinto de j

L0=[] L1=[] L2=[] ''' se imprime el valor de cada Lj evaluado en xi , asignandole el valor correspondiente a x con la función subs y redondeandolo a 3 cifras con round ''' for i in range(n+1): L0.append((round(L(0).subs({x:df.x[i]}), 3))) L1.append((round(L(1).subs({x:df.x[i]}), 3))) L2.append((round(L(2).subs({x:df.x[i]}), 3))) print('L0(x0)= {} L0(x1)= {} L0(x2)= {}'.format(L0[0],L0[1],L0[2])) print('L1(x0)= {} L1(x1)= {} L1(x2)= {}'.format(L1[0],L1[1],L1[2])) print('L2(x0)= {} L2(x1)= {} L2(x2)= {}'.format(L2[0],L2[1],L2[2]))
L0(x0)= 1.0 L0(x1)= 0.0 L0(x2)= 0.0 L1(x0)= -0.0 L1(x1)= 1.0 L1(x2)= 0.0 L2(x0)= -0.0 L2(x1)= -0.0 L2(x2)= 1.0