Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import matplotlib.pyplot as plt
- from mpl_toolkits.mplot3d import Axes3D
- from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
- import tkinter as tk
- from tkinter import ttk
- def solve_system(R, L, G, C):
- # Границы расчетной области
- x_start = 0.0
- x_end = 1.0
- t_start = 0.0
- t_end = 1.0
- # Шаги по координате и времени
- dx = 0.1
- dt = 0.01
- # Создание сетки
- x_grid = np.arange(x_start, x_end + dx, dx)
- t_grid = np.arange(t_start, t_end + dt, dt)
- num_x = len(x_grid)
- num_t = len(t_grid)
- # Инициализация массивов для хранения значений u и i
- u = np.zeros((num_t, num_x))
- i = np.zeros((num_t, num_x))
- # Установка начальных и граничных условий
- u[0, :] = 0.0 # Начальное условие для u
- i[0, :] = 1.0 # Начальное условие для i
- u[:, 0] = 0.0 # Граничное условие u при x = x_start
- u[:, -1] = 0.0 # Граничное условие u при x = x_end
- i[:, 0] = 0.0 # Граничное условие i при x = x_start
- i[:, -1] = 0.0 # Граничное условие i при x = x_end
- # Явная схема конечных разностей
- for n in range(num_t - 1):
- for j in range(1, num_x - 1):
- u[n+1, j] = u[n, j] + dt * (R * i[n, j] + L * (i[n, j+1] - i[n, j-1]) / (2 * dx))
- 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))
- return x_grid, t_grid, u, i
- def update_plot(*args):
- R = resistance_var.get()
- L = inductance_var.get()
- G = leakage_var.get()
- C = capacitance_var.get()
- x_grid, t_grid, u, i = solve_system(R, L, G, C)
- ax_u.clear()
- ax_u.set_xlabel('x')
- ax_u.set_ylabel('t')
- ax_u.set_zlabel('u')
- ax_u.set_title('Solution for u(x, t)')
- ax_u.plot_surface(*np.meshgrid(x_grid, t_grid), u, cmap='viridis')
- ax_i.clear()
- ax_i.set_xlabel('x')
- ax_i.set_ylabel('t')
- ax_i.set_zlabel('i')
- ax_i.set_title('Solution for i(x, t)')
- ax_i.plot_surface(*np.meshgrid(x_grid, t_grid), i, cmap='viridis')
- canvas.draw()
- # Создание графического интерфейса с использованием Tkinter
- root = tk.Tk()
- root.title('Telegraph Equations Solver')
- # Создание фрейма для параметров
- params_frame = ttk.LabelFrame(root, text='Parameters')
- params_frame.pack(padx=10, pady=10)
- # Создание переменных для связи значений
- resistance_var = tk.DoubleVar()
- inductance_var = tk.DoubleVar()
- leakage_var = tk.DoubleVar()
- capacitance_var = tk.DoubleVar()
- # Создание полей ввода для параметров
- resistance_label = ttk.Label(params_frame, text='Resistance (R):')
- resistance_label.grid(row=0, column=0, padx=5, pady=5, sticky='E')
- resistance_entry = ttk.Entry(params_frame, width=10, textvariable=resistance_var)
- resistance_entry.insert(tk.END, '1.0')
- resistance_entry.grid(row=0, column=1, padx=5, pady=5)
- resistance_entry.bind('<Return>', update_plot)
- resistance_slider = tk.Scale(params_frame, from_=0, to=10, resolution=0.1, orient=tk.HORIZONTAL,
- variable=resistance_var, command=update_plot)
- resistance_slider.set(1.0)
- resistance_slider.grid(row=0, column=2, padx=5, pady=5)
- inductance_label = ttk.Label(params_frame, text='Inductance (L):')
- inductance_label.grid(row=1, column=0, padx=5, pady=5, sticky='E')
- inductance_entry = ttk.Entry(params_frame, width=10, textvariable=inductance_var)
- inductance_entry.insert(tk.END, '2.0')
- inductance_entry.grid(row=1, column=1, padx=5, pady=5)
- inductance_entry.bind('<Return>', update_plot)
- inductance_slider = tk.Scale(params_frame, from_=0, to=10, resolution=0.1, orient=tk.HORIZONTAL,
- variable=inductance_var, command=update_plot)
- inductance_slider.set(2.0)
- inductance_slider.grid(row=1, column=2, padx=5, pady=5)
- leakage_label = ttk.Label(params_frame, text='Leakage (G):')
- leakage_label.grid(row=2, column=0, padx=5, pady=5, sticky='E')
- leakage_entry = ttk.Entry(params_frame, width=10, textvariable=leakage_var)
- leakage_entry.insert(tk.END, '0.5')
- leakage_entry.grid(row=2, column=1, padx=5, pady=5)
- leakage_entry.bind('<Return>', update_plot)
- leakage_slider = tk.Scale(params_frame, from_=0, to=1, resolution=0.01, orient=tk.HORIZONTAL,
- variable=leakage_var, command=update_plot)
- leakage_slider.set(0.5)
- leakage_slider.grid(row=2, column=2, padx=5, pady=5)
- capacitance_label = ttk.Label(params_frame, text='Capacitance (C):')
- capacitance_label.grid(row=3, column=0, padx=5, pady=5, sticky='E')
- capacitance_entry = ttk.Entry(params_frame, width=10, textvariable=capacitance_var)
- capacitance_entry.insert(tk.END, '0.8')
- capacitance_entry.grid(row=3, column=1, padx=5, pady=5)
- capacitance_entry.bind('<Return>', update_plot)
- capacitance_slider = tk.Scale(params_frame, from_=0, to=1, resolution=0.01, orient=tk.HORIZONTAL,
- variable=capacitance_var, command=update_plot)
- capacitance_slider.set(0.8)
- capacitance_slider.grid(row=3, column=2, padx=5, pady=5)
- # Создание кнопки обновления
- update_button = ttk.Button(root, text='Update', command=update_plot)
- update_button.pack(pady=10)
- # Создание фигуры и подключение ее к Tkinter
- fig = plt.figure(figsize=(12, 6))
- ax_u = fig.add_subplot(121, projection='3d')
- ax_i = fig.add_subplot(122, projection='3d')
- canvas = FigureCanvasTkAgg(fig, master=root)
- canvas.draw()
- canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
- # Запуск приложения
- update_plot()
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement