From 4f1dadba3434c29e1d36529fb496deeca38c5d84 Mon Sep 17 00:00:00 2001 From: Ogarkov Ilya Date: Sun, 23 Nov 2025 15:55:23 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=82=D1=87=D1=91=D1=82=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D0=BB=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B5=20=E2=84=96?= =?UTF-8?q?7=20=D0=93=D0=9E=D0=A2=D0=9E=D0=92=20+=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TEMA7/6.4.py | 61 +++++++ TEMA7/Figure_1.png | Bin 0 -> 35408 bytes TEMA7/control.py | 176 ++++++++++++++++++ TEMA7/report.md | 445 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 682 insertions(+) create mode 100644 TEMA7/6.4.py create mode 100644 TEMA7/Figure_1.png create mode 100644 TEMA7/control.py create mode 100644 TEMA7/report.md diff --git a/TEMA7/6.4.py b/TEMA7/6.4.py new file mode 100644 index 0000000..a4749de --- /dev/null +++ b/TEMA7/6.4.py @@ -0,0 +1,61 @@ +import math + +# Ввод параметров +znach = input('k1,T,k2,Xm,A,F,N=').split(',') +k1 = float(znach[0]) +T = float(znach[1]) +k2 = float(znach[2]) +Xm = float(znach[3]) +A = float(znach[4]) +F = float(znach[5]) +N = int(znach[6]) + +print(f"Параметры системы: k1={k1}, T={T}, k2={k2}, Xm={Xm}") +print(f"Входной сигнал: A={A}, F={F}, N={N}") + +# Создание входного сигнала (синусоида) +vhod = [] +for i in range(N): + vhod.append(A * math.sin((2 * i * math.pi) / F)) + +print("Входной сигнал:", vhod[:10]) # Покажем первые 10 значений + +# Функции компонентов системы +def realdvig(xtt, kk1, TT, yti1, ytin1): + """Модель реального двигателя""" + yp = kk1 * xtt # усилитель + yti1 = yp + yti1 # Интегратор + ytin1 = (yti1 + TT * ytin1) / (TT + 1) # Инерционное звено + return [yti1, ytin1] + +def tahogen(xtt, kk2, yti2): + """Модель тахогенератора""" + yp = kk2 * xtt # усилитель + yti2 = yp + yti2 # интегратор + return yti2 + +def nechus(xtt, gran): + """Зона нечувствительности""" + if xtt < gran and xtt > (-gran): + ytt = 0 + elif xtt >= gran: + ytt = xtt - gran + elif xtt <= (-gran): + ytt = xtt + gran + return ytt + +# Моделирование системы +yi1 = 0 # состояние интегратора двигателя +yin1 = 0 # состояние инерционного звена +yi2 = 0 # состояние интегратора тахогенератора + +vyhod = [] # выход системы + +for xt in vhod: + xt1 = xt - yi2 # отрицательная обратная связь + [yi1, yin1] = realdvig(xt1, k1, T, yi1, yin1) + yi2 = tahogen(yin1, k2, yi2) + yt = nechus(yin1, Xm) + vyhod.append(yt) + +print('Выход системы y=', vyhod) diff --git a/TEMA7/Figure_1.png b/TEMA7/Figure_1.png new file mode 100644 index 0000000000000000000000000000000000000000..013df204f8c8f0ae7d30ac3e5b890227b40a7cdd GIT binary patch literal 35408 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 literal 0 HcmV?d00001 diff --git a/TEMA7/control.py b/TEMA7/control.py new file mode 100644 index 0000000..2f6d711 --- /dev/null +++ b/TEMA7/control.py @@ -0,0 +1,176 @@ +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}") diff --git a/TEMA7/report.md b/TEMA7/report.md new file mode 100644 index 0000000..c89634f --- /dev/null +++ b/TEMA7/report.md @@ -0,0 +1,445 @@ +# Отчёт по теме 7. Создание пользовательских функций + +Выполнил Огарков Илья, А-03-23 + +## 1. Начало работы + +Создание текстового файла `report.md` + +import os +os.getcwd() +'C:\\Users\\Ilya\\AppData\\Local\\Programs\\Python\\Python313' +os.chdir('C:\\Users\\Ilya\\Desktop\\python-labs\\TEMA7') +os.getcwd() +'C:\\Users\\Ilya\\Desktop\\python-labs\\TEMA7' + + +## 2. Создание пользовательской функции +2.1. Первый пример: функция – без аргументов + + +def uspeh(): + """Подтверждение успеха операции""" + print('Выполнено успешно!') + +uspeh() +Выполнено успешно! +type(uspeh) + +dir(uspeh) +['__annotations__', '__builtins__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__getstate__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__type_params__'] + +help(uspeh) +Help on function uspeh in module __main__: + +uspeh() + Подтверждение успеха операции + +2.2. Пример функции с аргументами + +def sravnenie(a,b): + """Сравнение a и b""" + if a>b: + print(a,' больше ',b) + elif a", line 1, in + slozh(d1,d2,d3,d4) + File "", line 3, in slozh + return a1+a2+a3+a4 +TypeError: unsupported operand type(s) for +: 'dict' and 'dict' +s1={1,2};s2={3,4};s3={5,6};s4={7,8} +slozh(s1,s2,s3,s4) +Traceback (most recent call last): + File "", line 1, in + slozh(s1,s2,s3,s4) + File "", line 3, in slozh + return a1+a2+a3+a4 +TypeError: unsupported operand type(s) for +: 'set' and 'set' + +2.5. + +def inerz(x,T,ypred): + """ Модель устройства с памятью: +x- текущее значение вх.сигнала, +T -постоянная времени, +ypred - предыдущее значение выхода устройства""" + y=(x+T*ypred)/(T+1) + return y + +sps=[0]+[1]*100;sps +[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] +spsy=[] +TT=20 +yy=0 +for xx in sps: + yy=inerz(xx,TT,yy) + spsy.append(yy) + + +3. Функции как объекты. +3.1. Получение списка атрибутов объекта-функции. + +dir(inerz) +['__annotations__', '__builtins__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__getstate__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__type_params__'] + +inerz.__doc__ #__doc__ - атрибут, который выводит документационную строку (docstring) функции +'Модель устройства с памятью:\nx- текущее значение вх.сигнала,\nT -постоянная времени,\nypred - предыдущее значение выхода устройства' +help(inerz) +Help on function inerz in module __main__: + +inerz(x, T, ypred) + Модель устройства с памятью: + x- текущее значение вх.сигнала, + T -постоянная времени, + ypred - предыдущее значение выхода устройства + +3.2. Сохранение ссылки на объект-функцию в другой переменной + +fnkt=sravnenie +v=16 +fnkt(v,23) +16 меньше 23 + +3.3. Возможность альтернативного определения функции в программе + +typ_fun=8 +if typ_fun==1: + def func(): + print('Функция 1') +else: + def func(): + print('Функция 2') + +func() +Функция 2 + + +4. Аргументы функции +4.1. Изучите возможность использования функции в качестве аргумента другой функции + +def fun_arg(fff,a,b,c): + """fff-имя функции, используемой + в качестве аргумента функции fun_arg""" + return a+fff(c,b) + +zz=fun_arg(logistfun,-3,1,0.7);zz +-2.3318122278318336 + +4.2. Обязательные и необязательные аргументы + +def logistfun(a,b=1): + """Вычисление логистической функции""" + import math + return b/(1+math.exp(-a)) +logistfun(0.7) +0.6681877721681662 +logistfun(0.7,2) +1.3363755443363323 + +4.3. Изучите возможность обращения к функции с произвольным (непозиционным) расположением аргументов + +logistfun(b=0.5,a=0.8) +0.34498724056380625 + +4.4. Пример со значениями аргументов функции, содержащимися в списке или кортеже + +b1234=[b1,b2,b3,b4] +qq=slozh(*b1234) ;qq # Оператор * распаковывает элементы +[1, 2, -1, -2, 0, 2, -1, -1] +uslovniy_list = [1,2,3,4] +slozh(*uslovniy_list) +10 + +4.5. Пример со значениями аргументов функции, содержащимися в словаре + +dic4={"a1":1,"a2":2,"a3":3,"a4":4} +qqq=slozh(**dic4);qqq # Распаковываем значения словаря +10 +qqq_usl=slozh(*dic4);qqq_usl # Распаковываем ключи словаря +'a1a2a3a4' + +4.6. Смешанные ссылки + +e1=(-1,6);dd2={'a3':3,'a4':9} +qqqq=slozh(*e1,**dd2) +qqqq +17 + +4.7. Переменное число аргументов у функции + +def func4(*kort7): + """Произвольное число аргументов в составе кортежа""" + smm=0 + for elt in kort7: + smm+=elt + return smm + +func4(-1,2) +1 +func4(-1,2,0,3,6) +10 + +4.8. Комбинация аргументов + +def func4(a,b=7,*kort7): + """Кортеж - сборка аргументов - должен быть последним!""" + smm=0 + for elt in kort7: + smm+=elt + return a*smm+b + +func4(-1,2,0,3,6) +-7 + +4.9. Изменение значений объектов, используемых в качестве аргументов функции + +a=90 +def func3(b): + a=5*b+67 + +func3(a);a +90 + +sps1=[1,2,3,4] +def func2(sps): + sps[1]=99 + + +func2(sps1) +print(sps1) +[1, 99, 3, 4] + +5. Специальные типы пользовательских функций +5.1. Анонимные функции. + +anfun1=lambda: 1.5+math.log10(17.23) +anfun1() +2.7362852774480286 +anfun2(17,234) +19.369215857410143 +anfun3=lambda a,b=234: a+math.log10(b) +anfun3(100) +102.36921585741014 + +5.2. Функции-генераторы + +def func5(diap,shag): + """ Итератор, возвращающий значения + из диапазона от 1 до diap с шагом shag""" + for j in range(1,diap+1,shag): + yield j + + for mm in func5(7,3): + print(mm) +1 +4 +7 + +alp=func5(7,3) +print(alp.__next__()) +1 +print(alp.__next__()) +4 +print(alp.__next__()) +7 +print(alp.__next__()) +Traceback (most recent call last): + File "", line 1, in + print(alp.__next__()) +StopIteration + +6. Локализация объектов в функциях +6.1. Примеры на локализацию объектов + +glb=10 +def func7(arg): + loc1=15 + glb=8 + return loc1*arg + +res=func7(glb);res +150 + +def func8(arg): + loc1=15 + print(glb) + glb=8 + return loc1*arg + +res=func8(glb);res +Traceback (most recent call last): + File "", line 1, in + res=func8(glb);res + File "", line 3, in func8 + print(glb) +UnboundLocalError: cannot access local variable 'glb' where it is not associated with a value + +glb=11 +def func7(arg): + loc1=15 + global glb + print(glb) + glb=8 + return loc1*arg +res=func7(glb);res +11 +165 + +6.2. Выявление локализации объекта с помощью функций locals() и globals() из builtins + +globals().keys() +dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) +locals().keys() +dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) + +def func8(arg): + loc1=15 + glb=8 + print(globals().keys()) + print(locals().keys()) + return loc1*arg + +hh=func8(glb) +dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) +dict_keys(['arg', 'loc1', 'glb']) +hh +120 +'glb' in globals().keys() +True + +6.3. Локализация объектов при использовании вложенных функций + +def func9(arg2,arg3): + def func9_1(arg1): + loc1=15 + glb1=8 + print('glob_func9_1:',globals().keys()) + print('locl_func9_1:',locals().keys()) + return loc1*arg1 + loc1=5 + glb=func9_1(loc1) + print('loc_func9:',locals().keys()) + print('glob_func9:',globals().keys()) + return arg2+arg3*glb + +kk=func9(10,1) +glob_func9_1: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8', 'hh', 'func9']) +locl_func9_1: dict_keys(['arg1', 'loc1', 'glb1']) +loc_func9: dict_keys(['arg2', 'arg3', 'func9_1', 'loc1', 'glb']) +glob_func9: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8', 'hh', 'func9']) + +6.4. + +import math + +# Ввод параметров +znach = input('k1,T,k2,Xm,A,F,N=').split(',') +k1 = float(znach[0]) +T = float(znach[1]) +k2 = float(znach[2]) +Xm = float(znach[3]) +A = float(znach[4]) +F = float(znach[5]) +N = int(znach[6]) + +print(f"Параметры системы: k1={k1}, T={T}, k2={k2}, Xm={Xm}") +print(f"Входной сигнал: A={A}, F={F}, N={N}") + +# Создание входного сигнала (синусоида) +vhod = [] +for i in range(N): + vhod.append(A * math.sin((2 * i * math.pi) / F)) + +print("Входной сигнал:", vhod[:10]) # Покажем первые 10 значений + +# Функции компонентов системы +def realdvig(xtt, kk1, TT, yti1, ytin1): + """Модель реального двигателя""" + yp = kk1 * xtt # усилитель + yti1 = yp + yti1 # Интегратор + ytin1 = (yti1 + TT * ytin1) / (TT + 1) # Инерционное звено + return [yti1, ytin1] + +def tahogen(xtt, kk2, yti2): + """Модель тахогенератора""" + yp = kk2 * xtt # усилитель + yti2 = yp + yti2 # интегратор + return yti2 + +def nechus(xtt, gran): + """Зона нечувствительности""" + if xtt < gran and xtt > (-gran): + ytt = 0 + elif xtt >= gran: + ytt = xtt - gran + elif xtt <= (-gran): + ytt = xtt + gran + return ytt + +# Моделирование системы +yi1 = 0 # состояние интегратора двигателя +yin1 = 0 # состояние инерционного звена +yi2 = 0 # состояние интегратора тахогенератора + +vyhod = [] # выход системы + +for xt in vhod: + xt1 = xt - yi2 # отрицательная обратная связь + [yi1, yin1] = realdvig(xt1, k1, T, yi1, yin1) + yi2 = tahogen(yin1, k2, yi2) + yt = nechus(yin1, Xm) + vyhod.append(yt) + +print('Выход системы y=', vyhod) +k1,T,k2,Xm,A,F,N=1,2,3,4,5,6,7 +Параметры системы: k1=1.0, T=2.0, k2=3.0, Xm=4.0 +Входной сигнал: A=5.0, F=6.0, N=7 +Входной сигнал: [0.0, 4.330127018922193, 4.330127018922194, 6.123233995736766e-16, -4.330127018922193, -4.330127018922193, -1.2246467991473533e-15] +Выход системы y= [0, 0, 0, 0, -3.430711797903516, -4.909726376383112, 0] + + + + + + + +