-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathqsplines.py
124 lines (79 loc) · 1.88 KB
/
qsplines.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/env python
# encoding: utf-8
"""
qsplines.py
Created by Rafael Jegundo on 2011-05-10.
Copyright (c) 2011 SMMC. All rights reserved.
"""
import numpy as np
from random import random
def tridiagonal(a,b,c,v):
n = len(b)
for i in range(1,n-1):
m = a[i]/b[i-1]
b[i] -= m*c[i-1]
v[i] -= m*v[i-1]
x = np.zeros(n)
x[-1] = v[-1]/b[-1]
for i in range(n-2,-1,-1):
x[i] = (v[i]-c[i]*x[i+1])/b[i]
return x
def splinefun(x,y,f,h,xr):
yr = []
n = len(f)
p = 0
#print len(f), len(x), len(y), len(h), len(xr)
for p in range(len(xr)):
for a in range(n-1):
if (x[a] <= xr[p]) and (x[a+1] >= xr[p]):
#print p,a,x[a], xr[p], x[a+1]
c = y[a+1]/h[a] - (h[a]/6)*f[a+1]
d = y[a]/h[a] - (h[a]/6)*f[a]
yr.append((f[a]/(6*h[a]))*(x[a+1]-xr[p])**3 +\
(f[a+1]/(6*h[a]))*(xr[p]-x[a])**3 +\
c*(xr[p]-x[a]) +\
d*(x[a+1]-xr[p]))
#print a,p, x[a], xr[p], x[a+1], yr[p], y[a]
else:
continue
p +=1
return yr
def interpolspline(x,y):
u = []
h = []
v = []
n = len(x)
# Calcular u, h e v
for i in range(n-1):
h.append(x[i+1]-x[i])
for i in range(n-1):
u.append(2*(h[i] + h[i-1]))
for i in range(n-1):
v.append(((6/h[i])*(y[i+1]-y[i]))-(6/(h[i-1]))*(y[i]-y[i-1]))
xr = np.linspace(x[0],x[-1],10000)
f = tridiagonal(h,u,h,v)
yr = splinefun(x,y,f,h,xr)
r = open('results.txt','w')
# writing to file
i = 0
while True:
try:
r.write(str(xr[i]) + '\t' + str(yr[i]) + '\n')
i+=1
except IndexError:
break
r.close()
pass
if __name__ == '__main__':
# Just a test
f = open('cross_section.txt','r')
data = []
for line in f:
data.append(map(eval,line.split('\t')))
x = []
y = []
# Defining x and y vectors from original data
for pair in data:
x.append(pair[0])
y.append(pair[1])
interpolspline(x,y)