Advertisement
Guest User

Dopasowanie krzywej gaussa

a guest
Nov 17th, 2017
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.51 KB | None | 0 0
  1. import numpy as np
  2. from scipy.optimize import curve_fit
  3. import matplotlib.pyplot as plt
  4. import csv
  5.  
  6. # Deklaracja funkcji gaussa
  7. def gauss(x, *p):
  8.     a, b, c, d = p
  9.     y = a*np.exp(-np.power((x - b), 2.)/(2. * c**2.)) + d
  10.  
  11.     return y
  12.  
  13. # Wczytanie danych z pliku godz.ASCII - plik musi być w tym samym folderze co skrypt!
  14. x_list = []
  15. y_list = []
  16.  
  17. with open('godz.ASCII', 'r') as csvf:
  18.     reader = csv.reader(csvf, delimiter='\t')
  19.     for r in reader:
  20.         if len(r) == 2:
  21.             x_list.append(float(r[0]))
  22.             y_list.append(float(r[1]))
  23.            
  24. #Konwersja do tablicy numpy
  25. x = np.array(x_list)
  26. y = np.array(y_list)
  27. n = len(x)                          #the number of data
  28.  
  29. #Centrujemy dane wokol x = 0
  30. offset = (sum(x)/n)
  31. x -= offset
  32.  
  33. #Okreslamy parametry poczatkowe algorytmu dopasowania
  34. mean = sum(x*y)/n
  35. sigma = sum(y*(x-mean)**2)/n
  36. p_0 = [max(y), mean, sigma, 0]
  37.  
  38. #Dopasowanie krzywej
  39. fit, covariance = curve_fit(gauss, x, y, p0=p_0 )
  40.  
  41. #Przesuwamy dopasowana funkcje z powrotem na miejsce
  42. fit[1]+=offset
  43.    
  44. #Przesuwamy z powrotem nasze dane wejciowe na miejsce
  45. x = x+offset
  46.  
  47. #Generujemy Y zgodnie z naszą oszacowaną funkcją
  48. y_fit = gauss(x, *fit)
  49.  
  50. #Rysujemy wszystko:
  51. fig, ax = plt.subplots()
  52. ax.plot(x, y, color = 'blue')
  53. ax.plot(x, y_fit, color = 'red')
  54.  
  55. ax.set_xlabel(r'$x$')
  56. ax.set_ylabel(r'$f(x)$')
  57. ax.set_title('Dopasowanie krzywej gaussa.')
  58.  
  59. print("Dopasowana funkcja: f(x) = {}*np.exp(-np.power((x - {}), 2.)/(2. * {}**2.)) + {}".format(*fit))
  60.  
  61. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement