Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # -*- coding: UTF-8 -*-
- import math
- import numpy as np
- import matplotlib.pyplot as plt
- from matplotlib.widgets import Slider, Button
- fig, ax = plt.subplots()
- exa, = plt.plot(-5, 5)
- appr, = plt.plot(-5, 5)
- plt.xlim(-5, 5)
- plt.ylim(-5, 5)
- plt.subplots_adjust(bottom=0.2)
- plt.grid(True)
- axes_slider_N = plt.axes([0.1, 0.08, 0.7, 0.04])
- slider_N = Slider(axes_slider_N,
- label='N',
- valmin=1,
- valmax=20,
- valinit=2,
- valfmt='%1.0f'
- )
- axprev = plt.axes([0.85, 0.08, 0.04, 0.04])
- axnext = plt.axes([0.90, 0.08, 0.04, 0.04])
- bnext = Button(axnext, '+')
- bprev = Button(axprev, '-')
- dx = 0.1
- a = 0
- b = 1
- p = 0
- q = -9
- alpha1 = 1
- beta1 = 0
- gammma1 = 0
- alpha2 = 1
- beta2 = 1
- gammma2 = 1
- class M_piu():
- U = [0, 1]
- V = [1, 0]
- W = [0, 0]
- n = 2
- h = (b - a) / n
- d = q * h ** 2 - p * h - 2
- e = 1 + p * h
- X1 = (beta1) / (beta1 - alpha1 * h)
- Nu1 = (gammma1 * h) / (alpha1 * h - beta1)
- X2 = (beta2) / (alpha2 * h + beta2)
- Nu2 = (gammma2 * h) / (alpha2 * h + beta2)
- def __init__(self):
- self.func_approximate()
- self.func_exact()
- def clear_U_V_W(self):
- self.U = [0, 1]
- self.V = [1, 0]
- self.W = [0, 0]
- def get_vectors_value(self):
- self.clear_U_V_W()
- for i in range(2, self.n + 1):
- self.U.append((-self.U[i - 2] - self.d * self.U[i - 1]) / self.e)
- self.V.append((-self.V[i - 2] - self.d * self.V[i - 1]) / self.e)
- 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)
- def change_n_count_slider(self, count):
- self.n = int(count)
- self.h = (b - a) / self.n
- h = self.h
- self.d = q * h ** 2 - p * h - 2
- self.e = 1 + p * h
- self.X1 = (-beta1) / (alpha1 * h - beta1)
- self.Nu1 = (gammma1 * h) / (alpha1 * h - beta1)
- self.X2 = (beta2) / (alpha2 * h + beta2)
- self.Nu2 = (gammma2 * h) / (alpha2 * h + beta2)
- self.func_approximate()
- self.func_exact()
- def change_n_count(self, count):
- self.n += count
- self.h = (b - a) / self.n
- h = self.h
- self.d = q * h ** 2 - p * h - 2
- self.e = 1 + p * h
- self.X1 = (-beta1) / (alpha1 * h - beta1)
- self.Nu1 = (gammma1 * h) / (alpha1 * h - beta1)
- self.X2 = (beta2) / (alpha2 * h + beta2)
- self.Nu2 = (gammma2 * h) / (alpha2 * h + beta2)
- self.func_exact()
- self.func_approximate()
- slider_N.set_val(self.n)
- def get_coefficients(self):
- W, V, U = self.W, self.V, self.U
- X1, X2, Nu1, Nu2 = self.X1, self.X2, self.Nu1, self.Nu2
- '''C1 = (X2 * Nu1 * V[n - 1] + X2 * W[n - 1] + Nu2 - V[n] * Nu1 - W[n]) / (
- U[n] + X1 * V[n] - X2 * U[n - 1] - X1 * X2 * V[n - 1])'''
- n = self.n
- C1 = (X2 * Nu1 * V[n - 1] + X2 * W[n - 1] + Nu2 - Nu1 * V[n] - W[n]) / (
- U[n] + X1 * V[n] - X2 * U[n - 1] - X1 * X2 * V[n - 1])
- C2 = C1 * X1 + Nu1
- return C1, C2
- def func_approximate(self):#приближенное
- self.get_vectors_value()
- C1, C2 = self.get_coefficients()
- ylist = []
- for i in range(0, self.n + 1):
- ylist.append(C1 * self.U[i] + C2 * self.V[i] + self.W[i])
- xlist = np.arange(0, 1 + ((b - a) / (self.n)), (b - a) / (self.n))
- appr.set_ydata(ylist)
- appr.set_xdata(xlist)
- plt.draw()
- def func_exact(self):#точное
- xlist = np.arange(a, b + dx, dx)
- ylist = [((3 * math.exp(3 * x) + (5 - 4 * x) * (math.exp(3 + 3 * x)) - 3 * math.exp(-3 * x)
- - 5 * math.exp(3 - 3 * x) - 2 * x * math.exp(3 * x - 3)) / (12 * math.exp(3) + 6 * math.exp(-3)))
- for x in xlist]
- exa.set_ydata(ylist)
- exa.set_xdata(xlist)
- plt.draw()
- vizovem = M_piu()
- bprev.on_clicked(lambda x: vizovem.change_n_count(-1))
- bnext.on_clicked(lambda x: vizovem.change_n_count(1))
- slider_N.on_changed(lambda x: vizovem.change_n_count_slider(slider_N.val))
- plt.show()
- if __name__ == "__main__":
- pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement