Guest User

Untitled

a guest
Dec 13th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.06 KB | None | 0 0
  1. import numpy as np
  2. from scipy.integrate import odeint
  3. import matplotlib.pyplot as plt
  4. from math import pi, exp, fabs
  5.  
  6. a = 0
  7. b = pi / 2
  8. n = 100
  9. alpha = 10
  10. epsilon = 0.001
  11. delta = 0.1
  12.  
  13. psi1_0 = 0
  14. psi2_0 = 1 # произвольно
  15. x1_0 = 1 # произвольно
  16. x2_0 = 0
  17.  
  18. t = np.linspace(a, b, n) # vector of time
  19.  
  20.  
  21. # create function
  22. def f(y, t):
  23. x1, x2, psi1, psi2 = y
  24. return [x2, psi2 / 2 - x1 * exp(-alpha * t), psi2 * exp(-alpha * t), -psi1]
  25.  
  26.  
  27. def ode_solve(x1_init, psi2_init):
  28. y0 = [x1_init, x2_0, psi1_0, psi2_init] # start value
  29. w = odeint(f, y0, t) # solve eq.
  30. x1 = w[:, 0]
  31. x2 = w[:, 1]
  32. psi1 = w[:, 2]
  33. psi2 = w[:, 3]
  34. return x1, x2, psi1, psi2
  35.  
  36.  
  37. def newton():
  38. global x1_0, psi2_0
  39. x1, x2, psi1, psi2 = ode_solve(x1_0 + delta, psi2_0)
  40. delta_11 = psi1[-1]
  41. delta_21 = psi2[-1]
  42. x1, x2, psi1, psi2 = ode_solve(x1_0, psi2_0 + delta)
  43. delta_12 = psi1[-1]
  44. delta_22 = psi2[-1]
  45.  
  46. a11 = (delta_11 - delta_10) / delta
  47. a12 = (delta_12 - delta_10) / delta
  48. a21 = (delta_21 - delta_20) / delta
  49. a22 = (delta_22 - delta_20) / delta
  50.  
  51. b1 = a11 * psi2_0 + a12 * x1_0 - delta_10
  52. b2 = a21 * psi2_0 + a22 * x1_0 - delta_20
  53.  
  54. psi2_0 = (a11 * b2 - a21 * b1) / (a22 * a11 - a12 * a21)
  55. x1_0 = (b1 * a22 - b2 * a12) / (a22 * a11 - a12 * a21)
  56.  
  57. return ode_solve(x1_0, psi2_0)
  58.  
  59.  
  60. if __name__ == '__main__':
  61. x1, x2, psi1, psi2 = ode_solve(x1_0, psi2_0)
  62. delta_10 = psi1[-1]
  63. delta_20 = psi2[-1]
  64. iteration_count = 1
  65. while True:
  66. print('Итерация: ', iteration_count)
  67. x1, x2, psi1, psi2 = newton()
  68. u = [point / 2 for point in psi2] # u = psi2 / 2
  69. delta_10 = psi1[-1]
  70. delta_20 = psi2[-1]
  71. if fabs(delta_10) < epsilon and fabs(delta_20) < epsilon:
  72. break
  73. iteration_count += 1
  74.  
  75. plt.plot(t, u, label='u') # plot u
  76. # plt.plot(t, x1, label='x1')
  77. # plt.plot(t, x2, label='x2')
  78. plt.plot(t, psi1, label='psi1')
  79. plt.plot(t, psi2, label='psi2') # plot x1, x2, psi1, psi2
  80. plt.grid(True)
  81. plt.legend()
  82. plt.show() # display
Add Comment
Please, Sign In to add comment