форкнуто от main/python-labs
Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
177 строки
5.9 KiB
Python
177 строки
5.9 KiB
Python
def signal_delay(input_signal, delay_time):
|
|
"""
|
|
Реализация устройства задержки сигнала
|
|
|
|
Args:
|
|
input_signal: список входного сигнала
|
|
delay_time: время задержки (количество тактов)
|
|
|
|
Returns:
|
|
list: задержанный сигнал
|
|
"""
|
|
# Инициализируем выход нулями для первых delay_time тактов
|
|
output = [0] * delay_time
|
|
|
|
# Добавляем входной сигнал со сдвигом
|
|
output.extend(input_signal[:-delay_time] if delay_time > 0 else input_signal)
|
|
|
|
return output
|
|
|
|
# Проверка функции задержки
|
|
print("=== ПРОВЕРКА ФУНКЦИИ ЗАДЕРЖКИ ===")
|
|
test_signal = [1, 2, 3, 4, 5, 6, 7, 8]
|
|
delay = 3
|
|
delayed_signal = signal_delay(test_signal, delay)
|
|
|
|
print(f"Исходный сигнал: {test_signal}")
|
|
print(f"Задержка: {delay} тактов")
|
|
print(f"Задержанный сигнал: {delayed_signal}")
|
|
|
|
# Визуализация
|
|
import matplotlib.pyplot as plt
|
|
plt.figure(figsize=(10, 4))
|
|
plt.plot(test_signal, 'bo-', label='Входной сигнал', markersize=8)
|
|
plt.plot(delayed_signal, 'ro-', label=f'Выход (задержка {delay})', markersize=6)
|
|
plt.title('Устройство задержки сигнала')
|
|
plt.xlabel('Время (такты)')
|
|
plt.ylabel('Амплитуда')
|
|
plt.legend()
|
|
plt.grid(True, alpha=0.3)
|
|
plt.show()
|
|
|
|
def calculate_histogram(data, num_bins):
|
|
"""
|
|
Расчет гистограммы для выборки данных
|
|
|
|
Args:
|
|
data: список значений выборки
|
|
num_bins: количество интервалов разбиения
|
|
|
|
Returns:
|
|
tuple: (границы интервалов, частоты)
|
|
"""
|
|
if not data:
|
|
return [], []
|
|
|
|
min_val = min(data)
|
|
max_val = max(data)
|
|
bin_width = (max_val - min_val) / num_bins
|
|
|
|
# Создаем границы интервалов
|
|
bins = [min_val + i * bin_width for i in range(num_bins + 1)]
|
|
|
|
# Инициализируем счетчики
|
|
frequencies = [0] * num_bins
|
|
|
|
# Подсчитываем элементы в каждом интервале
|
|
for value in data:
|
|
for i in range(num_bins):
|
|
if bins[i] <= value < bins[i + 1]:
|
|
frequencies[i] += 1
|
|
break
|
|
else:
|
|
# Обработка максимального значения
|
|
if value == bins[-1]:
|
|
frequencies[-1] += 1
|
|
|
|
return bins, frequencies
|
|
|
|
def print_histogram_table(bins, frequencies):
|
|
"""Вывод гистограммы в виде таблицы"""
|
|
print("\nГИСТОГРАММА:")
|
|
print("Интервал\t\tКоличество элементов")
|
|
print("-" * 45)
|
|
|
|
for i in range(len(frequencies)):
|
|
lower = bins[i]
|
|
upper = bins[i + 1]
|
|
count = frequencies[i]
|
|
print(f"{lower:8.3f} - {upper:8.3f}\t\t{count:4d}")
|
|
|
|
total = sum(frequencies)
|
|
print("-" * 45)
|
|
print(f"Всего:\t\t\t\t{total:4d}")
|
|
|
|
# Проверка функции гистограммы
|
|
print("\n=== ПРОВЕРКА ФУНКЦИИ ГИСТОГРАММЫ ===")
|
|
import random
|
|
|
|
# Генерируем тестовые данные (нормальное распределение)
|
|
test_data = [random.gauss(0, 1) for _ in range(1000)]
|
|
bins, freq = calculate_histogram(test_data, 10)
|
|
|
|
print_histogram_table(bins, freq)
|
|
|
|
# Визуализация гистограммы
|
|
plt.figure(figsize=(12, 5))
|
|
|
|
plt.subplot(1, 2, 1)
|
|
plt.hist(test_data, bins=10, alpha=0.7, edgecolor='black')
|
|
plt.title('Гистограмма (matplotlib)')
|
|
plt.xlabel('Значение')
|
|
plt.ylabel('Частота')
|
|
plt.grid(True, alpha=0.3)
|
|
|
|
plt.subplot(1, 2, 2)
|
|
# Рисуем нашу гистограмму
|
|
bin_centers = [(bins[i] + bins[i+1])/2 for i in range(len(bins)-1)]
|
|
plt.bar(bin_centers, freq, width=(bins[1]-bins[0])*0.8,
|
|
alpha=0.7, edgecolor='black')
|
|
plt.title('Наша гистограмма')
|
|
plt.xlabel('Значение')
|
|
plt.ylabel('Частота')
|
|
plt.grid(True, alpha=0.3)
|
|
|
|
plt.tight_layout()
|
|
plt.show()
|
|
|
|
# Анонимная функция для расчета линейной регрессии
|
|
linear_regression = lambda b1, b2, X: b1 + b2 * X
|
|
|
|
# Проверка анонимной функции
|
|
print("\n=== ПРОВЕРКА АНОНИМНОЙ ФУНКЦИИ ЛИНЕЙНОЙ РЕГРЕССИИ ===")
|
|
|
|
# Тестовые параметры модели
|
|
b1_test = 2.5 # intercept
|
|
b2_test = 1.8 # slope
|
|
X_values = [0, 1, 2, 3, 4, 5]
|
|
|
|
print(f"Параметры модели: b1 = {b1_test}, b2 = {b2_test}")
|
|
print("Расчет значений Y = b1 + b2*X:")
|
|
print("X\tY")
|
|
print("-" * 12)
|
|
|
|
for X in X_values:
|
|
Y = linear_regression(b1_test, b2_test, X)
|
|
print(f"{X}\t{Y:.2f}")
|
|
|
|
# Визуализация линейной регрессии
|
|
plt.figure(figsize=(10, 6))
|
|
|
|
# Генерируем больше точек для плавного графика
|
|
X_smooth = [i/10 for i in range(0, 51)]
|
|
Y_smooth = [linear_regression(b1_test, b2_test, x) for x in X_smooth]
|
|
|
|
plt.plot(X_smooth, Y_smooth, 'b-', linewidth=2, label=f'Y = {b1_test} + {b2_test}*X')
|
|
plt.plot(X_values, [linear_regression(b1_test, b2_test, x) for x in X_values],
|
|
'ro', markersize=8, label='Расчетные точки')
|
|
|
|
plt.title('Линейная регрессия: Y = b1 + b2*X')
|
|
plt.xlabel('X')
|
|
plt.ylabel('Y')
|
|
plt.legend()
|
|
plt.grid(True, alpha=0.3)
|
|
plt.show()
|
|
|
|
# Дополнительная проверка с разными параметрами
|
|
print("\n=== ПРОВЕРКА С РАЗНЫМИ ПАРАМЕТРАМИ ===")
|
|
test_cases = [
|
|
(0, 1, 10), # Y = X
|
|
(5, 0.5, 10), # Y = 5 + 0.5*X
|
|
(-2, 2, 10) # Y = -2 + 2*X
|
|
]
|
|
|
|
for b1, b2, X in test_cases:
|
|
Y = linear_regression(b1, b2, X)
|
|
print(f"b1={b1}, b2={b2}, X={X} -> Y = {Y}")
|