Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab1 / report_lab1

.docx
Скачиваний:
2
Добавлен:
04.02.2020
Размер:
256.36 Кб
Скачать

Санкт-Петербургский Государственный Электротехнический Университет "ЛЭТИ"

кафедра физики

Задание №1 по дисциплине

"Физические основы информационных технологий"

Название: Фазовые кривые

Фамилия И.О.:

группа:

Преподаватель:

Альтмарк А.М.

Итоговый балл:

Крайний срок сдачи: 7.10.19

Санкт-Петербург

2019

Условие ИДЗ

Построить серию из 5 зависимостей фазовой скорости от частоты, а также серию из 5 зависимостей групповой скорости от частоты (Рис.1) для двухслойного цилиндрического волновода, заполненного диэлектриком (Рис.2). Параметры волновода взять из таблицы.

Рисунок 1 — серия из 5 зависимостей

Рисунок 2 — схема волновода

Результаты ИДЗ

Был выбран вариант №12: Rc = 0,4 см, Rw = 1 cм, E = 5.7

В ходе выполнения лабораторной работы было сделано:

  1. Написаны функции для решения дисперсионного уравнения;

  2. Задан диапазон частот и диапазон beta;

  3. С помощью метода бисекции найдены соответствующие фазовые скорости;

  4. Вычислены групповые скорости;

  5. Построен график дисперсионных кривых (рис. 3).

Рисунок 3 – График дисперсионных кривых

Исходный код программы

import matplotlib.pyplot as plt # библиотека графиков import scipy.constants as const # библиотека констант import numpy as np # математическая библиотека import scipy.special as sp # библиотека специальных функций # исходные данные eps = 5.7 Rw = 0.01 # внешний радиус Rc = 0.004 # внутренний радиус c = const.c # скорость света nu = 0 # значение ню # данные диапазона частот start_omega = 5e9 end_omega = 1.15e11 step_omega = 1e9 # данные диапазона beta step_beta = 2 * 10 ** -4 start_beta = 1 / np.sqrt(eps) + step_beta end_beta = 1.5 * start_beta # метод бисекции def bisect(F, k, left, right, eps): E = eps * 2; FLeft = F(k, left) FRight = F(k, right) X = (left + right) / 2 if (FLeft * FRight > 0): print("Ошибка интервала") if (FLeft == 0): return left if (FRight == 0): return right while (right - left) >= E: X = (left + right) / 2 Y = F(k, X) if (Y == 0): return X if (Y * FLeft < 0): right = X else: left = X FLeft = Y return X # вспомогательные функции для решения дисперсионного уравнения def calc_kz(omega): return 2 * np.pi * omega / c def calc_hi1(beta): return (eps - 1 / beta ** 2) ** 0.5 def calc_hi0(beta): return ((1 - beta ** 2) / beta ** 2) ** 0.5 def InD1(z): return (sp.iv(nu, z) + sp.iv(nu + 2, z)) / 2 def JnD1(z): return sp.jv(nu, z) - sp.jv(nu + 2, z) / 2 def KnD1(z): return - (sp.kn(nu, z) + sp.kn(nu + 2, z)) / 2 def YnD1(z): return (sp.yv(nu, z) - sp.yv(nu + 2, z)) / 2 def ez1D(k, beta): hi1 = calc_hi1(beta) X = JnD1(hi1 * k * Rc) * sp.yv(nu, hi1 * k * Rw) Y = - YnD1(hi1 * k * Rc) * sp.jv(nu, hi1 * k * Rw) return X + Y def ez1(k, beta): hi1 = calc_hi1(beta) X = sp.jv(nu, hi1 * k * Rc) * sp.yv(nu, hi1 * k * Rw) Y = - sp.yv(nu, hi1 * k * Rc) * sp.jv(nu, hi1 * k * Rw) return X + Y # фенкция дисперсионного уравнения def Disp(k, beta): hi1 = calc_hi1(beta) hi0 = calc_hi0(beta) X = 1 / hi0 * InD1(hi0 * k * Rc) * ez1(k, beta) Y = eps / hi1 * ez1D(k, beta) * sp.iv(nu, hi0 * k * Rc) return X + Y data = {} range_omega = np.arange(step_omega, end_omega, step_omega) # диапазон частот range_beta = np.arange(start_beta, end_beta, step_beta) # дипапазон beta indexs = range(1, len(range_beta)) # дипазон индексов points = [[] for i in range(5)] # линии 5 графиков # функция поиска корней дисперсионного уравнения def search_root(omega_range): for i, omega in enumerate(omega_range): temp = Disp(calc_kz(omega), range_beta[0]) # начальное приближение диспрс. уравнения count = 0 # счётчик точек for index in indexs: next_temp = Disp(calc_kz(omega), range_beta[index]) if count >= 5: break if temp * next_temp < 0: x = bisect(Disp, calc_kz(omega), range_beta[index - 1], range_beta[index], 10 ** -6) points[count].append([omega, x]) count += 1 temp = next_temp search_root(range_omega) for data in points: array_omegas = [d[0] for d in data] array_velocities = [d[1] for d in data] array_group_velocity = [(array_omegas[i + 1] - array_omegas[i]) / (array_omegas[i + 1] / array_velocities[i + 1] - array_omegas[i] / array_velocities[i]) for i in range(len(array_velocities) - 1)] plt.plot(array_omegas, array_velocities, color="red") plt.plot(array_omegas[:-1], array_group_velocity, color="blue") plt.xlabel("w") plt.ylabel("V/c") plt.show()

Соседние файлы в папке lab1