From 049a5bfa9da7682760068b38fd416d73ea992022 Mon Sep 17 00:00:00 2001 From: Artyom Date: Sun, 16 Nov 2025 23:42:53 +0300 Subject: [PATCH] Added report files --- TEMA7/pictures/figure0.png | Bin 0 -> 29216 bytes TEMA7/pictures/figure1.png | Bin 0 -> 19828 bytes TEMA7/report.md | 614 +++++++++++++++++++++++++++++++++++++ TEMA7/task.md | 80 +++++ 4 files changed, 694 insertions(+) create mode 100644 TEMA7/pictures/figure0.png create mode 100644 TEMA7/pictures/figure1.png create mode 100644 TEMA7/report.md create mode 100644 TEMA7/task.md diff --git a/TEMA7/pictures/figure0.png b/TEMA7/pictures/figure0.png new file mode 100644 index 0000000000000000000000000000000000000000..45805d575b489211a0143b3512e625cc06274e59 GIT binary patch literal 29216 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

}>T8pI_RGc4`0xG0l-SRae*M`8 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 aDL*HGP>{;<3hL?zqbRE;Qz>O0`hNfkr1|9l literal 0 HcmV?d00001 diff --git a/TEMA7/pictures/figure1.png b/TEMA7/pictures/figure1.png new file mode 100644 index 0000000000000000000000000000000000000000..b3bd8fa884510b3c863d3dd9c456c6baa07c21ac GIT binary patch literal 19828 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 literal 0 HcmV?d00001 diff --git a/TEMA7/report.md b/TEMA7/report.md new file mode 100644 index 0000000..508c586 --- /dev/null +++ b/TEMA7/report.md @@ -0,0 +1,614 @@ +# Отчет по теме 7 + +Степанов Артём, А-02-23 + +## Создание пользовательских функций + +### 1. Установка рабочего каталога. Создание рабочего протокола. + +В оболочке IDLE установил актуальный рабочий каталог, а затем в нём создал рабочий протокол. + +![Скриншот созданного рабочего протокола](pictures/figure0.png) + +### 2. Создание пользовательской функции. + +Создание функции предполагает выполнение трех операций: формирование функции, ее сохранение и использование. +В общем виде функция в языке Python представляется так: +__def <Имя функции>([<Список аргументов >]):__ +<отступы> """<Комментарий по назначению функции>""" +<отступы> <Блок инструкций – тело функции> +<отступы> return <Значение или вычисляемое выражение> + +Именование пользовательских функций производится в соответствии с теми же правилами, что используются при именовании переменных. Также важно заметить, что наличие инструкции __return__ не обязательно для работы функции. + +#### 2.1. Функция без аргументов. + +Функции могут быть без аргументов, как в примере ниже. + +```py +>>> def uspeh(): # Аргументы отсутствуют +... """Подтверждение успеха операции""" +... print("Выполнено успешно!") +... +>>> uspeh() + Выполнено успешно! +``` + +Важно заметить, что многострочный комментарий в начале функции выступает в качестве описания её работы, выводимого при запросе __help__ для этой функции. Поэтому данная справочная информация о функции должна быть хорошо и точно структурирована и расписана, чтобы пользователь мог понять как работать с функцией. + +```py +>>> type(uspeh) # Определение класса пользовательской функции + +>>> dir() # Проверка появления имени функции в пространстве имен + ['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os', 'uspeh'] +>>> help(uspeh) # Получение справки о пользовательской функции + Help on function uspeh in module __main__: + + uspeh() + Подтверждение успеха операции +``` + +#### 2.2. Функция с аргументами. + +Также функции могут быть с аргументами: + +```py +>>> def sravnenie(a, b): +... """Сравнение a и b""" +... if a > b: +... print(a, "больше", b) +... elif a < b: +... print(a, "меньше", b) +... else: +... print(a, "равно", b) +... +>>> n, m = 16, 5 +>>> sravnenie(n, m) + 16 больше 5 +``` + +Данную функцию можно применять и для аргументов, являющихся символьными строками. В таком случае будут поэлементно сравниваться символы строк, до первого различия, в соответствии с кодами символов в таблице Unicode/ASCII. + +```py +>>> sravnenie("Text", "Text but bigger") + Text меньше Text but bigger +>>> sravnenie("abc", "ABC") + abc больше ABC +``` + +#### 2.3. Функция, возвращающая значение. + +Функции могут возвращать определенные значения с помощью инструкции __return__. + +```py +>>> def logistfun(b, a): +... """Вычисление логистической функции""" +... import math +... return a / (1 + math.exp(-b)) +... +>>> v, w = 1, 0.7 +>>> z = logistfun(w, v) +>>> z + 0.6681877721681662 +``` + +#### 2.4. Функция, работающая с разными типами аргументов. + +Некоторые функции можно реализовать так, чтобы они могли работать с аргументами разных типов: + +```py +>>> def slozh(a1, a2, a3, a4): +... """ Сложение значений четырех аргументов""" +... return a1 + a2 + a3 + a4 +... +>>> slozh(1, 2, 3, 4) + 10 +>>> slozh("1", "2", "3", "4") + '1234' +>>> b1 = [1, 2]; b2 = [-1, -2]; b3 = [0, 2]; b4 = [-1, -1] +>>> q = slozh(b1, b2, b3, b4) +>>> q + [1, 2, -1, -2, 0, 2, -1, -1] +``` + +Данная функция может работать и с кортежами, но вот при работе со словарями и множествами уже получается ошибка: + +```py +>>> slozh((1, 2), (3, 4), (5, 6), (7, 8)) # Сложение кортежей + (1, 2, 3, 4, 5, 6, 7, 8) +>>> slozh({"A" : 1, "B" : 2}, {"C" : 3, "D" : 4}, {"E" : 5, "F" : 6}, {"G" : 7, "H" : 8}) # Сложение словарей + Traceback (most recent call last): + File "", line 1, in + slozh({"A" : 1, "B" : 2}, {"C" : 3, "D" : 4}, {"E" : 5, "F" : 6}, {"G" : 7, "H" : 8}) + File "", line 3, in slozh + return a1 + a2 + a3 + a4 + TypeError: unsupported operand type(s) for +: 'dict' and 'dict' +>>> slozh({1, 2}, {3, 4}, {5, 6}, {7, 8}) # Сложение множеств + Traceback (most recent call last): + File "", line 1, in + slozh({1, 2}, {3, 4}, {5, 6}, {7, 8}) + File "", line 3, in slozh + return a1 + a2 + a3 + a4 + TypeError: unsupported operand type(s) for +: 'set' and 'set' +``` + +#### 2.5. Функция, реализующая некоторую модель. + +С помощью функций можно легко реализовывать модели некоторых устройств. Так, например, следующая функция реализует модель устройства, преобразующего вид входного сигнала. + +```py +>>> def inerz(x, T, ypred): +... """Модель устройства с памятью: +... x - текущее значение вх. сигнала, +... T - постоянная времени, +... ypred - предыдущее значение выхода устройства""" +... y = (x + T * ypred) / (T + 1) +... return y +... +>>> sps = [0] + [1] * 100 +>>> spsy = [] # Подготовлен список для значений выходного сигнала +>>> TT = 20 # Постоянная времени +>>> yy = 0 # Нулевое начальное условие +>>> for xx in sps: +... yy = inerz(xx, TT, yy) +... spsy.append(yy) +... +>>> import pylab +>>> pylab.plot(spsy) + [] +>>> pylab.xlabel("Время, сек.") + Text(0.5, 0, 'Время, сек.') +>>> pylab.ylabel("Выходной сигнал") +... Text(0, 0.5, 'Выходной сигнал') +>>> pylab.grid(True) +>>> pylab.show() +``` + +Полученный график выходного сигнала: + +![Скриншот полученного графика работы устройства](pictures/figure1.png) + +### 3. Функции как объекты. + +#### 3.1. Атрибуты объекта-функции. + +Так как функции являются объектами, то у них есть некоторые атрибуты. Получить их список можно с помощью инструкции dir(). + +```py +>>> 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__'] +>>> inerz.__doc__ # Использование атрибута объекта-функции + 'Модель устройства с памятью:\n x - текущее значение вх. сигнала,\n T - постоянная времени,\n ypred - предыдущее значение выхода устройства' +>>> help(inerz) # Получение помощи по объекту-функции + Help on function inerz in module __main__: + + inerz(x, T, ypred) + Модель устройства с памятью: + x - текущее значение вх. сигнала, + T - постоянная времени, + ypred - предыдущее значение выхода устройства +``` + +#### 3.2. Ссылка на объект-функцию. + +Ссылку на объект-функцию можно присваивать переменным, а затем обращаться к ним как к самой функции: + +```py +>>> fnkt = sravnenie +>>> v = 16 +>>> fnkt(v, 23) +>>> 16 меньше 23 +``` + +#### 3.3. Альтернативное определение функций. + +Функции могут быть определены разным образом в зависимости от особенностей реализации кода: + +```py +>>> typ_fun = 8 +>>> if typ_fun == 1: +... def func(): +... print("Функция 1") +... else: +... def func(): +... print("Функция 2") +... +>>> func() + Функция 2 +``` + +### 4. Аргументы функции. + +#### 4.1. Использование фунции в качестве аргумента. + +В качестве аргумента функции может выступать и другая функция: + +```py +>>> def fun_arg(fff, a, b, c): +... """fff - имя функции, используемой в качестве аргумента""" +... return(a + fff(c, b)) +... +>>> zz = fun_arg(logistfun, -3, 1, 0.7) +>>> zz + -2.3318122278318336 +``` + +#### 4.2. Обязательные и необязательные аргументы. + +Аргументы функции могут быть необязательными, т.е. иметь некоторое значение, заданное по умолчанию: + +```py +>>> 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. Расположение аргументов функции. + +К функции можно обращаться с произвольным (непозиционным) расположением аргументов, при этом необходимо указывать их имена: + +```py +>>> logistfun(b = 0.5, a = 0.8) + 0.34498724056380625 +>>> logistfun(0.8, 0.5) + 0.34498724056380625 +``` + +#### 4.4. Аргументы функции, содержащиеся в списке или кортеже. + +Аргументы функции могут содержаться в списке или кортеже, в таком случае при их передаче в функцию необходима распаковка с помощью оператора " __*__ ". + +```py +>>> b1234 = [b1, b2, b3, b4] +>>> slozh(*b1234) + [1, 2, -1, -2, 0, 2, -1, -1] +>>> slozh(b1, b2, b3, b4) + [1, 2, -1, -2, 0, 2, -1, -1] +``` + +#### 4.5. Аргументы функции, содержащиеся в словаре. + +Аналогичная ситуация происходит и с аргументами, представленными в виде словаря. Однако распаковка в таком случае проводится с помощью оператора " __**__ ". Важно также заметить, что имена ключей словаря с аргументами не должны совпадать с именами остальных переданных аргументов, иначе произойдет ошибка. + +```py +>>> dic4 = {"a1" : 1, "a2" : 2, "a3" : 3, "a4" : 4} +>>> slozh(**dic4) + 10 +``` + +#### 4.6. Смешанные ссылки. + +Данные способы передачи аргументов в функцию можно комбинировать: + +```py +>>> e1 = (-1, 6) +>>> dd2 = {"a3" : 3, "a4" : 4} +>>> slozh(*e1, **dd2) + 12 +``` + +#### 4.7. Переменное число аргументов у функции. + +Число аргументов у функции может быть произвольным, что осуществляется с помощью того же оператора " __*__ ". + +```py +>>> def func4(*kort7): +... """Произвольное число элементов в составе кортежа""" +... smm = 0 +... for el in kort7: +... smm += el +... return smm +... +>>> func4(-1, 2) + 1 +>>> func4(-1, 2, 0, 3, 6) + 10 +``` + +#### 4.8. Комбинация аргументов. + +Данные способы передачи аргументов также можно комбинировать: + +```py +>>> def func4(a, b = 7, *kort7): +... """Кортеж - сборка аргументов - должен быть последним!""" +... smm = 0 +... for el in kort7: +... smm += el +... return a * smm + b +... +>>> func4(-1, 2, 0, 3, 6) + -7 +``` +Пример реализации аналогичной функции для произвольного количества аргументов, переданного в виде словаря: + +```py +>>> def func4(a, b = 7, **dict7): +... """Словарь - сборка аргументов - должен быть последним!""" +... smm = 0 +... for el in dict7.values(): +... smm += el +... return a * smm + b +... +>>> func4(-1, 2, **{"a1" : 0, "a2" : 3, "a3" : 6}) + -7 +``` + +#### 4.9. Изменение значений объектов с помощью функций. + +С помощью функций можно изменять значения переменных - объектов изменяемого типа: + +```py +>>> a = 90 +>>> def func3(b): +... b = 5 * b + 67 +... +>>> func3(a) +>>> a # Числовой объект является неизменяемым + 90 +>>> sps1 = [1, 2, 3, 4] +>>> def func2(sps): +... sps[1] = 99 +... +>>> func2(sps1) +>>> sps1 # Список - изменяемый объект + [1, 99, 3, 4] +>>> kort = (1, 2, 3, 4) +>>> func2(kort) # Кортеж также является неизменяемым + Traceback (most recent call last): + File "", line 1, in + func2(kort) + File "", line 2, in func2 + sps[1] = 99 + TypeError: 'tuple' object does not support item assignment +``` + +### 5. Специальные типы пользовательских функций. + +#### 5.1. Анонимные функции. + +Анонимные функции - лямбда-функциями - это функции без имени , определяемые по следующей схеме: +__lambda [[<Список аргументов >]]: <Возвращаемое значение или выражение>__ +Анонимная функция возвращает ссылку на объект-функцию, которую можно присвоить другому объекту. + +```py +>>> anfun1 = lambda: 1.5 + math.log10(12.23) +>>> anfun1() + 2.5874264570362855 +>>> anfun2 = lambda a, b: a + math.log10(b) +>>> anfun2(17, 234) + 19.369215857410143 +>>> anfun3 = lambda a, b = 234: a + math.log10(b) +>>> anfun3(100) + 102.36921585741014 +``` + +#### 5.2. Функции-генераторы. + +Функции-генераторы - функции, использующиеся в итерационных процессах, позволяющие на каждой из итераций получать значение с помощью инструкции __yield__, приостанавливающей выполнение функции. + +```py +>>> def func5(diap, shag): +... """Итератор, возвращающий значения из диапазона от 1 до diap с шагом shag""" +... for i in range(1, diap + 1, shag): +... yield i +... +>>> for mm in func5(7, 3): +... print(mm) +... + 1 + 4 + 7 +``` + +При работе с такими функциями часто используют метод __/_/_next/_/___, активирующий очередную итерацию выполнения функции: + +```py +>>> 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. Примеры на локализацию объектов в функциях. + +Локальный и глобальный объекты могут иметь одинаоковое имя: + +```py +>>> glb = 10 +>>> def func7(arg): +... loc1 = 15 +... glb = 8 +... return loc1 * arg +... +>>> func7(glb) + 150 +>>> glb # Значение не измени лось, т.к. операции проводились над локальной переменной + 10 +``` + +При использовании локального объекта до его определения будет ошибка: + +```py +>>> def func8(arg): +... loc1 = 15 +... print(glb) +... glb = 8 +... return loc1 * arg +... +>>> func8(glb) + Traceback (most recent call last): + File "", line 1, in + func8(glb) + File "", line 3, in func8 + print(glb) + UnboundLocalError: cannot access local variable 'glb' where it is not associated with a value +``` + +Локализацию объекта можно переопределить с помощью дескриптора __global__: + +```py +>>> glb = 11 +>>> def func7(arg): +... loc1 = 15 +... global glb +... print(glb) +... glb = 8 +... return loc1 * arg +... +>>> func7(glb) + 11 + 165 +>>> glb # Значение изменилось, т.к. была переопределена локализация объекта + 8 +``` + +#### 6.2. Функции для выявления локализации объектов. + +Чтобы узнать текущую локализацию объекта можно использовать функции __globals()__ и __locals()__, которые возвращают словари с ключами - именами объектов, являющихся, соответственно, глобальными или локальными на уровне вызова этих функций. + +```py +>>> globals().keys() + dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8']) +>>> locals().keys() + dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8']) +``` + +Пример просмотра локальных и глобальных объектов изнутри функциии: + +```py +>>> def func8(arg): +... loc1 = 15 +... glb = 8 +... print(globals().keys()) +... print(locals().keys()) +... return loc1 * arg +... +>>> func8(glb) + dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8']) + dict_keys(['arg', 'loc1', 'glb']) + 150 +>>> "glb" in globals().keys() + True +``` + +#### 6.3. Локализация объектов во вложенных функциях. + +Локальные переменные будут различаться на разных уровнях вложенных функций: + +```py +>>> 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("glob_func9:", globals().keys()) +... print("locl_func9:", locals().keys()) +... return arg2 + arg3 * glb +... +>>> func9(10, 1) + glob_func9_1: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8', 'func9']) + locl_func9_1: dict_keys(['arg1', 'loc1', 'glb1']) + glob_func9: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'func4', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'func8', 'func9']) + locl_func9: dict_keys(['arg2', 'arg3', 'func9_1', 'loc1', 'glb']) + 85 +``` + +#### 6.4. Моделирование некоторой системы с помощью нескольких функций. + +Моделирование системы, состоящей из последовательного соединения реального двигателя, охваченного отрицательной обратной связью с тахогенератором в ней, и нелинейного звена типа "зона нечувствительности", при подаче на нее синусоидального входного сигнала. + +Этап 1 - запрос и обработка введенных параметров системы: + +```py +znach = input("k1, T, k2, Xm, A, F, N = ").split(",") +k1, T, k2, Xm, A, F, N = 7, 4, 2, 5, 2, 0.01, 100 +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]) +``` + +Этап 2 - реализация входного сигнала: + +```py +>>> import math +>>> vhod = [] +>>> for i in range(N): +... vhod.append(A * math.sin((2 * i * math.pi) / F)) +... +>>> vhod + [0.0, 7.857546894913888e-15, 1.5715093789827776e-14, -2.038010347584904e-13, 3.143018757965555e-14, -6.428332918551267e-13, -4.076020695169808e-13, -1.081865548951763e-12, ..., -7.666359036382766e-12, -6.521633112271693e-12, -5.376907188160619e-12, -1.8784096492416397e-11, -3.0874553399384703e-12] +``` + +Этап 3 - создание функций, реализующих компоненты системы: + +```py +>>> 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): +... return 0 +... elif xtt >= gran: +... return xtt - gran +... elif xtt <= (-gran): +... return xtt + gran +``` + +Этап 4 - соединение компонент в соответствии с заданием и получение выходного сигнала: + +```py +>>> 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) + y = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2.0750309723388316, 0, -12.800524758874488, 11.328734010636943, 37.9986846091337, -51.695128234754044, -93.73359277523646, 176.80628109766909, 206.3512386278131, -546.6832050741272, -399.06819555417735, 1598.4573240949626, 604.2307443815814, -4487.243599090263, -296.234076116122, 12162.217953139934, -2805.586281370296, -31870.75393905672, 17036.29869407474, 80623.4912164512, -69802.97975583967, -195996.03820751337, 245998.54033834403, 453751.31553486304, -796405.0354457049, -982958.5881199688, 2433666.144586724, 1918572.300755354, -7113910.846421458, -3041359.0662945407, 20031038.041300073, 2216408.8952286365, -54513798.16041583, 10262153.3054456, 143509014.33326405] +``` + + +### 7. Завершение работы со средой. + +Сохранил файлы отчета в своем рабочем каталоге и закончил сеанс работы с IDLE. diff --git a/TEMA7/task.md b/TEMA7/task.md new file mode 100644 index 0000000..fd63708 --- /dev/null +++ b/TEMA7/task.md @@ -0,0 +1,80 @@ +# Общее контрольное задание по теме 7 + +Степанов Артём, А-02-23 + +## Задание + +* Разработайте и проверьте функцию, реализующую для момента времени t расчет выхода y(t) для устройства задержки: на вход поступает сигнал, а на выходе повторяется этот сигнал с задержкой на заданное время Т. +* Разработайте и проверьте функцию, реализующую расчет гистограммы по выборке случайной величины с каким-то распределением. Гистограмма при выводе на экран представляется в виде таблицы: границы интервала, число элементов выборки в интервале. Аргументы функции: выборка, число интервалов разбиения диапазона изменения случайной величины. Возвращаемый результат функции: список с числами элементов выборки в интервалах разбиения. +* Разработайте и проверьте анонимную функцию, вычисляющую значение оценки отклика Y линейной регрессии при значении переменной Х +Y=b1+b2*X +и имеющую аргументы b1, b2 и X. + + +## Решение + +```py +>>> #1 +>>> +>>> def createDelay(x, T): +... """Функция для реализации задержки сигнала в определенный момент времени +... x - исходный сигнал +... T - заданная задержка""" +... return [0] * T + x +... +>>> x = [1, 2, 3, 4, 5] +>>> y = createDelay(x, 5) +>>> print(y) + [0, 0, 0, 0, 0, 1, 2, 3, 4, 5] +>>> +>>> #2 +>>> +>>> def createHistogram(x, bins): +... lowerBound = min(x) +... upperBound = max(x) +... binWidth = (upperBound - lowerBound) / bins +... binsElements = [] +... for i in range(bins): +... lower = lowerBound + i * binWidth +... upper = upperBound if i == bins - 1 else lowerBound + (i + 1) * binWidth +... binsElements.append(len(list(filter(lambda elem: lower <= elem and elem < upper, x)))) +... if i == bins - 1: binsElements[i] += x.count(upper) +... print(f"""Интервал: {i + 1} +... Нижняя граница: {lower} +... Верхняя граница: {upper} +... Число элементов: {binsElements[i]} +... """) +... return binsElements +... +>>> import random +>>> x = [random.gauss(5, 10) for i in range(100)] +>>> elementsNum = createHistogram(x, 4) + Интервал: 1 + Нижняя граница: -22.9123782025076 + Верхняя граница: -8.994907250763529 + Число элементов: 7 + + Интервал: 2 + Нижняя граница: -8.994907250763529 + Верхняя граница: 4.922563700980543 + Число элементов: 50 + + Интервал: 3 + Нижняя граница: 4.922563700980543 + Верхняя граница: 18.840034652724615 + Число элементов: 39 + + Интервал: 4 + Нижняя граница: 18.840034652724615 + Верхняя граница: 32.75750560446868 + Число элементов: 4 + +>>> print(elementsNum) + [7, 50, 39, 4] +>>> +>>> #3 +>>> +>>> regression = lambda X, b1, b2: b1 + b2 * X +>>> regression(3, 7, 1) + 10 +``` \ No newline at end of file