calc.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import numpy as np
  2. def open_file(path):
  3. """depends on the format of file we open"""
  4. freq, re, im = [], [], []
  5. with open(path) as f:
  6. for line in f:
  7. temp = line[:-1].split(' ')
  8. for i in range(3):
  9. temp[i] = temp[i].replace(" ", "")
  10. freq.append(float(temp[0]))
  11. re.append(float(temp[1]))
  12. im.append(float(temp[2]))
  13. return freq, re, im
  14. def prepare_data(freq, re, im):
  15. """the function takes raw data and gives vectors of eq (8)"""
  16. fl = freq[re.index(max(re))]
  17. # fl is the frequency of loaded resonance
  18. f0 = fl
  19. # f0 is the frequency of unloaded resonance
  20. e1, e2, e3, gamma, p = [], [], [], [], []
  21. for i in range(0, len(freq)):
  22. # filling vectors
  23. t = 2 * (freq[i] - fl) / f0
  24. g = re[i] + im[i] * 1j
  25. e1.append(t)
  26. e2.append(1)
  27. e3.append(-t * g)
  28. gamma.append(g)
  29. p.append(1 / (1 + t ** 2 * (1 + re[i] ** 2 + im[i] ** 2)))
  30. data = np.array([e1, e2, e3, gamma, p], dtype=complex)
  31. return data
  32. def solution(data):
  33. """ takes projections of equation (8) on vectors e1, e2, e3 and solves the equations"""
  34. c = [] # matrix of the system
  35. b = [] # matrix extension
  36. for i in range(3):
  37. c1 = np.vdot(data[i], data[4] * data[0])
  38. c2 = np.vdot(data[i], data[4] * data[1])
  39. c3 = np.vdot(data[i], data[4] * data[2])
  40. c.append([c1, c2, c3])
  41. b.append(np.vdot(data[i], data[4] * data[3]))
  42. a = np.linalg.solve(c, b)
  43. return a
  44. def q_factor(a):
  45. """calculation of result"""
  46. Ql = a[2].imag # Q-factor of loaded resonator
  47. d = abs(a[1] - a[0] / a[2]) # diameter of circle
  48. k = 1 / (2 / d - 1)
  49. Q = Ql * (1 + k) # Q-factor = result
  50. return Q
  51. def calculate(path):
  52. """applies all functions"""
  53. freq, re, im = open_file(path)
  54. data = prepare_data(freq, re, im)
  55. a = solution(data)
  56. Q = q_factor(a)
  57. return Q