Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.55 KB | None | 0 0
  1. import math
  2. from matplotlib import pyplot as plot
  3.  
  4.  
  5. class CauchySolver:
  6. def __init__(self, u10, u20, l1, l2, p1, p2, x0, xn):
  7. def _phi(j, x):
  8. return 0.5 * (u10 + u20) * math.exp(l1 * x) + (-1) ** (j + 1) * 0.5 * (u10 - u20) * math.exp(l2 * x)
  9.  
  10. self.phi = _phi
  11. self.u = {1: u10, 2: u20}
  12.  
  13. self.p1 = p1
  14. self.p2 = p2
  15.  
  16. self.x0 = x0
  17. self.xn = xn
  18.  
  19. def get_setka(self, n):
  20. h = (self.xn - self.x0) / n
  21. x = [self.x0 + i * h for i in range(n + 1)]
  22. n = n + 1
  23. return x, n, h
  24.  
  25. def y_euler(self, n):
  26. x, n, h = self.get_setka(n)
  27. u1 = []
  28. u2 = []
  29. for i in range(n):
  30. if i == 0:
  31. u1.append(self.u[1])
  32. u2.append(self.u[2])
  33. else:
  34. u1.append(u1[i - 1] + h * (self.p1 * u1[i - 1] + self.p2 * u2[i - 1]))
  35. u2.append(u2[i - 1] + h * (self.p2 * u1[i - 1] + self.p1 * u2[i - 1]))
  36. return u1, u2
  37.  
  38. def y_euler_implicit(self, n):
  39. x, n, h = self.get_setka(n)
  40. u1 = []
  41. u2 = []
  42. for i in range(n):
  43. if i == 0:
  44. u1.append(self.u[1])
  45. u2.append(self.u[2])
  46. else:
  47. f1 = self.p1 * u1[i - 1] + self.p2 * u2[i - 1]
  48. f2 = self.p2 * u1[i - 1] + self.p1 * u2[i - 1]
  49.  
  50. u1i = u1[i - 1] + h * f1
  51. u2i = u2[i - 1] + h * f2
  52.  
  53. u1.append(u1[i - 1] + 0.5 * h * (f1 + self.p1 * u1i + self.p2 * u2i))
  54. u2.append(u2[i - 1] + 0.5 * h * (f2 + self.p2 * u1i + self.p1 * u2i))
  55.  
  56. return u1, u2
  57.  
  58. def y_runge_cutte_b(self, n):
  59. x, n, h = self.get_setka(n)
  60. u1 = []
  61. u2 = []
  62. for i in range(n):
  63. if i == 0:
  64. u1.append(self.u[1])
  65. u2.append(self.u[2])
  66. else:
  67. k11 = h * (self.p1 * u1[i - 1] + self.p2 * u2[i - 1])
  68. k21 = h * (self.p2 * u1[i - 1] + self.p1 * u2[i - 1])
  69.  
  70. k12 = h * (self.p1 * (u1[i - 1] + k11 / 2) + self.p2 * (u2[i - 1] + k21 / 2))
  71. k22 = h * (self.p2 * (u1[i - 1] + k11 / 2) + self.p1 * (u2[i - 1] + k21 / 2))
  72.  
  73. k13 = h * (self.p1 * (u1[i - 1] + k12 / 2) + self.p2 * (u2[i - 1] + k22 / 2))
  74. k23 = h * (self.p2 * (u1[i - 1] + k12 / 2) + self.p1 * (u2[i - 1] + k22 / 2))
  75.  
  76. k14 = h * (self.p1 * (u1[i - 1] + k13) + self.p2 * (u2[i - 1] + k23))
  77. k24 = h * (self.p2 * (u1[i - 1] + k13) + self.p1 * (u2[i - 1] + k23))
  78.  
  79. u1.append(u1[i - 1] + (k11 + 2 * k12 + 2 * k13 + k14) / 6)
  80. u2.append(u2[i - 1] + (k21 + 2 * k22 + 2 * k23 + k24) / 6)
  81.  
  82. return u1, u2
  83.  
  84. def eps(self, u1, u2):
  85. x, n, h = self.get_setka(len(u1) - 1)
  86. eps = []
  87.  
  88. u11, u22 = [self.phi(1, xi) for xi in x], [self.phi(2, xi) for xi in x]
  89.  
  90. m = max(abs(abs(u1[i]) - abs(u11[i])) + abs(abs(u2[i]) - abs(u22[i])) for i in range(len(u1)))
  91.  
  92. return m
  93.  
  94. def plot(self, j, y):
  95. x, n, h = self.get_setka(len(y) - 1)
  96. phi_x = [self.x0 + i * (self.xn - self.x0) / 1000 for i in range(1000)]
  97. phi_y = [self.phi(j, xi) for xi in phi_x]
  98.  
  99. plot.xscale('log')
  100. plot.yscale('log')
  101. plot.plot(phi_x, phi_y, color='red', label='phi')
  102. plot.plot(x, y, color='blue', label='y')
  103. plot.legend()
  104. plot.show()
  105.  
  106. def ppp(self, e):
  107. x = [i for i in range(len(e))]
  108. #plot.xscale('log')
  109. plot.yscale('log')
  110. plot.plot(x, e)
  111. plot.show()
  112.  
  113. def main():
  114. n = 10
  115.  
  116. solver = CauchySolver(u10=0, u20=1, l1=-201, l2=-1, p1=-101, p2=-100, x0=0, xn=5)
  117.  
  118. e = []
  119.  
  120. for i in range(15):
  121. u1, u2 = solver.y_runge_cutte_b(n)
  122. e.append(solver.eps(u1,u2))
  123. # u1_1, u2_2 = solver.y_euler_implicit(n * 2)
  124. # max_loc_eps = solver.eps(u1, u2)
  125. # max_loc_eps = solver.eps(u1_1, u2_2)
  126. # print('погрешность %.2E' % (max_loc_eps))
  127. # pz = math.log (abs((solver.eps(u1,u2)) /(solver.eps(u1_1,u2_2))), 2)
  128. # print('порядок %.2E' % (pz))
  129. # if i != 0:
  130. # pz = max_loc_eps_old / max_loc_eps
  131. # print('погрешность %.8E' % (pz,))
  132.  
  133. # max_loc_eps_old = max_loc_eps
  134. n = n * 2
  135.  
  136. solver.ppp(e)
  137.  
  138. # u1, u2 = solver.y_runge_cutte_b(n)
  139. # solver.plot(1, u1)
  140.  
  141. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement