diff --git a/TEMA7/Figure_1.png b/TEMA7/Figure_1.png new file mode 100644 index 0000000..cacfbb2 Binary files /dev/null and b/TEMA7/Figure_1.png differ diff --git a/TEMA7/Figure_2.png b/TEMA7/Figure_2.png new file mode 100644 index 0000000..18323ba Binary files /dev/null and b/TEMA7/Figure_2.png differ diff --git a/TEMA7/report.md b/TEMA7/report.md new file mode 100644 index 0000000..1c8bde2 --- /dev/null +++ b/TEMA7/report.md @@ -0,0 +1,533 @@ +# Отчет по теме 7 + +Девятова Мария, А-03-23 + +## 1 Запуск IDLE + +## 2 Создание пользовательской функции + +### 2.1 Первый пример: функция – без аргументов. + +``` +def uspeh(): + """Подтверждение успеха операции""" + print('Выполнено успешно!') + +uspeh() +Выполнено успешно! +type(uspeh) + +dir() +['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'os', 'uspeh'] +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 + mm=slozh(m1,m2,m3,m4); mm + File "", line 3, in slozh + return a1+a2+a3+a4 +TypeError: unsupported operand type(s) for +: 'set' and 'set' +d1={'fruit': ['orange', 'apple']}; d2={'coffee': ['espresso', 'latte'], 'tea': ['black tea', 'green tea']}; d3={'antonyms': ['ice', 'fire']}; d4={'colour': ['white', 'yellow']} +dd=slozh(d1,d2,d3,d4); dd +Traceback (most recent call last): + File "", line 1, in + dd=slozh(d1,d2,d3,d4); dd + File "", line 3, in slozh + return a1+a2+a3+a4 +TypeError: unsupported operand type(s) for +: 'dict' and 'dict' +``` + +### 2.5 Функция, реализующая модель некоторого устройства, на вход которого в текущий момент поступает сигнал х, на выходе получается сигнал y + +``` +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('t, time'); pylab.ylabel('y, output signal') +Text(0.5, 0, 't, time') +Text(0, 0.5, 'y, output signal') +pylab.show() +``` + +![График](Figure_1.png) + +## 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__ +'Модель устройства с памятью:\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]; b1234 +[[1, 2], [-1, -2], [0, 2], [-1, -1]] +qq=slozh(*b1234); qq +[1, 2, -1, -2, 0, 2, -1, -1] +``` + +### 4.5 Пример со значениями аргументов функции, содержащимися в словаре + +``` +dic4={"a1":1,"a2":2,"a3":3,"a4":4} +qqq=slozh(**dic4) +qqq +10 +``` + +### 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 +``` + +Со словарем: + +``` +def func44(a,b=7,**dict11): + """Словарь - сборка аргументов - должен быть последним!""" + smm=0 + for elt in dict11.values(): + smm+=elt + return a*smm+b + +dddd={'c1': 2, 'c2': 0, 'c3': 3, 'c4': 6} +func44(-1, **dddd) +-4 +``` + +### 4.9 Изменение значений объектов, используемых в качестве аргументов функции. + +Такое изменение возможно только у объектов изменяемого типа (например, списки). + +``` +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 Анонимные функции + +Анонимные функции или по-другому лямбда-функции – функции без имени + +``` +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 Функции-генераторы + +``` +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 +``` + +## 6 Локализация объектов в функциях + +### 6.1 Примеры на локализацию объектов + +Пример 1. Одноименные локальный и глобальный объекты + +``` +glb=10 +def func7(arg): + loc1=15 + glb=8 + return loc1*arg + +res=func7(glb); res +150 +glb +10 +``` + +Пример 2. Ошибка в использовании локального объекта. + +``` +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 внутри пользовательской функции присваивается значение, поэтому print принимает именно локальную переменную. +Но из-за того, что присваивание значения происходит после print, происходит ошибка. + +Пример 3. Переопределение локализации объекта + +``` +glb=11 +def func7(arg): + loc1=15 + global glb + print(glb) + glb=8 + return loc1*arg + +res=func7(glb); res; glb +11 +165 +8 +``` + +### 6.2 Выявление локализации объекта с помощью функций locals() и globals() из builtins + +``` +globals().keys() +dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) +locals().keys() +dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'os', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) +``` + +В возвращенных списках элементы совпадают, т.к. locals() вернул локальные объекты на уровне рабочего пространства, где содержатся глобальные. + +``` +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__', 'os', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8']) +dict_keys(['arg', 'loc1', 'glb']) +'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__', 'os', '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__', 'os', 'anfun1', 'math', 'anfun2', 'anfun3', 'func5', 'mm', 'alp', 'glb', 'func7', 'res', 'func8', 'hh', 'func9']) +``` + +Глобальные объекты для обеих функций совпадают. Список локальных объектов функции func9 содержит имена arg2,arg3,loc1, glb и имя вложенной функции func9_1. Среди локальных объектов вложенной функции arg1,loc1,glb1, при этом loc1 в функциях func9 и func9_1 - две разные переменные + +### 6.4 Большой пример + +Здесь происходит моделирование системы, состоящей из последовательного соединения реального двигателя, охваченного отрицательной обратной связью с тахогенератором в ней, и нелинейного звена типа «зона нечувствительности», при подаче на неё синусоидального входного сигнала. +Реальный двигатель: последовательное соединение усилителя с коэффициентом усиления k1,интегратора: y(t)=x(t)+y(t-1), и инерционного звена: y(t)=(x(t)+T*y(t-1)) / (T+1) с постоянной времени Т. +Тахогенератор: последовательное соединение усилителя с коэффициентом усиления k2 и интегратора: y(t)=x(t)+y(t-1). +Нелинейное звено типа «зона нечувствительности»: y=0 при -xm≤ x ≤xm, y=x-xm при x>xm, y=x+xm при x<-xm. +Таким образом, система характеризуется параметрами: k1, T, k2, xm. Входной сигнал характеризуется параметрами: A (амплитуда синусоиды) и F (период синусоиды). +Еще один параметр задачи : N – время (число тактов) подачи сигнала. + +``` +znach=input('k1,T,k2,Xm,A,F,N=').split(',') +k1,T,k2,Xm,A,F,N=15,10,30,0.2,5,0.001,50 +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]) +vhod=[] +for i in range(N): + vhod.append(A*math.sin((2*i*math.pi)/F)) + + +vhod +[0.0, -3.2141664592756336e-12, -6.428332918551267e-12, -5.09502586896226e-12, -1.2856665837102534e-11, -2.428411769784245e-12, -1.019005173792452e-11, -1.7951691706064795e-11, -2.571333167420507e-11, -3.347497164234534e-11, -4.85682353956849e-12, -4.8998251578625896e-11, -2.038010347584904e-11, 8.238044626927816e-12, -3.590338341212959e-11, -8.004481145118699e-11, -5.142666334841014e-11, -2.2808515245633285e-11, -6.694994328469069e-11, -3.833179518191383e-11, -9.71364707913698e-12, -5.385507511819438e-11, -9.799650315725179e-11, -1.421379311963092e-10, -4.076020695169808e-11, 6.061751729291303e-11, 1.647608925385563e-11, -2.7665338785201775e-11, -7.180676682425918e-11, 2.957095742035194e-11, -1.6008962290237398e-10, -5.871189865776288e-11, -1.0285332669682028e-10, -1.4756024522091648e-12, -4.561703049126657e-11, -8.975845853032398e-11, -1.3389988656938137e-10, -3.2522162324770265e-11, -7.666359036382766e-11, -1.2080501840288506e-10, -1.942729415827396e-11, -2.0908787448099986e-10, -1.0771015023638876e-10, -1.5185157827544617e-10, -1.9599300631450358e-10, 5.090387021377606e-11, -2.842758623926184e-10, -3.7378985864338755e-11, -8.152041390339616e-11, -1.2566184194245356e-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): + ytt=0 + elif xtt>=gran: + ytt=xtt-gran + elif xtt<=(-gran): + ytt=xtt+gran + return ytt + +vyhod=[] +yi1=0;yin1=0;yi2=0 +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.28235063576021646, -18.09317618367068, 693.569780896497, -26311.05967697136, 997855.8681822185, -37843749.77748839, 1435226439.7890663, -54431047009.38599, 2064300653896.8462, -78288723509751.45, 2969104436030480.0, -1.126034600750363e+17, 4.2704928351466476e+18, -1.6195869152587386e+20, 6.142292885938634e+21, -2.3294681835969964e+23, 8.834521764361373e+24, -3.3504975665500395e+26, 1.2706781694446622e+28, -4.8190544187315804e+29, 1.8276292179353242e+31, -6.931294540413311e+32, 2.62869752433907e+34, -9.969350796127492e+35, 3.780882143191306e+37, -1.433901772847203e+39, 5.438080893044959e+40, -2.0623953717959402e+42, 7.821646557419368e+43, -2.966364049581635e+45, 1.1249953075805503e+47, -4.266551309697657e+48, 1.6180920894178406e+50, -6.136623750159777e+51, 2.3273181605240858e+53, -8.826367789232948e+54, 3.3474051666947687e+56, -1.269505374983769e+58, 4.81460658885228e+59, -1.8259423758419422e+61, 6.9248971818694355e+62, -2.626271322354932e+64] +``` + +## 7 Завершение работы \ No newline at end of file diff --git a/TEMA7/task.md b/TEMA7/task.md new file mode 100644 index 0000000..4b72cd7 --- /dev/null +++ b/TEMA7/task.md @@ -0,0 +1,57 @@ +# Общее контрольное задание по теме 7 + +Девятова Мария, А-03-23 + +## Задание + +1. Разработайте и проверьте функцию, реализующую для момента времени t расчет выхода y(t) для устройства задержки: на вход поступает сигнал, а на выходе повторяется этот сигнал с задержкой на заданное время Т. +2. Разработайте и проверьте функцию, реализующую расчет гистограммы по выборке случайной величины с каким-то распределением. Гистограмма при выводе на экран представляется в виде таблицы: границы интервала, число элементов выборки в интервале. Аргументы функции: выборка, число интервалов разбиения диапазона изменения случайной величины. Возвращаемый результат функции: список с числами элементов выборки в интервалах разбиения. +3. Разработайте и проверьте анонимную функцию, вычисляющую значение оценки отклика Y линейной регрессии при значении переменной Х, Y=b1+b2*X и имеющую аргументы b1, b2 и X. + +## Выполнение + +1. + +``` +in_signal=[math.sin(i*math.pi/3+2) for i in range(20)] +in_signal +[0.9092974268256817, 0.0942549812584854, -0.8150424455671963, -0.9092974268256817, -0.09425498125848553, 0.8150424455671966, 0.9092974268256818, 0.09425498125848654, -0.8150424455671961, -0.9092974268256818, -0.09425498125848489, 0.8150424455671961, 0.9092974268256819, 0.09425498125848501, -0.815042445567195, -0.9092974268256835, -0.0942549812584869, 0.815042445567197, 0.909297426825682, 0.09425498125848703] +def zader(s, T): + """Функция преобразования входного сигнала s в выходной с заданной задержкой T""" + s_out=[] + for i in range(len(s)+T): + if i