Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Wuolah Free Tema 4
Wuolah Free Tema 4
Anónimo
Física Computacional
3º Grado en Física
Física Computacional
1 Tema 4: Interpolación y extrapolación.
• Generalmente los experimentos sólo proporcionan un conjunto discreto de datos ( xi , f i ) que
representan el valor de una función en un conjunto finito de argumentos { x0 , · · · , xn }.
• Si puntos adicionales son necesarios, por ejemplo para representar la función o usarla como
argumento de otra, necesitamos interpolar ese conjunto discreto de datos.
• La interpolación es por tanto necesaria para representar una función complicada por una
más simple o para poder integrarla o derivarla.
Φ( x; c0 , · · · , c M )
el problema consiste en encontar el valor de los coeficientes ci satisfaciendo que:
Φ ( x i ; c0 , · · · , c M ) = f i , con i = 0, · · · , N.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• Si M > N, nuestra función (forma funcional) tiene demasiados parámetros.
• Si M < N, en general no hay solución a el problema, por lo que uno tiene que aproximar en
vez de interpolar.
En general se suele hacer por medio del método de los mínimos cuadrados, o del χ2 .
Son los problemas de minimización que estudiaremos en el Tema 5.
N
Φ( x ) = ∑ c i Φ i ( x ),
i =0
N
Φ( x ) = ∑ c i x i ( x ),
i =0
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
Física Computacional
Banco de apuntes de la
• Splines cúbicos
N −1 3
Φ( x ) = ∑ s i ( x ) Θ ( x − x i ) Θ ( x i +1 − x ) , con si ( x ) = ∑ cij (x − xi ) j
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
i =0 j =0
n1
∑ ci x i
i =0
Φ( x ) = n2 , con n1 + n2 = N − 1
∑ di x i
i =0
N
Φ( x ) = ∑ ci e i n x ,
n =0
f (b) − f ( a)
f ( x ) ≃ pl ( x ) = f ( a) + ( x − a ),
b−a
es la interpolación líneal.
[1]: from IPython.display import Image,display
display(Image(filename="int_lin.png", width=600, height=600))
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• Una vez asumida la forma funcional de la curva, esta puede ser usada fuera del intervalo
[ a, b], es decir, puede ser extrapolada.
• Por supuesto, cuanto más lejos uno se separa del intervalo más error tendrá asociado la
extraplación.
• Para analizar cuan bien estamos describiendo la curva tanto dentro como fuera del intervalo
inicial, expandamos el valor de la función en a y b en serie Taylor.
1
f ( a) = f ( x ) + ( x − a) f ′ ( x ) + ( x − a)2 f ′′ ( x ) + O( x − a)3 ,
2
1
f (b) = f ( x ) + (b − x ) f ′ ( x ) + (b − x )2 f ′′ ( x ) + O(b − x )3 ,
2
• Introduciendo ambas expansiones en la formula de la interpolación líneal:
f ( x ) = p( x )l + ( x − a)( x − b) f ′′ ( x ) + · · ·
tomando b − a = h, el error esta por tanto acotado por
h2 ′′
ϵ< | f ( x )|.
4
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
1.1.2 4.1.2: Interpolación polinómica de grado arbitrario.
• Ya vimos en el Tema 3 que el polinomio de Lagrange
N N N x − xj
L( x, f ) = ∑ f ( x i ) li ( x ) = ∑ f ( x i ) ∏ xi − x j
,
i =1 i =1 j=1
j ̸= i
es el único polinomio de orden N − 1 que interpola (coincide con) la función f en los puntos
xi con i = 1, · · · , N.
N
ω(x) = ∏ ( x − x i ),
i =1
la base de polinomios de Lagrange puede escribirse como:
ω(x) 1 ui
li ( x ) = = ω(x) ,
x − xi ∏ N ( xi − x j ) x − xi
j=1
j ̸= i
donde
N
1
ui = ∏ ( xi − x j )
j=1
j ̸= i
son los llamados pesos bariocéntricos, que al ser independientes de x, pueden calcularse
sólo una vez.
N
ui
L( x, f ) = ω ( x ) ∑ f ( xi ) ,
i =1
x − xi
que aún involucra O( N 2 ) operaciones. Sin embargo, interpolando f(x)=1, se obtiene:
N
ui
L( x, 1) = ω ( x ) ∑ ,
i =1
x − xi
y por tanto:
N
ui
L( x, f )
∑ f ( xi ) x − xi
i =1
L( x, f ) = = ,
L( x, 1) N
ui
∑ x − xi
i =1
que permite obtener la función de interpolación con sólo N operaciones.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
Fenómeno de Runge.
• Uno puede pensar que al aumentar el grado del polinomio la precisión de la interpolación
aumenta.
• Sin embargo, no es el caso: un polinomio de grado alto involucra grandes fluctuaciones que
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
se amplifican en los extremos del intervalo.
Ejercicio 4.1: Estudiar la interpolación polinómica de la función de Runge:
1
f (x) =
1 + 25x2
en el intervalo [-1,1] usando polinomios de grado N = 10, · · · , 15.
[1]: from numpy import linspace
from numpy.polynomial import Polynomial
from matplotlib.pyplot import plot,show
def runge_function(x):
return 1/(1+25*x**2)
def runge_u(N):
xp=linspace(-1,1,N)
for i in range(N):
for j in [z for z in range(N) if z != i]:
uu[i]/=(xp[i]-xp[j])
return uu
def runge_interpol(x,uu,N):
xp=linspace(-1,1,N)
LN=0
LD=0
for i in range(N):
if (x==xp[i]):
return runge_function(xp[i])
break
LN+=runge_function(xp[i])*uu[i]/(x-xp[i])
LD+=uu[i]/(x-xp[i])
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
return LN/LD
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
x=linspace(-1,1,100)
plot(x,runge_function(x))
for k in range(10,12):
p=[runge_interpol(i,uu,k) for i in x]
plot(x,p)
xp=linspace(-1,1,k)
plot(xp,runge_function(xp),"ro")
show()
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
Que ocurre con la extrapolación?
[92]: xpoints=linspace(-1.2,1.2,100)
plot(xpoints,runge_function(xpoints))
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
x=linspace(-1.2,1.2,100)
for k in range(10,11):
p=[runge_interpol(i,k) for i in x]
plot(x,p)
show()
• Sin embargo no funciona bien en intervalos grandes (para un gran número de puntos) y un
grado alto.
– Para cada uno de los sub intervalos definidos por los puntos en los que conocemos la
función.
– Usamos un polinomio de grado bajo para interpolar esos dos puntos.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
• Es decir, representan un ajuste de la curva inicial “a trozos” (piecewise) por medio de poli-
nomios.
f ( x i +1 ) − f ( x i )
f ( x ) ≃ si ( x ) siendo si ( x ) = f ( xi ) + ( x − xi ) con x i ≤ x < x i +1 .
x i +1 − x i
• Sin embargo, el caso más habitual (y el que en general funciona mejor) es el spline cúbico:
3
f ( x ) ≃ si ( x ) siendo si ( x ) = ∑ aij (x − xi ) j con x i ≤ x < x i +1
j =0
s i ( x i +1 ) = s i +1 ( x i +1 ) , ∀i ∈ {1, N − 1},
si′ ( xi+1 ) =si′+1 ( xi+1 ), ∀i ∈ {1, N − 1},
si′′ ( xi+1 ) =si′′+1 ( xi+1 ), ∀i ∈ {1, N − 1},
(1)
3. Faltan dos grados de libertar por determinar que se suelen fijar imponiendo condi-
ciones de contorno (condiciones para el punto inicial y final):
– Condiciones naturales: s1′′ ( x1 ) = s′′n−1 ( xn ) = 0.
– Condiciones periodicas: s1′ ( x1 ) = s′n−1 ( xn ) y s1′′ ( x1 ) = s′′n−1 ( xn ).
– Valores de frontera: s1′ ( x1 ) = r1 , y s′n−1 ( xn ) = r2.
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
• Por otro lado, la ecuación de continuidad para la segunda derivada implica:
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
si′′ ( xi+1 ) = si′′ ( xi ) + 6 ai3 ( xi+1 − xi ) = si′′+1 ( xi+1 ), ⇒ 6 ai3 = ,
x i +1 − x i
y por tanto:
( x − x i )2 ( x − x )2
si′ ( x ) = si′′+1 ( xi+1 ) − si′′ ( xi ) i+1 + αi ,
2 ( x i +1 − x i ) 2 ( x i +1 − x i )
( x − x i )3 ( x − x )3
si ( x ) = si′′+1 ( xi+1 ) + si′′ ( xi ) i+1 + αi ( x − xi ) + β i ,
6 ( x i +1 − x i ) 6 ( x i +1 − x i )
(3)
1
si ( xi ) = si′′ ( xi ) ( xi+1 − x )2 + β i = f ( xi )
6
1 ′′
s i ( x i +1 ) = s i +1 ( x i +1 ) ( x i +1 − x ) 2 + α i ( x i +1 − x i ) + β i = f ( x i +1 ) ,
6
y por tanto:
1
β i = f ( xi ) − si′′ ( xi ) ( xi+1 − x )2 ,
6
f ( xi+1 ) − f ( xi ) xi+1 − xi ′′
si+1 ( xi+1 ) − si′′ ( xi ) .
αi = − (4)
x i +1 − x i 6
3
si ( x ) = ∑ aij (x − xi ) j ,
j =0
10
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
ai0 = f ( xi ),
f ( xi+1 ) − f ( xi ) xi+1 − xi ′′
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
si+1 ( xi+1 ) + 2si′′ ( xi ) ,
ai1 = −
x i +1 − x i 6
s′′ ( xi )
ai2 = i , (5)
2
s ( xi+1 ) − si′′ ( xi )
′′
ai3 = i +1 . (6)
6 ( x i +1 − x i )
• Sólo nos queda determinar el valor de las segundas derivadas de los splines si′′ ( xi ).
Cosa que podemos hacer explotando la única condición de continuidad que nos queda por
usar: si′−1 ( xi ) = si′ ( xi ).
1 f ( xi ) − f ( xi−1 ) xi − xi−1 ′′
si′−1 ( xi ) = si′′ ( xi ) ( xi − xi−1 ) + si ( xi ) − si′′−1 ( xi−1 )
−
2 x i − x i −1 6
1 f ( xi+1 ) − f ( xi ) xi+1 − xi ′′
= − si′′ ( xi ) ( xi+1 − xi ) + si+1 ( xi+1 ) − si′′ ( xi ) = si′ ( xi ),
−
2 x i +1 − x i 6
1 ′′ 1 1 f ( x i +1 ) − f ( x i ) f ( x i ) − f ( x i −1 )
s ( xi−1 ) ( xi − xi−1 ) + si′′ ( xi ) ( xi+1 − xi−1 ) + si′′+1 ( xi+1 ) ( xi+1 − xi ) = − ,
6 i −1 3 6 x i +1 − x i x i − x i −1
• Llamando:
x i +1 − x i
µi = ,
x i +1 − x i −1
x i − x i −1
νi = ,
x i +1 − x i −1
6 f ( x i +1 ) − f ( x i ) f ( x i ) − f ( x i −1 )
λi = − , (7)
x i +1 − x i −1 x i +1 − x i x i − x i −1
µ0 = 0, νn = 0, λ0 = λn = 0,
que implica escribir el sistema de ecuaciones
11
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
2 0
ν1 2 µ1
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
0 0
s′′ ( x1 )
ν2 2 µ2 1
λ1
s′′ ( x2 )
2
λ2
= (8)
.. .. .. .. ..
. . . . .
s′′ ( xn−1 )
λ n −1
n −1
νn−1 2 0 0
µ
n −1
0
2
que aprenderemos a resolver en tema 5.
Ejericio 4.2: Estudiar la interpolación por medio de splines cúbicos de la función de Runge:
1
f (x) =
1 + 25x2
en el intervalo [-1,1] usando N = 10, · · · , 15 intervalos (N + 1 puntos).
Ayuda: para resolver el sistema de ecuaciones para las derivadas segundas tener en cuenta que
el módulo linalg del páquete numpy incluye la función inv, que calcula la inversa de una matriz.
[76]: from numpy import linspace,zeros,dot
from numpy.linalg import inv
def spline_runge(x,N):
xp=linspace(-1,1,N+1)
fp=runge_function(xp)
mu=zeros([N+1],float) # matriz mu
nu=zeros([N+1],float) # matriz nu
lan=zeros([N+1],float) # matriz lan
M=zeros([N+1,N+1],float) # matriz que tenemos que invertir
s2=zeros([N+1],float) # matriz de derivadas segundas
for i in range(1,N):
mu[i]=(xp[i+1]-xp[i])/(xp[i+1]-xp[i-1])
nu[i]=(xp[i]-xp[i-1])/(xp[i+1]-xp[i-1])
lan[i]=6/(xp[i+1]-xp[i-1])*((fp[i+1]-fp[i])/
֒→(xp[i+1]-xp[i])-(fp[i]-fp[i-1])/(xp[i]-xp[i-1]))
12
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
M[i,i-1]=mu[i]
M[i,i]=2
M[i,i+1]=nu[i]
# nos falta darle valor a el primer y último elemento (en realidad no es␣
֒→ necesario)
M[0,0]=2
M[N,N]=2
s2=dot(inv(M),lan)
A0 = zeros([N],float)
A1 = zeros([N],float)
A2 = zeros([N],float)
A3 = zeros([N],float)
for i in range(N):
A0[i] = fp[i]
A1[i] = (fp[i+1]-fp[i])/
֒→(xp[i+1]-xp[i])-(xp[i+1]-xp[i])*(s2[i+1]+2*s2[i])/6
A2[i] = s2[i]/2
A3[i] = (s2[i+1]- s2[i])/(xp[i+1]-xp[i])/6
i=0
while x>xp[i+1]:
i+=1
return A0[i]+A1[i]*(x-xp[i])+A2[i]*(x-xp[i])**2+A3[i]*(x-xp[i])**3
[87]: from matplotlib.pyplot import plot,show
x=linspace(-1,1,100)
f=runge_function(x)
xp=linspace(-1,1,11)
fp=runge_function(xp)
fpol=[runge_interpol(a,11) for a in x]
13
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
fs=[spline_runge(a,10) for a in x]
plot(x,f)
plot(x,fs)
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
plot(xp,fp,"ro")
show()
plot(x,f)
plot(x,fs)
plot(xp,fp,"ro")
plot(x,fpol)
show()
14
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
1.3 4.3: Aproximaciones racionales: aproximantes de Padé
• Las aproximaciones racionales permite describir correctamente funciones con polos.
• También son mucho más estables que los polinomios de grados altos.
R M (x) ∑iM =0 r i x
i
PM/N ( x ) = = N ,
Q N (x) ∑ i =0 q i x i
donde el valor de los coeficientes ri , qi están constreñidos a satisfacer la serie de Taylor de
f ( x ) a O( x N + M+1 ), es decir:
dn f ( x ) dn PM/N ( x )
= , con n = 0, · · · N + M.
dx n x =0 dx n x =0
15
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
r0 = q0 f (0),
r1 = q0 f ′ (0) + q1 f (0)
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.
.. ..
. .
i
ri = ∑ q k f (i − k ) (0)
k =0
.. ..
. .
M
rM = ∑ q k f ( M − k ) (0)
k =0
N
0= ∑ q k f ( M +1− k ) ( 0 )
k =0
.. ..
. .
N
0= ∑ q k f ( M + N − k ) (0)
k =0
(9)
donde
x0 : r0 =0,
1
x : r1 =1,
2
x : r2 = q1 ,
1
x3 : r3 = q2 + ,
3
4 1
x : 0 = q3 + q1 ,
3
2 1
x 5 : 0 = + q2 ,
15 13
2 1
x 6 : 0 = q1 + q3 ,
15 13
(10)
1
que implican que: r0 = r2 = q1 = q3 = 0, r3 = − 15 , y q2 = − 52 .
16
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Te has descargado este apunte gracias a la publicidad. También puedes eliminarla con 1 coin.
[108]: from numpy import linspace,tan,pi
from matplotlib.pyplot import plot,show,ylim
x=linspace(0,pi,100)
plot(x,tan(x))
plot(x,(x-1/15*x**3)/(1-2/5*x**2),"ro")
ylim(-50,50)
show()
17
a64b0469ff35958ef4ab887a898bd50bdfbbe91a-5131395
Reservados todos los derechos. No se permite la explotación económica ni la transformación de esta obra. Queda permitida la impresión en su totalidad.