diff --git a/TEMA7/IKZ.md b/TEMA7/IKZ.md new file mode 100644 index 0000000..865dd3b --- /dev/null +++ b/TEMA7/IKZ.md @@ -0,0 +1,4 @@ +12. Разработайте анонимную функцию с 3 аргументами: х, a, b, вычисляющую значение exp(-(x-a)2/b)/(2*π*b)1/2. Рассчитайте значения функции в диапазоне значений х от a-3*b1/2 до a+3*b1/2 с шагом 0.2*b1/2 и запишите эти значения в текстовый файл по два значения на строке, разделенных запятыми. +```py + +``` \ No newline at end of file diff --git a/TEMA7/IKZ.txt b/TEMA7/IKZ.txt new file mode 100644 index 0000000..159c14a --- /dev/null +++ b/TEMA7/IKZ.txt @@ -0,0 +1,15 @@ +3.48132629866869e-05,0.00011105198605141639 +0.0003270125124308196,0.0008889121702194339 +0.0022305387662290435,0.005166746338523005 +0.011047930833002744,0.0218072646584863 +0.03973542691931943,0.06683608675088473 +0.10377687435514864,0.1487464465643672 +0.19681085792857178,0.24038532470982693 +0.2710336967762158,0.28209479177387814 +0.2710336967762158,0.24038532470982693 +0.19681085792857178,0.1487464465643672 +0.10377687435514864,0.06683608675088476 +0.039735426919319465,0.021807264658486338 +0.011047930833002768,0.0051667463385230185 +0.002230538766229052,0.0008889121702194355 +0.0003270125124308196,0.00011105198605141618 diff --git a/TEMA7/pic1.png b/TEMA7/pic1.png new file mode 100644 index 0000000..4a800e0 Binary files /dev/null and b/TEMA7/pic1.png differ diff --git a/TEMA7/report.md b/TEMA7/report.md new file mode 100644 index 0000000..60fefa4 --- /dev/null +++ b/TEMA7/report.md @@ -0,0 +1,449 @@ +# Отчет по теме 7 + +Хатюхин Евгений, А-02-23 + +# 1 Запуск интерактивной оболочки IDLE + +Была запущена интерактивная оболочка IDLE. + +# 2 Изучение создания простых функций + +## 2.1 Первый пример: функция – без аргументов +```py +def uspeh(): + """Подтверждение успеха операции""" + print('Выполнено успешно!') + +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 Пример функции с аргументами +```py +def sravnenie(a,b): + """Сравнение a и b""" + if a>b: + print(a,' больше ',b) + elif a", line 1, in + sl=slozh(sl1, sl2, sl3, sl4) + File "", line 3, in slozh + return a1+a2+a3+a4 +TypeError: unsupported operand type(s) for +: 'dict' and 'dict' +mn1 = {"A", "B"}; mn2 = {"C", "D"}; mn3 = {"E", "F"}; mn4 = {"H", "J"} +mn=slozh(mn1, mn2, mn3, mn4) +Traceback (most recent call last): + File "", line 1, in + mn=slozh(mn1, mn2, mn3, mn4) + File "", line 3, in slozh + return a1+a2+a3+a4 +TypeError: unsupported operand type(s) for +: 'set' and 'set' +``` +## 2.5 Функция, реализующая модель некоторого устройства, на вход которого в текущий момент поступает сигнал х, на выходе получается сигнал y +```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 +spsm = list(range(101)) +pylab.plot(spsm, spsy) +[] +pylab.show() +``` +![[TEMA7/pic1.png]] +# 3 Функции как объекты +## 3.1 Получение списка атрибутов объекта-функции +```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__', '__type_params__'] +inerz.__doc__ +'Модель устройства с памятью:\nx- текущее значение вх.сигнала,\nT -постоянная времени,\nypred - предыдущее значение выхода устройства' +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-имя функции, используемой + в качестве аргумента функции fun_arg""" + return a+fff(c,b) + +zz=fun_arg(logistfun,-3,1,0.7) +zz +-2.3318122278318336 +``` +## 4.2 Обязательные и необязательные аргументы +```py +def logistfun(a,b=1): #Аргумент b – необязательный; значение по умолчанию=1 + """Вычисление логистической функции""" + import math + return b/(1+math.exp(-a)) + +logistfun(0.7) #Вычисление со значением b по умолчанию +0.6681877721681662 +logistfun(0.7,2) #Вычисление с заданным значением b +1.3363755443363323 +``` +## 4.3 Изучите возможность обращения к функции с произвольным (непозиционным) расположением аргументов. При этом надо в обращении к функции указывать имена аргументов +```py +logistfun(b=0.5,a=0.8) # Ссылки на аргументы поменялись местами +0.34498724056380625 +``` +## 4.4 Пример со значениями аргументов функции, содержащимися в списке или кортеже +```py +b1234=[b1,b2,b3,b4] # Список списков из п.2.4 +qq=slozh(*b1234) #Перед ссылкой на список или кортеж надо ставить звездочку +qq +[1, 2, -1, -2, 0, 2, -1, -1] +``` +## 4.5 Пример со значениями аргументов функции, содержащимися в словаре +```py +dic4={"a1":1,"a2":2,"a3":3,"a4":4} +qqq=slozh(**dic4) #Перед ссылкой на словарь надо ставить две звездочки +qqq +10 +``` +## 4.6 Смешанные ссылки +```py +e1=(-1,6);dd2={'a3':3,'a4':9} +qqqq=slozh(*e1,**dd2) +qqqq +17 +``` +## 4.7 Переменное число аргументов у функции +```py +def func4(*kort7): + """Произвольное число аргументов в составе кортежа""" + smm=0 + for elt in kort7: + smm+=elt + return smm + +func4(-1,2) #Обращение к функции с 2 аргументами +1 +func4(-1,2,0,3,6) #Обращение к функции с 5 аргументами +10 +``` +## 4.8 Комбинация аргументов +```py +def func4(a,b=7,*kort7): #Аргументы: a-позиционный, b- по умолчанию + кортеж + """Кортеж - сборка аргументов - должен быть последним!""" + smm=0 + for elt in kort7: + smm+=elt + return a*smm+b + +func4(-1,2,0,3,6) +-7 +def func5(**slovar): + print(slovar) + + +func5(a=5, n=8, m=30) +{'a': 5, 'n': 8, 'm': 30} +``` +## 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) +print(sps1) +[1, 99, 3, 4] +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 Анонимные функции +```py +import math +anfun1=lambda: 1.5+math.log10(17.23) +anfun1() +2.7362852774480286 +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 Функции-генераторы +```py +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 Примеры на локализацию объектов +```py +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) +Traceback (most recent call last): + File "", line 1, in + res=func8(glb) + 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) +11 +glb +8 +res +165 +``` +## 6.2 Выявление локализации объекта с помощью функций **locals**() и **globals**() из **builtins**. Эти функции возвращают словари, ключами в которых будут имена объектов, являющихся, соответственно, локальными или глобальными на уровне вызова этих функций. +```py +globals().keys() #Перечень глобальных объектов +dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'kor', 'kor2', 'kor3', 'kor4', 'k', 'sl1', 'sl2', 'sl3', 'sl4', 'mn1', 'mn2', 'mn3', 'mn4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'pylab', 'spsm', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) +locals().keys() #Перечень локальных объектов +dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'kor', 'kor2', 'kor3', 'kor4', 'k', 'sl1', 'sl2', 'sl3', 'sl4', 'mn1', 'mn2', 'mn3', 'mn4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'pylab', 'spsm', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', '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__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'kor', 'kor2', 'kor3', 'kor4', 'k', 'sl1', 'sl2', 'sl3', 'sl4', 'mn1', 'mn2', 'mn3', 'mn4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'pylab', 'spsm', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) +dict_keys(['arg', 'loc1', 'glb']) +'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('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__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'kor', 'kor2', 'kor3', 'kor4', 'k', 'sl1', 'sl2', 'sl3', 'sl4', 'mn1', 'mn2', 'mn3', 'mn4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'pylab', 'spsm', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', '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__', 'uspeh', 'sravnenie', 'n', 'm', 'logistfun', 'v', 'w', 'z', 'slozh', 'b1', 'b2', 'b3', 'b4', 'q', 'kor', 'kor2', 'kor3', 'kor4', 'k', 'sl1', 'sl2', 'sl3', 'sl4', 'mn1', 'mn2', 'mn3', 'mn4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'pylab', 'spsm', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func5', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'mm', 'alp', 'glb', 'func7', 'res', 'func8', 'hh', 'func9']) +``` +## 6.4 Изучение моделирования системы управления +```py +znach=input('k1,T,k2,Xm,A,F,N=').split(',') +k1,T,k2,Xm,A,F,N=0.5,20,0.4,4,500,3,20 +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]) +import math +vhod=[] +for i in range(N): + vhod.append(A*math.sin((2*i*math.pi)/F)) + + +vhod +[0.0, 433.01270189221935, -433.01270189221924, -1.2246467991473532e-13, 433.0127018922196, -433.01270189221935, -2.4492935982947065e-13, 433.01270189221964, -433.01270189221884, -3.6739403974420595e-13, 433.01270189221924, -433.0127018922188, -4.898587196589413e-13, 433.0127018922193, -433.01270189221873, -2.388680238973927e-12, 433.01270189222026, -433.0127018922196, -7.347880794884119e-13, 433.0127018922203] + +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): + 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) +y= [0, 6.309826235529032, 5.720693307784519, 4.968847476186754, 14.286445614770301, 12.400181295661117, 9.997205811462539, 17.278643969265367, 12.961026991542283, 7.7449834822612225, 11.871264907194353, 4.124191275490627, 0, 0, -7.526937601525441, -19.612892932469897, -21.914417647034767, -35.27028550613399, -48.470270262535614, -50.71225182595774] +``` +## 7 Завершение работы в IDLE \ No newline at end of file diff --git a/TEMA7/task.md b/TEMA7/task.md new file mode 100644 index 0000000..5e089f9 --- /dev/null +++ b/TEMA7/task.md @@ -0,0 +1,69 @@ +Хатюхин Евгений, А-02-23 +# Задание +Общее контрольное задание. +• Разработайте и проверьте функцию, реализующую для момента времени t расчет выхода y(t) для устройства задержки: на вход поступает сигнал, а на выходе повторяется этот сигнал с задержкой на заданное время Т. +• Разработайте и проверьте функцию, реализующую расчет гистограммы по выборке случайной величины с каким-то распределением. Гистограмма при выводе на экран представляется в виде таблицы: границы интервала, число элементов выборки в интервале. Аргументы функции: выборка, число интервалов разбиения диапазона изменения случайной величины. Возвращаемый результат функции: список с числами элементов выборки в интервалах разбиения. +• Разработайте и проверьте анонимную функцию, вычисляющую значение оценки отклика Y линейной регрессии при значении переменной Х Y=b1+b2*X и имеющую аргументы b1, b2 и X. +## Решение +```py +def signal_zaderzka(vhod, zaderzka, vihod): + return vhod-zaderzka if len(vihod)>=zaderzka else 0 + +t_zaderzka = 3 +vihod = [] +vhod = [1, 2, 3, 4, 5] +for i in vhod: + vihod = vihod + [signal_zaderzka(i, t_zaderzka, vihod)] + +def signal_zaderzka(vhod, zaderzka, vihod): + return vhod-zaderzka if len(vihod)>=zaderzka else 0 + +zaderzka = 3 +vihod = [] +vhod = [1, 2, 3, 4, 5] +for i in vhod: + vihod = vihod + [signal_zaderzka(i, zaderzka, vihod)] + +print("входной сигнал: ", vhod, "выходной сигнал: ", vihod) +входной сигнал: [1, 2, 3, 4, 5] выходной сигнал: [0, 0, 0, 1, 2] +def histogram(data, num_bins): + """Вычисляет и выводит гистограмму в виде таблицы, возвращает bins и counts.""" + min_val, max_val = min(data), max(data) + bin_width = (max_val - min_val) / num_bins + bins = [min_val + i * bin_width for i in range(num_bins + 1)] #список границ интервалов + counts = [] + for i in range(num_bins): + count = 0 + for x in data: + if bins[i] <= x < bins[i+1] or (x == max_val and i == num_bins - 1): + count += 1 + counts.append(count) + + print("Гистограмма:") + for i in range(num_bins): + print(f"Интервал: [{bins[i]:.2f}, {bins[i+1]:.2f}], Элементов: {int(counts[i])}") + + return bins, counts + +import random + +data = [random.gauss(0, 1) for _ in range(1000)] +num_bins = 10 +bins, counts = histogram(data, num_bins) +Гистограмма: +Интервал: [-2.97, -2.30], Элементов: 7 +Интервал: [-2.30, -1.62], Элементов: 43 +Интервал: [-1.62, -0.94], Элементов: 118 +Интервал: [-0.94, -0.26], Элементов: 231 +Интервал: [-0.26, 0.42], Элементов: 266 +Интервал: [0.42, 1.10], Элементов: 174 +Интервал: [1.10, 1.78], Элементов: 122 +Интервал: [1.78, 2.46], Элементов: 30 +Интервал: [2.46, 3.13], Элементов: 8 +Интервал: [3.13, 3.81], Элементов: 1 +anon = lambda b1, b2, X: b1+b2*X +Y = anon(1,2,3) +Y +7 + +``` \ No newline at end of file