Advertisement
Guest User

Untitled

a guest
May 20th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.38 KB | None | 0 0
  1. import pandas as pd
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4.  
  5. data = pd.read_csv('input.csv')
  6. x = data['x'].tolist()
  7. f = data['f(x)'].tolist()
  8. start = float(data['a'][0])
  9. end = float(data['b'][0])
  10. df0 = 0
  11. dfn = -0.939692621
  12.  
  13.  
  14. def func(x):
  15.     return x**3 + x**2 + x + 1
  16.  
  17.  
  18. def h(i):
  19.     return x[i] - x[i - 1]
  20.  
  21.  
  22. def coeffs_vector(A, B):
  23.     alpha = np.empty(shape=(N))
  24.     beta = np.empty(shape=(N))
  25.     cv = np.empty(shape=(N))
  26.  
  27.     y = A[0][0]
  28.     alpha[0] = -A[0][1] / y
  29.     beta[0] = B[0] / y
  30.  
  31.     for i in range(1, N - 1):
  32.         y = A[i][i] + A[i][i - 1] * alpha[i - 1]
  33.         alpha[i] = -A[i][i + 1] / y
  34.         beta[i] = (B[i] - A[i][i - 1] * beta[i - 1]) / y
  35.  
  36.     cv[N - 1] = (B[N - 1] - A[N - 1][N - 2] * beta[N - 2]) / (A[N - 1][N - 1] + A[N - 1][N - 2] * alpha[N - 2])
  37.     for i in range(N - 2, 0, -1):
  38.         cv[i] = alpha[i] * cv[i + 1] + beta[i]
  39.  
  40.  
  41.  
  42.     return cv
  43.  
  44.  
  45. def s(i, arg):
  46.     cv = coeffs_vector(A, B)
  47.     return (cv[i - 1] * func(x[i] - arg)) / (6 * (x[i] - x[i - 1])) + (cv[i] * func(arg - x[i - 1])) / (6 * (x[i] - x[i - 1])) + (f[i - 1] - (cv[i - 1] * (x[i] - x[i - 1]) * (x[i] - x[i - 1])) / 6) * ((x[i] - arg) / (x[i] - x[i - 1])) + (f[i] - (cv[i] * (x[i] - x[i - 1]) * (x[i] - x[i - 1]) / 6)) * ((arg - x[i - 1]) / (x[i] - x[i - 1]))
  48.  
  49.  
  50. def _s(i, arg):
  51.     cv = coeffs_vector(A, B)
  52.     a = M[i-1] * (x[i] - arg)**3 / 6 * h(i)
  53.     b = M[i] * (arg - x[i-1])**3 / 6 * h(i)
  54.     c = (f[i-1] - M[i]*h(i)**2 / 6) * ((x[i] - arg) / h(i))
  55.     d = (f[i] - M[i]*h(i)**2 / 6) * ((arg - x[i-1]) / h(i))
  56.     return a + b + c + d
  57.  
  58. # print('Input data\n~~~~~~~~~~~~~')
  59. # print(data)
  60.  
  61.  
  62. N = len(x)
  63. A = np.zeros(shape=(N,N))
  64. B = np.empty(shape=(N))
  65. M = np.empty(shape=(N))
  66.  
  67.  
  68. def main():
  69.     # ================ Заполнение матриц ===============
  70.  
  71.  
  72.     A[0][0] = (x[1] - x[0]) / 3
  73.     A[0][1] = (x[1] - x[0]) / 6
  74.     A[N - 1][N - 2] = (x[N - 1] - x[N - 2]) / 6
  75.     A[N - 1][N - 1] = (x[N - 1] - x[N - 2]) / 3
  76.     for i in range(1, N - 1):
  77.         for j in range(0, N):
  78.             if j < i - 1 or j > i + 1:
  79.                 A[i][j] = 0
  80.             elif j == i - 1:
  81.                 A[i][j] = (x[i] - x[i - 1]) / 6
  82.             elif j == i:
  83.                 A[i][j] = (x[i] - x[i - 1] + x[i+1] - x[i]) / 3
  84.             elif j == i + 1:
  85.                 A[i][j] = (x[i + 1] - x[i]) / 6
  86.  
  87.  
  88.     for i in range(N - 1):
  89.         B[i] = (f[i + 1] - f[i]) / (x[i + 1] - x[i]) - (f[i] - f[i - 1]) / (x[i] - x[i - 1])
  90.  
  91.     M[0] = ((A[1][1] - A[0][1]) / h(0) - df0 - h(0) * B[0] / 6) * (3 / h(0))
  92.     for i in range(N - 2):
  93.         M[i + 1] = B[i]
  94.     M[N - 1] = dfn
  95.     # print(A)
  96.     # print(B)
  97.  
  98.     points = np.linspace(-1, 2, 0.01)
  99.     spline = np.empty(300)
  100.     k = 0
  101.     for i in range(0, 300):
  102.         points[k] = i
  103.         for m in range(N-1):
  104.             if (i <= x[m+1]) and (i >= x[m]):
  105.                 spline[i] = _s(m+1, i)
  106.                 break
  107.             else:
  108.                 if i > x[N - 1]:
  109.                     spline[k] = _s(N-1, i)
  110.                     break
  111.                 else:
  112.                     if i < x[0]:
  113.                         spline[k] = _s(1, i)
  114.                         break
  115.         k += 1
  116.  
  117.     #plt.plot(np.linspace(0, 100, 10), [func(i) for i in range(0, 100, 10)], color='red')
  118.     plt.plot(points, spline)
  119.     plt.show()
  120.  
  121.  
  122. main()
  123. #for i in range(100):
  124. #    print(i, ',', func(i), sep='')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement