Advertisement
Guest User

Numerical Analysis

a guest
Nov 23rd, 2010
4,670
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.85 KB | None | 0 0
  1. import numpy as np
  2.  
  3. def Splines(data):
  4.     np1=len(data)
  5.     n=np1-1
  6.     X,Y = zip(*data)
  7.     X = [float(x) for x in X]
  8.     Y = [float(y) for y in Y]
  9.     a = Y[:]
  10.     b = [0.0]*(n)
  11.     d = [0.0]*(n)
  12.     h = [X[i+1]-X[i] for i in xrange(n)]
  13.     alpha = [0.0]*n
  14.     for i in xrange(1,n):
  15.         alpha[i] = 3/h[i]*(a[i+1]-a[i]) - 3/h[i-1]*(a[i]-a[i-1])
  16.     c = [0.0]*np1
  17.     L = [0.0]*np1
  18.     u = [0.0]*np1
  19.     z = [0.0]*np1
  20.     L[0] = 1.0; u[0] = z[0] = 0.0
  21.     for i in xrange(1,n):
  22.         L[i] = 2*(X[i+1]-X[i-1]) - h[i-1]*u[i-1]
  23.         u[i] = h[i]/L[i]
  24.         z[i] = (alpha[i]-h[i-1]*z[i-1])/L[i]
  25.     L[n] = 1.0; z[n] = c[n] = 0.0
  26.     for j in xrange(n-1, -1, -1):
  27.         c[j] = z[j] - u[j]*c[j+1]
  28.         b[j] = (a[j+1]-a[j])/h[j] - (h[j]*(c[j+1]+2*c[j]))/3
  29.         d[j] = (c[j+1]-c[j])/(3*h[j])
  30.     splines = []
  31.     for i in xrange(n):
  32.         splines.append((a[i],b[i],c[i],d[i],X[i]))
  33.     return splines,X[n]
  34.  
  35. def splinesToPlot(splines,xn,res):
  36.     n=len(splines)
  37.     perSpline = int(res/n)
  38.     if perSpline < 3: perSpline = 3
  39.     X=[]
  40.     Y=[]
  41.     for i in xrange(n-1):
  42.         S = splines[i]
  43.         x0 = S[4]
  44.         x1 = splines[i+1][4]
  45.         x = np.linspace(x0,x1,perSpline)
  46.         for xi in x:
  47.             X.append(xi)
  48.             h=(xi-S[4])
  49.             Y.append(S[0]+S[1]*h + S[2]*h**2 + S[3]*h**3)
  50.     S=splines[n-1]
  51.     x=np.linspace(S[4],xn,perSpline)
  52.     for xi in x:
  53.         X.append(xi)
  54.         h=(xi-S[4])
  55.         Y.append(S[0]+S[1]*h + S[2]*h**2 + S[3]*h**3)
  56.    
  57.     return X,Y
  58.  
  59. if '__main__' in __name__:
  60.     x = lambda n: np.linspace(-1,1,n)
  61.     f = lambda x: np.cos(np.sin(np.pi*x))
  62.     n = 5
  63.     E=200
  64.     data = zip(x(n),f(x(n)))
  65.     splines,xn = Splines(data)
  66.     X,Y = splinesToPlot(splines,xn,E)
  67.     import matplotlib as mpl
  68.     mpl.use("TkAgg")
  69.     import matplotlib.pylab as plt
  70.     plt.ion()
  71.     plt.plot(X,Y,'r--')
  72.     plt.plot(x(300),f(x(300)),'k')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement