Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.66 KB | None | 0 0
  1. class SplineTuple:
  2. def __init__(self, a, b, c, d, x):
  3. self.a = a
  4. self.b = b
  5. self.c = c
  6. self.d = d
  7. self.x = x
  8.  
  9.  
  10. def BuildSpline(x, y, n):
  11. splines = [SplineTuple(0, 0, 0, 0, 0) for _ in range(0, n)]
  12. for i in range(0, n):
  13. splines[i].x = x[i]
  14. splines[i].a = y[i]
  15.  
  16. splines[0].c = splines[n - 1].c = 0.0
  17.  
  18. alpha = [0.0 for _ in range(0, n - 1)]
  19. beta = [0.0 for _ in range(0, n - 1)]
  20.  
  21. for i in range(1, n - 1):
  22. hi = x[i] - x[i - 1]
  23. hi1 = x[i + 1] - x[i]
  24. A = hi
  25. C = 2.0 * (hi + hi1)
  26. B = hi1
  27. F = 6.0 * ((y[i + 1] - y[i]) / hi1 - (y[i] - y[i - 1]) / hi)
  28. z = (A * alpha[i - 1] + C)
  29. alpha[i] = -B / z
  30. beta[i] = (F - A * beta[i - 1]) / z
  31.  
  32. for i in range(n - 2, 0, -1):
  33. splines[i].c = alpha[i] * splines[i + 1].c + beta[i]
  34.  
  35. for i in range(n - 1, 0, -1):
  36. hi = x[i] - x[i - 1]
  37. splines[i].d = (splines[i].c - splines[i - 1].c) / hi
  38. splines[i].b = hi * (2.0 * splines[i].c + splines[i - 1].c) / 6.0 + (y[i] - y[i - 1]) / hi
  39.  
  40. if not splines:
  41. return None
  42.  
  43. n = len(splines)
  44. s = SplineTuple(0, 0, 0, 0, 0)
  45.  
  46. if x <= splines[0].x:
  47. s = splines[0]
  48. elif x >= splines[n - 1].x:
  49. s = splines[n - 1]
  50. else:
  51. i = 0
  52. j = n - 1
  53. while i + 1 < j:
  54. k = i + (j - i) // 2
  55. if x <= splines[k].x:
  56. j = k
  57. else:
  58. i = k
  59. s = splines[j]
  60.  
  61. dx = x - s.x
  62.  
  63. return s.a + (s.b + (s.c / 2.0 + s.d * dx / 6.0) * dx) * dx;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement