Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

Interpolation basis

Project: Interpolation
Views: 887
1
import src.lagrange as lg
2
from sympy import symbols,diff,Matrix,lambdify,latex
3
import numpy as np
4
from numpy import linspace,array
5
import matplotlib.pyplot as plt
6
from src.dbg import dbg
7
from pandas import DataFrame
8
9
class SplineParab():
10
def __init__(self):
11
self.x=symbols('x')
12
self.points=[]
13
self.y=[]
14
self.polinoms={}
15
self.Lagrange=lg.Lagrange()
16
self.n=0
17
self.texPolinoms={}
18
self.dataFrames=[]
19
20
def showInNotebook(self):
21
self.dataFrames=[]
22
for i in range(self.n):
23
#print(self.texPolinoms[(i,0)])
24
self.dataFrames.append(DataFrame([self.texPolinoms[(i,0)]],columns=self.texPolinoms[(i,1)]))
25
#self.plot(i)
26
27
def plot(self,i=0):
28
'''
29
i for plot
30
p[i] in points x[i],x[i+1]
31
g in points x[i+1],(x[i+1]+x[i+2])/2.
32
h in points (x[i+1]+x[i+2])/2.,x[i+2]
33
p[i+1] in points x[i+2],x[i+3]
34
'''
35
a0,a1,a2,a3=self.polinoms[(i,1)]
36
p0,g,h,p1=self.polinoms[(i,0)]
37
a=array(self.points)
38
y=array(self.y)
39
plt.plot(a,y,a0,p0(a0),a1,g(a1),a2,h(a2),a3,p1(a3))
40
plt.legend(('p0(x)','g(x)','h(x)','p1(x)'),loc='upper left')
41
plt.show()
42
43
def splineParab(self,points=[0,1,2,3,4],y=[0,0,1,0,0],f='sin(x)'):
44
'''
45
DESCRIPTION:
46
this function interpolate y use parabol splines
47
f for case of ...
48
49
50
TESTs:
51
d=sp.splineParab(points=[0,1,2,3,4],y=[0,0,1,0,0])
52
a0,a1,a2,a3=d[(0,1)]
53
p0,g,h,p1=d[(0,0)]
54
plt.plot(a0,p0(a0),a1,g(a1),a2,h(a2),a3,p1(a3))
55
'''
56
self.points=points
57
self.y=y
58
x=self.x
59
self.polinoms={}
60
self.texPolinoms={}
61
self.n=len(points[:-3])
62
for i in range(self.n):
63
localPolinoms=[]
64
localPoints=[]
65
p0=self.Lagrange.lagrangeInterp(points=[points[i],points[i+1],points[i+2]],func=f,y=[y[i],y[i+1],y[i+2]])
66
p1=self.Lagrange.lagrangeInterp(points=[points[i+1],points[i+2],points[i+3]],func=f,y=[y[i+1],y[i+2],y[i+3]])
67
localPolinoms.append(p0)
68
69
xHalf=(points[i+1]+points[i+2])/2.
70
localPolinoms.extend(self.findParabs([points[i+1],xHalf,points[i+2]],[p0,p1]))
71
localPolinoms.append(p1)
72
73
localPoints.append(linspace(points[i],points[i+1],10))
74
localPoints.append(linspace(points[i+1],xHalf,10))
75
localPoints.append(linspace(xHalf,points[i+2],10))
76
localPoints.append(linspace(points[i+2],points[i+3],10))
77
78
self.polinoms[(i,0)]=[lambdify(x,p,"numpy") for p in localPolinoms]
79
self.polinoms[(i,1)]=localPoints
80
self.texPolinoms[(i,0)]=["$"+latex(p)+"$" for p in localPolinoms]
81
self.texPolinoms[(i,1)]=[str([points[i],points[i+1]]),str([points[i+1],xHalf]),str([xHalf,points[i+2]]),str([points[i+2],points[i+3]])]
82
83
#print(polinoms)
84
return(self.polinoms)
85
86
def findParabs(self,listX,listP):
87
'''
88
DESCRIPTION:
89
find parabols equations g,h in points listX
90
from that restrictions:
91
g(x0)=p0(x0)
92
g'(x0)=p0'(x0)
93
h(x1)=p1(x1)
94
h'(x1)=p1'(x1)
95
g(xHalf)=h(xHalf)
96
g'(xHalf)=h'(xHalf)
97
'''
98
x=self.x
99
x0=listX[0]
100
xHalf=listX[1]
101
x1=listX[2]
102
p0=listP[0]
103
p1=listP[1]
104
105
#x=symbols('x')
106
a0=float(p0.subs(x,x0))
107
a1=float(p1.subs(x,x1))
108
b0=float((diff(p0,x)).subs(x,x0))
109
b1=float((diff(p1,x)).subs(x,x1))
110
dbg(**{"findParabs|part1":(a0,a1,b0,b1)})
111
C=Matrix([[(xHalf-x0)**2,-(xHalf-x1)**2],[(xHalf-x0),-(xHalf-x1)]])
112
#print("c=%s"%(C))
113
b=Matrix([a1-a0+b1*(xHalf-x1)-b0*(xHalf-x0),(b1-b0)/2.])
114
115
invC=C**-1
116
117
c0,c1=invC*b
118
dbg(**{"findParabs|part2":(b,invC,p0,p1,c0,c1)})
119
120
g=a0+b0*(x-x0)+c0*(x-x0)**2
121
h=a1+b1*(x-x1)+c1*(x-x1)**2
122
return([g,h])
123
124