Advertisement
Guest User

2213

a guest
Feb 18th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.29 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3. import math
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. from matplotlib.widgets import Slider, Button
  7.  
  8. fig, ax = plt.subplots()
  9. exa, = plt.plot(-5, 5)
  10. appr, = plt.plot(-5, 5)
  11. plt.xlim(-5, 5)
  12. plt.ylim(-5, 5)
  13. plt.subplots_adjust(bottom=0.2)
  14. plt.grid(True)
  15. axes_slider_N = plt.axes([0.1, 0.08, 0.7, 0.04])
  16. slider_N = Slider(axes_slider_N,
  17.                       label='N',
  18.                       valmin=1,
  19.                       valmax=20,
  20.                       valinit=2,
  21.                       valfmt='%1.0f'
  22.                       )
  23.  
  24. axprev = plt.axes([0.85, 0.08, 0.04, 0.04])
  25. axnext = plt.axes([0.90, 0.08, 0.04, 0.04])
  26. bnext = Button(axnext, '+')
  27. bprev = Button(axprev, '-')
  28.  
  29. dx = 0.1
  30. a = 0
  31. b = 1
  32. p = 0
  33. q = -9
  34. alpha1 = 1
  35. beta1 = 0
  36. gammma1 = 0
  37. alpha2 = 1
  38. beta2 = 1
  39. gammma2 = 1
  40.  
  41. class M_piu():
  42.     U = [0, 1]
  43.     V = [1, 0]
  44.     W = [0, 0]
  45.     n = 2
  46.     h = (b - a) / n
  47.     d = q * h ** 2 - p * h - 2
  48.     e = 1 + p * h
  49.     X1 = (beta1) / (beta1 - alpha1 * h)
  50.     Nu1 = (gammma1 * h) / (alpha1 * h - beta1)
  51.     X2 = (beta2) / (alpha2 * h + beta2)
  52.     Nu2 = (gammma2 * h) / (alpha2 * h + beta2)
  53.     def __init__(self):
  54.         self.func_approximate()
  55.         self.func_exact()
  56.     def clear_U_V_W(self):
  57.         self.U = [0, 1]
  58.         self.V = [1, 0]
  59.         self.W = [0, 0]
  60.     def get_vectors_value(self):
  61.         self.clear_U_V_W()
  62.         for i in range(2, self.n + 1):
  63.             self.U.append((-self.U[i - 2] - self.d * self.U[i - 1]) / self.e)
  64.             self.V.append((-self.V[i - 2] - self.d * self.V[i - 1]) / self.e)
  65.             self.W.append(((-2 * np.exp(3 * i * self.h) * self.h ** 2) - self.W[i - 2] - self.d * self.W[i - 1]) / self.e)
  66.     def change_n_count_slider(self, count):
  67.  
  68.         self.n = int(count)
  69.         self.h = (b - a) / self.n
  70.         h = self.h
  71.  
  72.         self.d = q * h ** 2 - p * h - 2
  73.         self.e = 1 + p * h
  74.         self.X1 = (-beta1) / (alpha1 * h - beta1)
  75.         self.Nu1 = (gammma1 * h) / (alpha1 * h - beta1)
  76.  
  77.         self.X2 = (beta2) / (alpha2 * h + beta2)
  78.         self.Nu2 = (gammma2 * h) / (alpha2 * h + beta2)
  79.  
  80.         self.func_approximate()
  81.         self.func_exact()
  82.     def change_n_count(self, count):
  83.         self.n += count
  84.         self.h = (b - a) / self.n
  85.         h = self.h
  86.  
  87.         self.d = q * h ** 2 - p * h - 2
  88.         self.e = 1 + p * h
  89.         self.X1 = (-beta1) / (alpha1 * h - beta1)
  90.         self.Nu1 = (gammma1 * h) / (alpha1 * h - beta1)
  91.  
  92.         self.X2 = (beta2) / (alpha2 * h + beta2)
  93.         self.Nu2 = (gammma2 * h) / (alpha2 * h + beta2)
  94.  
  95.         self.func_exact()
  96.         self.func_approximate()
  97.         slider_N.set_val(self.n)
  98.     def get_coefficients(self):
  99.         W, V, U = self.W, self.V, self.U
  100.         X1, X2, Nu1, Nu2 = self.X1, self.X2, self.Nu1, self.Nu2
  101.         '''C1 = (X2 * Nu1 * V[n - 1] + X2 * W[n - 1] + Nu2 - V[n] * Nu1 - W[n]) / (
  102.                            U[n] + X1 * V[n] - X2 * U[n - 1] - X1 * X2 * V[n - 1])'''
  103.         n = self.n
  104.  
  105.         C1 = (X2 * Nu1 * V[n - 1] + X2 * W[n - 1] + Nu2 - Nu1 * V[n] - W[n]) / (
  106.                     U[n] + X1 * V[n] - X2 * U[n - 1] - X1 * X2 * V[n - 1])
  107.         C2 = C1 * X1 + Nu1
  108.  
  109.         return C1, C2
  110.     def func_approximate(self):#приближенное
  111.         self.get_vectors_value()
  112.         C1, C2 = self.get_coefficients()
  113.         ylist = []
  114.         for i in range(0, self.n + 1):
  115.             ylist.append(C1 * self.U[i] + C2 * self.V[i] + self.W[i])
  116.  
  117.         xlist = np.arange(0, 1 + ((b - a) / (self.n)), (b - a) / (self.n))
  118.         appr.set_ydata(ylist)
  119.         appr.set_xdata(xlist)
  120.         plt.draw()
  121.     def func_exact(self):#точное
  122.         xlist = np.arange(a, b + dx, dx)
  123.         ylist = [((3 * math.exp(3 * x) + (5 - 4 * x) * (math.exp(3 + 3 * x)) - 3 * math.exp(-3 * x)
  124.                    - 5 * math.exp(3 - 3 * x) - 2 * x * math.exp(3 * x - 3)) / (12 * math.exp(3) + 6 * math.exp(-3)))
  125.                  for x in xlist]
  126.         exa.set_ydata(ylist)
  127.         exa.set_xdata(xlist)
  128.         plt.draw()
  129.  
  130.  
  131. vizovem = M_piu()
  132. bprev.on_clicked(lambda x: vizovem.change_n_count(-1))
  133. bnext.on_clicked(lambda x: vizovem.change_n_count(1))
  134. slider_N.on_changed(lambda x: vizovem.change_n_count_slider(slider_N.val))
  135. plt.show()
  136.  
  137. if __name__ == "__main__":
  138.     pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement