Python, ПОАС, ОКЗ, ИКЗ 9 и протокол по теме 7
#Общее контрольное задание по Теме 7
#Пункт 1
>>>def zap(A,T,t):
"""Функция - устройство задержки. Параметры:\nA - значение входного сигнала,\nT - время задержки,\nt - момент
времени, в который определяется сигнал на выходе.""" if t<T: y=0
else: y=A return y
#Пункт 2
>>>def calcHist(x,N):
"""Функция расчета гистограммы. Параметры:\nx - выборка,\nN - число интервалов разбиения диапазона значений
выборки."""
START=min(x); END=max(x) step=(END-START)/N start_sp=[]; end_sp=[]; hist_sp=[] for i in range(N-1):
start=START+i*step; start_sp.append(start) end=START+(i+1)*step; end_sp.append(end) hist=0
for number in x:
if start<=number<end: hist+=1 hist_sp.append(hist)
start=end; start_sp.append(start) end=END; end_sp.append(end) hist=0
for number in x:
if start<=number<=end: hist+=1 hist_sp.append(hist)
print('Интервал Число элементов') for i in range(N):
print('[',round(start_sp[i],2),',',round(end_sp[i],2),']',' ',hist_sp[i]) return hist_sp
#Проверка функции:
>>>import random
>>>x=[]; n=5
>>>for i in range(20): x.append(random.gauss(2,0.1))
>>>hist=calcHist(x,n)
Интервал |
Число элементов |
[ 1.82 , 1.89 ] |
3 |
[ 1.89 , 1.95 ] |
3 |
[ 1.95 , 2.01 ] |
7 |
[ 2.01 , 2.08 ] |
3 |
[ 2.08 , 2.14 ] |
4 |
#Произошло разбиение диапазона значений x на 5 интервалов, сумма чисел во всех интервалах равна 20.
#Пункт 3
>>> anfun=lambda b1,b2,X: b1+b2*X
#Проверка функции:
>>>Y=[]
>>>for i in range(10): Y.append(anfun(0.5,1.1,random.uniform(1,2)))
>>>print(Y)
[2.643695608890781, 2.2603471100922468, 1.7297241013354703, 1.8144885683242185, 1.9663572623472958, 1.9544480923989485, 1.777044332121957, 2.4740824168518394, 2.6948455868648042, 1.6131865562442695]
#Индивидуальное контрольное задание по Теме 7 вариант 9
1
def yy(x,yT,T):
"""Функция расчета выходного сигнала.\nx - значение входного сигнала,\nyT - значение выходного сигнала в редыдущий момент времени,\nT - постоянная времени."""
return (x+T*yT)/(T+1)
#Создание списка из значений входного синусоидального сигнала: import math
n=0; x=[]
for i in range(100): n+=2*math.pi/100 x.append(2*math.sin(n+0.35))
#Расчет последовательности значений выходных сигналов: y=[]
for i in range(len(x)): if i==0:
y.append(yy(x[i],0,3))
else: y.append(yy(x[i],y[i-1],3))
#Запись результатов в текстовый файл: import sys
vr_out=sys.stdout fp=open('xy.txt','w') sys.stdout=fp
for i in range(len(x)): print(round(x[i],2),round(y[i],2),sep=', ')
sys.stdout=vr_out fp.close()
#Протокол по Теме 7
#Пункт 1
>>>import os
>>>os.chdir('d:\\Family\\Tema7')
#Пункт 2.1
>>>def uspeh():
"""Подтверждение успеха операции"""
print('Выполнено успешно!')
>>>uspeh()
Выполнено успешно!
>>>type(uspeh) <class 'function'>
# 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<b:
print('a меньше b')
2
else:
print('a равно b')
>>>n,m=16,5;sravnenie(n,m) a больше b
>>>sravnenie('123','1231')
a меньше b
#Функцию можно выполнить с аргументами - символьными строками.
#Пункт 2.3
>>> def logistfun(b,a):
"""Вычисление логистической функции"""
import math
return a/(1+math.exp(-b))
>>>v,w=1,0.7;z=logistfun(w,v)
>>>print(z)
0.6681877721681662
#Пункт 2.4
>>>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)
>>>print(q)
[1, 2, -1, -2, 0, 2, -1, -1]
>>>c1=(0,3);c2=(0,0,4);c3=('a','b');c4=(5,6)
>>>q2=slozh(c1,c2,c3,c4)
>>>print(q2)
(0, 3, 0, 0, 4, 'a', 'b', 5, 6)
#Функцию можно применять для кортежей.
>>>d1={'a':1};d2={'b':[1,2]};d3={'c':3};d4={'d':[5,6]}
>>>q3=slozh(d1,d2,d3,d4)
Traceback (most recent call last):
File "<pyshell#28>", line 1, in <module> q3=slozh(d1,d2,d3,d4)
File "<pyshell#18>", line 3, in slozh return a1+a2+a3+a4
TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
#Функцию нельзя применять для словарей.
>>>i1={'a',1};i2={'b',1,2};i3={'c',3};i4={'d',5,6}
>>>q3=slozh(i1,i2,i3,i4)
Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module> q3=slozh(i1,i2,i3,i4)
File "<pyshell#18>", 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
>>>spsy=[]
>>>TT=20
3
>>>yy=0
>>>for xx in sps: yy=inerz(xx,TT,yy) spsy.append(yy)
>>>import pylab
>>>pylab.plot(spsy)
[<matplotlib.lines.Line2D object at 0x00000140592F9EC8>]
>>>pylab.title('Выходной сигнал') Text(0.5, 1.0, 'Выходной сигнал')
>>>pylab.xlabel('n')
Text(0.5, 0, 'n')
>>>pylab.ylabel('y') Text(0, 0.5, 'y')
>>>pylab.show()
#Пункт 3.1
>>> dir(inerz)
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> inerz.__doc__
' Модель устройства с памятью:\nxтекущее значение вх.сигнала,\n\tT -постоянная времени,\n\typred - предыдущее значение выхода устройства'
#Информация взята из определения функции и представляет собой строку-комментарий, идущую после имени и списка аргументов функции.
>>> 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)
a меньше b
#С помощью функции выполнена операция сравнения значений v=16 и 23.
#Пункт 3.3
>>>typ_fun=8
>>>if typ_fun==1: def func():
print('Функция 1')
else:
def func():
print('Функция 2')
>>> func()
Функция 2
#При выполнении этих инструкций выводится сообщение "Функция 2", так как переменная typ_fun=8 , условие if не выполняется, и выполняются инструкции для else, то есть func() определяется как функция, выводящая сообщение "Функция 2".
#Пункт 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)
>>>print(zz)
-2.3318122278318336
4
#Функцию можно использовать в качестве аргумента другой функции. В данном примере при вычислении zz функция logistfun является фактическим аргументом функции fun_arg, которая возвращает значение - результат сложения -3 и
значения, которое вычисляет функция logistfun: b/(1+math.exp(-c))=1/(1+math.exp(-0.7))=0.668...
#Пункт 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
>>>logistfun(0.8,0.5)
0.34498724056380625
#При обращении к функции с произвольным расположением аргументов при указанных именах аргументов функция возвращает то же значение, которое бы вернула в случае, если бы аргументы стояли без указания имен в соответствии со своими позициями в определении функции.
#Пункт 4.4
>>>b1234=[b1,b2,b3,b4]
>>>qq=slozh(*b1234)
>>>print(qq)
[1, 2, -1, -2, 0, 2, -1, -1]
# 4 списка объединены в один.
#Пункт 4.5
>>>dic4={"a1":1,"a2":2,"a3":3,"a4":4}
>>>qqq=slozh(**dic4)
>>>print(qqq)
10
#Сумма значений словаря равна 10.
#Пункт4.6
>>>e1=(-1,6);dd2={'a3':3,'a4':9}
>>>qqqq=slozh(*e1,**dd2)
>>>print(qqqq)
17
#Сумма значений кортежа и словаря равна 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
#В данном примере a=-1, b=2, значения кортежа: 0,3,6. Таким образом, возвращаемое значение: (-1)*(0+3+6)+2=-7
#Функция с двумя аргументами, один из которых словарь:
>>>def func5(a=7,**slv):
print(a,slv,sep='\n')
5