Добавил:
serega_ovc
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:lab5 / lab5
.pyimport matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import interp1d
from scipy.special import jn_zeros
from scipy.constants import c
# исходные данные
R = 0.01
Eps = 5.7
freq = 15e9
dt_1 = 0.666e-9
dt_2 = 2e-9
dt_3 = 0.0666e-9
P = 0.4
def step_function(x):
if x <= 0:
return 0
else:
return 1
def sin_x(x):
if x == 0:
return 1
else:
return np.sin(x) / x
def spectrum(f):
return sin_x((f - freq) * np.pi * dt_1) * dt_1
def signal(t, z):
sum = 0
for f in freq_array:
if norm_freq[0] < f < norm_freq[-1]:
sum += spectrum(f) * 1e9 * np.cos(f * 2 * np.pi * t - (f * 2 * np.pi * z) / (c * interp_omega(f)))
return sum
count = 5 # количество корней
roots = jn_zeros(0, count)
# поиск частот для фазовых скоростей
omegas = [2 * np.pi * (5 + i / 5) * 1e9 for i in range(1, 200)]
speed = []
group_speed = []
# расчёт фазовых и групповых скоростей
for index in range(count):
speed_array = [1 / (np.sqrt(Eps - (c * roots[index] / (R * omega)) ** 2)) for omega in omegas]
group_speed_array = [(omegas[i + 1] - omegas[i]) / (omegas[i + 1] / speed_array[i + 1] - omegas[i] / speed_array[i])
for i in range(len(speed_array) - 1)]
speed += [speed_array]
group_speed += [group_speed_array]
# нахождение импульса
N = 2 ** 10
time_moments = [dt_2 * i / (N - 1) for i in range(N)]
impulse_array = [np.sin(2 * freq * np.pi * t) * (step_function(t - dt_1) - step_function(t)) for t in time_moments]
# вычисляем преобразование Фурье
N1 = 60
freq_array = [k / dt_2 for k in range(N1)]
spectr_points = [abs(spectrum(f)) for f in freq_array]
spectr_points = np.array(spectr_points) / max(spectr_points)
norm_freq = np.array(omegas) / (2 * np.pi)
# иследование сигнала со времнем
N = 1000
z = 0
time_1 = [4 * dt_2 * i / (N - 1) for i in range(N)]
interp_omega = interp1d(norm_freq, speed[0], kind='cubic')
signal_from_time = [signal(t - dt_1 / 2, 100) for t in time_1]
# сигнал после некоторой дистанции
num = 0
distance = [num + i / N for i in range(N)]
signal_from_dist = [signal(num + dt_1 / 2, d) for d in distance]
res = 0
res_x = 0
for i in range(len(signal_from_dist) - 1):
if signal_from_dist[i] < P < signal_from_dist[i + 1]:
res = distance[i]
res_x = i
#break
print("Дистанция равна:", res_x * dt_1/2 * c )
plt.figure(1, figsize=(8, 15))
plt.grid(True)
plt.subplot(5, 1, 1)
plt.title('Фазовые и групповые скорости')
max = 1 / np.sqrt(Eps)
plt.ylim(0, 1)
plt.plot([omegas[0], omegas[-1]], [max, max], linestyle='--', color='black')
for index in range(count):
plt.plot(omegas, speed[index], color='blue', linewidth=0.8)
plt.plot(omegas[0:-1], group_speed[index], color='red', linewidth=0.8)
plt.subplot(5, 1, 2)
plt.title("Импульс")
plt.plot(time_moments, impulse_array, color="red")
plt.subplot(5, 1, 3)
plt.title('Спектр')
for f, val in zip(freq_array, spectr_points):
plt.plot([f, f], [0, val], color='blue', linewidth=0.5)
plt.plot(freq_array, spectr_points, color='red')
plt.plot([norm_freq[0], norm_freq[0]], [0, 1], color='black', linestyle='--', linewidth=0.8)
plt.subplot(5, 1, 4)
plt.title("Сигнал с течением времени")
plt.plot(time_1, signal_from_time, color='red')
plt.subplot(5, 1, 5)
plt.title("Сигнал после прохождения дистанции")
plt.plot(distance, signal_from_dist, color='red')
plt.plot([distance[0], distance[-1]], [P, P], color='blue', linestyle='--', linewidth=0.8)
plt.savefig("im.png")
plt.show()