Основы программирования на Python Каширский / методички / Лабораторная работа № 5 2025 (2)
.pdf
качестве результата возвращалось FnFprevious mod 1000. Значение предыдущего числа Ферма Fprevious, используемое при первом вызове функции, должно передаваться как параметр в замыкание. С помощью декоратора реализуйте проверку на валидность переданного в функцию числа: если n меньше нуля, то в качестве результата выдать «Ошибка», в противном случае – результат выполнения функции.
18.Реализуйте замыкание так, чтобы при каждом вызове функции используя рекурсию вычислялось число Эйлера по формуле ( , ) = ( + 1) ( − 1, ) + ( −) ( − 1, − 1), A(0,k)=0 для всех k>0, A(n,0)=1 для всех n>0, A(n,k)=0 для всех k≥n, A(0,0)=1 и в качестве результата возвращалась сумма чисел Эйлера для фиксированного n. Значение суммы, используемое при первом вызове функции, должно передаваться как параметр в замыкание. С помощью декоратора реализуйте проверку на валидность переданных в функцию чисел: если n < 0 или k < 0, то в качестве результата выдать «Ошибка», в противном случае – результат выполнения функции.
19.Реализуйте замыкание так, чтобы при каждом вызове функции используя рекурсию по переданному в качестве значения параметра функции целому n вычислялось n-e число Фибоначчи и в качестве результата возвращалось произведение последних четырех рассчитанных чисел Фибоначчи. Значение предшествующих чисел Фибоначчи, используемых при начальных вызовах функции, должны задаваться через передачу параметров в замыкание. С помощью декоратора реализуйте проверку на валидность переданного в функцию числа: если n меньше нуля, то в качестве результата выдать «Ошибка», в противном случае – результат выполнения функции.
20.Реализуйте замыкание так, чтобы при каждом вызове функции используя
рекурсию вычислялся гиперболический косинус по формуле С ( ) = С −1( ) +
2 , С0( ) = 1, и в качестве результата возвращалось три последних рассчитанных
(2 )!
значения. Значения предыдущих вычислений, используемых при первом вызове функции, должны передаваться как параметры в замыкание. С помощью декоратора реализуйте проверку на валидность переданного в функцию числа: если x < 0 или n < 10 то в качестве результата выдать «Ошибка», в противном случае – результат выполнения функции.
21. Реализуйте замыкание так, чтобы при каждом вызове функции используя
рекурсию вычислялся n-ый член последовательности по формуле = |
−1+ −2 |
, 0 = |
|
2 |
|||
|
|
||
0, 1 = 1 и в качестве результата возвращалось произведение |
текущего и |
||
предыдущего рассчитанного значения, если n является четным, и их частное, если n – нечетное. Значение предшествующего рассчитанного an, используемого при первом вызове функции, должно передаваться как параметр в замыкание. С помощью декоратора реализуйте проверку на валидность переданного в функцию числа: если n меньше нуля, то в качестве результата выдать «Ошибка», в противном случае – результат выполнения функции.
22. Реализуйте замыкание так, чтобы при каждом вызове функции используя рекурсию вычислялось число Стирлинга второго рода по формуле:
( , ) = ( − 1, ) + ( − 1, − 1), S(0,0)=1, S(n,0)=0 для всех n≥1, S(n,k)=0 для всех k>n, S(n,1)=1 для всех n≥1, S(n,n)=1 для всех n≥0 и в качестве результата возвращалось произведение текущего и предыдущего рассчитанного значения. Значение предыдущего вычисления, используемое при первом вызове функции, должно передаваться как параметр в замыкание. С помощью декоратора реализуйте проверку на валидность переданных в функцию чисел: если n < 0 или k < 0, то в качестве результата выдать «Ошибка», в противном случае – результат выполнения функции.
Задание 8
1.Генератор тактовых импульсов. Создайте генератор, который yields
последовательность тактовых импульсов (0, 1, 0, 1, ...). Формула переключения состояния: s = 1 - s . Начальное состояние: s = 0.
2.Генератор ШИМ сигнала. Реализуйте генератор ШИМ с заданной скважностью D (0 < D < 1) и периодом T. Формула: y(t) = 1 если (t mod T) < D·T, иначе y(t)
=0. Параметры: D = 0.5, T = 10.
3.Генератор синусоидального сигнала (DDS). Напишите генератор для DDS
синтезатора. Формула: y(t) = A·sin(2πft). Используйте приближение синуса: sin(x) ≈ x - x³/6 + x /120. Параметры: A = 1.0, f = 1.0, sample_rate = 100.0.
4.Генератор треугольного сигнала. Создайте генератор треугольного сигнала.
Формула: y(t) = (2A/T)·|(t mod T) - T/2| - A/2. Параметры: A = 1.0, T = 20.
5.Генератор пилообразного сигнала. Реализуйте генератор пилообразного сигнала. Формула: y(t) = A·(t mod T)/T. Параметры: A = 1.0, T = 20.
6.Генератор экспоненциального затухания. Напишите генератор затухающих колебаний. Формула: y(t) = A·kᵗ·sin(2πft), где k < 1 - коэффициент затухания. Параметры: A = 1.0, f = 1.0, k = 0.99, α = 0.1, sample_rate = 100.0.
7.Генератор ЛЧМ сигнала. Создайте генератор линейно-частотной модуляции. Формула: y(t) = sin(2π(f + kt)t). Параметры: f = 1.0, k = 0.1, duration = 100, sample_rate = 100.0.
8.Генератор псевдослучайной последовательности. Реализуйте генератор псевдослучайной бинарной последовательности длиной 3 бита. Формула: новый бит = state[2] XOR state[1], сдвиг регистра вправо. Начальное состояние: 0b101.
9.Генератор АЦП значений. Напишите генератор, эмулирующий АЦП.
Формула: digital = floor((analog - Vmin)/(Vmax - Vmin)·(2ᴺ - 1)). Параметры: Vmin = 0.0, Vmax = 3.3, bits = 8. Входной сигнал: analog = 1.65 + 1.65·sin(2πt/100).
10.Генератор цифрового фильтра. Создайте генератор фильтра скользящего среднего. Формула: y = (x + x + ... + x )/k. Параметры: window_size = 5. Входной сигнал: x(t) = (t mod 50)/50 + 0.1·шум.
11.Генератор П-регулятора. Реализуйте генератор пропорционального регулятора. Формула: u(t) = K ·e(t), где e(t) = setpoint - process_value. Параметры: K = 1.0, setpoint = 0.5. Процесс: process_value = 0.3 + 0.4·(t mod 40)/40.
12.Генератор компаратора. Напишите генератор компаратора. Формула: y(t) =
1если x(t) > threshold, иначе 0. Параметры: threshold = 0.5. Входной сигнал: x(t) = (t mod 30)/30.
13.Генератор делителя частоты. Создайте генератор делителя частоты. Формула: выходной импульс каждый N-й входной импульс. Параметры: division = 4. Вход: меандр с периодом 10.
14.Генератор счетчика импульсов. Реализуйте генератор счетчика импульсов. Формула: count = (count + 1) mod max_count при наличии импульса. Параметры: max_count = 16. Вход: импульсы каждый 10 тактов.
15.Генератор мультиплексора. Напишите генератор мультиплексора 4-в-1. Формула: output = input[select], где select - номер выбранного входа. Параметры: смена канала каждые 25 тактов. Входы: сигналы с разными частотами.
16.Генератор демультиплексора. Создайте генератор демультиплексора 1-в-
4.Формула: output[select] = input, остальные выходы = 0. Параметры: смена выхода каждые 20 тактов. Вход: x(t) = (t mod 30)/30.
17.Генератор сдвигового регистра. Реализуйте генератор сдвигового регистра. Формула: register = [bit, register [0], register [1], ..., register [k-2]].
Параметры: length = 8. Вход: данные каждый 15 тактов.
18.Генератор сумматора. Напишите генератор 4-битного сумматора. Формула: sum = (a + b) mod 2 , carry = 1 если a + b ≥ 2 . Параметры: bits = 4. Входы: a(t) = t mod 16, b(t) = (t + 3) mod 16.
19.Генератор детектора фронта. Создайте генератор детектора фронта сигнала. Формула: rising_edge = 1 если x > x , falling_edge = 1 если x < x . Входной сигнал: меандр с периодом 24.
20.Генератор таймера. Реализуйте генератор таймера. Формула: output = 1 при
0≤ counter < timeout, иначе 0. Параметры: timeout = 10. Запуск по условию: каждые 5 тактов.
21.Генератор ШИМ с регулируемой скважностью. Напишите генератор ШИМ с плавно изменяющейся скважностью. Формула: D(t) = Dmin + (Dmax - Dmin)·(t mod 100)/100. Параметры: Dmin = 0.1, Dmax = 0.9, T = 20.
22.Генератор реле. Создайте генератор реле с гистерезисом. Формула: y = 1
если x > on_threshold, y = 0 если x < off_threshold. Параметры: on_threshold = 0.7, off_threshold = 0.3. Вход: x(t) = (t mod 40)/40.
23.Генератор инкрементального энкодера. Реализуйте генератор инкрементального энкодера. Формула: position = position + 1 если (A rising и B=0)
или (A falling и B=1), position = position - 1 если (A rising и B=1) или (A falling и B=0). Параметры: steps_per_rev = 20.
24.Генератор детектора переполнения. Напишите генератор детектора переполнения. Формула: overflow = 1 если current < previous и previous = max_value. Параметры: bit_width = 4, max_value = 15. Вход: счётчик от 0 до 20.
25.Генератор тактового генератора с дрожанием. Создайте генератор тактовых импульсов с дрожанием. Формула: period = base_period + (t mod (2·jitter + 1) - jitter). Параметры: base_period = 10, jitter = 2.
26.Генератор цифрового потенциометра. Реализуйте генератор цифрового потенциометра. Формула: value(t) изменяется каждые 50 тактов ±10 от середины. Параметры: max_value = 255, начальное значение = 127.
27.Генератор детектора паузы. Напишите генератор детектора паузы в сигнале. Формула: output = 1 если pause_counter ≥ min_pause. Параметры: min_pause
=5. Вход: сигнал с паузами (1 при t mod 30 < 20, иначе 0).
28.Генератор управляемого генератора (VCO). Создайте генератор управляемого генератора. Формула: f(t) = fmin + (fmax - fmin)·control(t), где control(t) = (t mod 100)/100. Параметры: fmin = 1.0, fmax = 10.0.
29.Генератор оконного компаратора. Реализуйте генератор оконного компаратора. Формула: y = -1 если x < low, 1 если x > high, 0 если low ≤ x ≤ high. Параметры: low = 0.3, high = 0.7. Вход: x(t) = (t mod 50)/50.
30.Генератор делителя напряжения. Напишите генератор цифрового делителя напряжения. Формула: Vout(t) = Vin(t)·R2/(R1 + R2). Параметры: R1 = 1000, R2
=1000. Вход: Vin(t) = 3.3·(t mod 40)/40.
