
Добавил:
Molochnik
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
# Данные для синего светодиода
theta_deg_full = np.array([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180])
I_microA_full = np.array([1.3, 1.5, 2.2, 4.1, 3.2, 3, 3.8, 6.8, 13.7, 51.2, 13.7, 6.8, 3.8, 3, 3.2, 4.1, 2.2, 1.5, 1.3])
# Преобразуем углы в радианы для полярной системы
theta_rad_full = np.deg2rad(theta_deg_full)
# Половинное значение тока
I_max = max(I_microA_full)
I_half = I_max * 0.5
# Интерполяция для более плавного графика
theta_interp = np.linspace(theta_deg_full.min(), theta_deg_full.max(), 500)
interp_func = interp1d(theta_deg_full, I_microA_full, kind='cubic')
I_interp = interp_func(theta_interp)
theta_rad_interp = np.deg2rad(theta_interp)
# Найдем индексы, при которых ток больше или равен половине максимального значения для интерполированных данных
above_half_indices_interp = np.where(I_interp >= I_half)[0]
# Определим диапазон углов для заливки
theta_half_min_interp = theta_rad_interp[above_half_indices_interp[0]]
theta_half_max_interp = theta_rad_interp[above_half_indices_interp[-1]]
# Построение полярного графика
plt.figure(figsize=(8, 8))
ax = plt.subplot(111, polar=True)
ax.plot(theta_rad_interp, I_interp, linestyle='-', color='blue', label='Синий светодиод')
# Заливка области между theta_half_min и theta_half_max, радиус на уровне I_half
ax.fill_between(theta_rad_interp, 0, I_half, where=(theta_rad_interp >= theta_half_min_interp) & (theta_rad_interp <= theta_half_max_interp), color='red', alpha=0.5, label=r'$\theta_{0.5}$')
# Настройки графика
ax.set_title("Диаграмма направленности излучения для синего светодиода", fontsize=14)
ax.set_theta_direction(-1) # Обратное направление для соответствия привычным графикам
ax.set_theta_offset(np.pi / 2) # Начало отсчета с 90 градусов
ax.grid(True)
# Показ легенды с указанием ширины диаграммы направленности
plt.legend()
plt.show()