Advertisement
edward4324

tkinter method

Jun 27th, 2023
811
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.85 KB | None | 0 0
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from mpl_toolkits.mplot3d import Axes3D
  4. from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
  5. import tkinter as tk
  6. from tkinter import ttk
  7.  
  8.  
  9. def solve_system(R, L, G, C):
  10.     # Границы расчетной области
  11.     x_start = 0.0
  12.     x_end = 1.0
  13.     t_start = 0.0
  14.     t_end = 1.0
  15.  
  16.     # Шаги по координате и времени
  17.     dx = 0.1
  18.     dt = 0.01
  19.  
  20.     # Создание сетки
  21.     x_grid = np.arange(x_start, x_end + dx, dx)
  22.     t_grid = np.arange(t_start, t_end + dt, dt)
  23.     num_x = len(x_grid)
  24.     num_t = len(t_grid)
  25.  
  26.     # Инициализация массивов для хранения значений u и i
  27.     u = np.zeros((num_t, num_x))
  28.     i = np.zeros((num_t, num_x))
  29.  
  30.     # Установка начальных и граничных условий
  31.     u[0, :] = 0.0  # Начальное условие для u
  32.     i[0, :] = 1.0  # Начальное условие для i
  33.     u[:, 0] = 0.0  # Граничное условие u при x = x_start
  34.     u[:, -1] = 0.0  # Граничное условие u при x = x_end
  35.     i[:, 0] = 0.0  # Граничное условие i при x = x_start
  36.     i[:, -1] = 0.0  # Граничное условие i при x = x_end
  37.  
  38.     # Явная схема конечных разностей
  39.     for n in range(num_t - 1):
  40.         for j in range(1, num_x - 1):
  41.             u[n+1, j] = u[n, j] + dt * (R * i[n, j] + L * (i[n, j+1] - i[n, j-1]) / (2 * dx))
  42.             i[n+1, j] = i[n, j] + dt * (G * u[n+1, j] + C * (u[n+1, j+1] - u[n+1, j-1]) / (2 * dx))
  43.  
  44.     return x_grid, t_grid, u, i
  45.  
  46.  
  47. def update_plot(*args):
  48.     R = resistance_var.get()
  49.     L = inductance_var.get()
  50.     G = leakage_var.get()
  51.     C = capacitance_var.get()
  52.  
  53.     x_grid, t_grid, u, i = solve_system(R, L, G, C)
  54.  
  55.     ax_u.clear()
  56.     ax_u.set_xlabel('x')
  57.     ax_u.set_ylabel('t')
  58.     ax_u.set_zlabel('u')
  59.     ax_u.set_title('Solution for u(x, t)')
  60.     ax_u.plot_surface(*np.meshgrid(x_grid, t_grid), u, cmap='viridis')
  61.  
  62.     ax_i.clear()
  63.     ax_i.set_xlabel('x')
  64.     ax_i.set_ylabel('t')
  65.     ax_i.set_zlabel('i')
  66.     ax_i.set_title('Solution for i(x, t)')
  67.     ax_i.plot_surface(*np.meshgrid(x_grid, t_grid), i, cmap='viridis')
  68.  
  69.     canvas.draw()
  70.  
  71.  
  72. # Создание графического интерфейса с использованием Tkinter
  73. root = tk.Tk()
  74. root.title('Telegraph Equations Solver')
  75.  
  76. # Создание фрейма для параметров
  77. params_frame = ttk.LabelFrame(root, text='Parameters')
  78. params_frame.pack(padx=10, pady=10)
  79.  
  80. # Создание переменных для связи значений
  81. resistance_var = tk.DoubleVar()
  82. inductance_var = tk.DoubleVar()
  83. leakage_var = tk.DoubleVar()
  84. capacitance_var = tk.DoubleVar()
  85.  
  86. # Создание полей ввода для параметров
  87. resistance_label = ttk.Label(params_frame, text='Resistance (R):')
  88. resistance_label.grid(row=0, column=0, padx=5, pady=5, sticky='E')
  89. resistance_entry = ttk.Entry(params_frame, width=10, textvariable=resistance_var)
  90. resistance_entry.insert(tk.END, '1.0')
  91. resistance_entry.grid(row=0, column=1, padx=5, pady=5)
  92. resistance_entry.bind('<Return>', update_plot)
  93.  
  94. resistance_slider = tk.Scale(params_frame, from_=0, to=10, resolution=0.1, orient=tk.HORIZONTAL,
  95.                              variable=resistance_var, command=update_plot)
  96. resistance_slider.set(1.0)
  97. resistance_slider.grid(row=0, column=2, padx=5, pady=5)
  98.  
  99. inductance_label = ttk.Label(params_frame, text='Inductance (L):')
  100. inductance_label.grid(row=1, column=0, padx=5, pady=5, sticky='E')
  101. inductance_entry = ttk.Entry(params_frame, width=10, textvariable=inductance_var)
  102. inductance_entry.insert(tk.END, '2.0')
  103. inductance_entry.grid(row=1, column=1, padx=5, pady=5)
  104. inductance_entry.bind('<Return>', update_plot)
  105.  
  106. inductance_slider = tk.Scale(params_frame, from_=0, to=10, resolution=0.1, orient=tk.HORIZONTAL,
  107.                              variable=inductance_var, command=update_plot)
  108. inductance_slider.set(2.0)
  109. inductance_slider.grid(row=1, column=2, padx=5, pady=5)
  110.  
  111. leakage_label = ttk.Label(params_frame, text='Leakage (G):')
  112. leakage_label.grid(row=2, column=0, padx=5, pady=5, sticky='E')
  113. leakage_entry = ttk.Entry(params_frame, width=10, textvariable=leakage_var)
  114. leakage_entry.insert(tk.END, '0.5')
  115. leakage_entry.grid(row=2, column=1, padx=5, pady=5)
  116. leakage_entry.bind('<Return>', update_plot)
  117.  
  118. leakage_slider = tk.Scale(params_frame, from_=0, to=1, resolution=0.01, orient=tk.HORIZONTAL,
  119.                           variable=leakage_var, command=update_plot)
  120. leakage_slider.set(0.5)
  121. leakage_slider.grid(row=2, column=2, padx=5, pady=5)
  122.  
  123. capacitance_label = ttk.Label(params_frame, text='Capacitance (C):')
  124. capacitance_label.grid(row=3, column=0, padx=5, pady=5, sticky='E')
  125. capacitance_entry = ttk.Entry(params_frame, width=10, textvariable=capacitance_var)
  126. capacitance_entry.insert(tk.END, '0.8')
  127. capacitance_entry.grid(row=3, column=1, padx=5, pady=5)
  128. capacitance_entry.bind('<Return>', update_plot)
  129.  
  130. capacitance_slider = tk.Scale(params_frame, from_=0, to=1, resolution=0.01, orient=tk.HORIZONTAL,
  131.                               variable=capacitance_var, command=update_plot)
  132. capacitance_slider.set(0.8)
  133. capacitance_slider.grid(row=3, column=2, padx=5, pady=5)
  134.  
  135. # Создание кнопки обновления
  136. update_button = ttk.Button(root, text='Update', command=update_plot)
  137. update_button.pack(pady=10)
  138.  
  139. # Создание фигуры и подключение ее к Tkinter
  140. fig = plt.figure(figsize=(12, 6))
  141. ax_u = fig.add_subplot(121, projection='3d')
  142. ax_i = fig.add_subplot(122, projection='3d')
  143.  
  144. canvas = FigureCanvasTkAgg(fig, master=root)
  145. canvas.draw()
  146. canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
  147.  
  148. # Запуск приложения
  149. update_plot()
  150. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement