Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
17
Добавлен:
09.08.2021
Размер:
202.68 Кб
Скачать

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

>>>func5(x=3,y=4,z=5)

7

{'x': 3, 'y': 4, 'z': 5}

#Пункт 4.9

>>>a=90

>>>def func3(b): b=5*b+67

>>>func3(a)

>>>print(a)

90

#Значение a не изменилось.

>>>sps1=[1,2,3,4]

>>>def func2(sps): sps[1]=99

>>>func2(sps1)

>>>print(sps1) [1, 99, 3, 4]

#Второе значение в списке sps1 изменилось и стало равно 99 после вызова функции func2 с аргументом sps1.

>>>kort=(1,2,3,4)

>>>func2(kort)

Traceback (most recent call last):

File "<pyshell#83>", line 1, in <module> func2(kort)

File "<pyshell#78>", line 2, in func2 sps[1]=99

TypeError: 'tuple' object does not support item assignment

#При вызове функции func2 с аргументом-кортежем выдается ошибка, так как кортеж - неизменяемый тип объекта, а в функции делается попытка изменить второй элемент кортежа.

#Пункт 5.1

>>>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

>>>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__())

6

Traceback (most recent call last):

File "<pyshell#103>", line 1, in <module> print(alp.__next__())

StopIteration

#При очередном выполнении инструкции выдается ошибка, в которой говорится о том, что произошло прекращение итераций (все итерации пройдены).

#Пункт 5.3

>>> def func_dec(ff): print("Функция:",ff) return ff

>>> @func_dec def func6(aa):

return math.log10(aa)+12*math.sin(aa)

Функция: <function func6 at 0x000001CB95A90678>

>>>bb=1234

>>>func_dec(func6)(bb)

Функция: <function func6 at 0x000001CB95A90678> 10.31444701684719

#Пункт 6.1

>>>glb=10

>>>def func7(arg): loc1=15 glb=8

return loc1*arg

>>>res=func7(glb)

>>>print(res)

150

#При получении результата использовались значения локального объекта loc1=15 и глобального объекта glb=10; возвращаемое функцией значение не зависит от локального объекта glb=8.

>>>print(glb)

10

#Значение глобального объекта не изменилось.

>>>def func8(arg): loc1=15 print(glb) glb=8

return loc1*arg

>>>res=func8(glb)

Traceback (most recent call last):

File "<pyshell#124>", line 1, in <module> res=func8(glb)

File "<pyshell#123>", line 3, in func8 print(glb)

UnboundLocalError: local variable 'glb' referenced before assignment

#Ошибка возникает, так как в функции локальный объект glb вызывается на печать до того, как его определили. Глобальный объект glb используется в функции под именем arg и не имеет отношения к ошибке.

>>>glb=11

>>>def func7(arg): loc1=15 global glb print(glb) glb=8

return loc1*arg

>>>res=func7(glb)

11

>>> print(glb) 8

#После завершения работы функции значение глобального объекта изменилось, так как в теле функции он был определен как глобальный, а не локальный, и после этого ему было присвоено новое значение.

#Пункт 6.2

7

>>> globals().keys()

dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', 'logistfun', 'slozh', 'b1', 'b2', 'b3', 'b4', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func42', 'slv', 'func5', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'mm', 'alp', 'func_dec', 'func6', 'bb', 'glb', 'func7', 'res', 'func8', 'uspeh', 'sravnenie', 'n', 'm', 'v', 'w', 'q', 'c1', 'c2', 'c3', 'c4', 'q2', 'd1', 'd2', 'd3', 'd4', 'i1', 'i2', 'i3', 'i4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'pylab', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz'])

#По инструкции выводятся имена глобальных объектов.

>>> locals().keys

<built-in method keys of dict object at 0x000001CB94C6F138>

#По инструкции не выводятся имена локальных объектов. К локальному объекту нельзя обратиться из глобальной области видимости, можно обратиться только в момент выполнения тела функции, в которой этот объект находится.

>>>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__', 'logistfun', 'slozh', 'b1', 'b2', 'b3', 'b4', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func42', 'slv', 'func5', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'mm', 'alp', 'func_dec', 'func6', 'bb', 'glb', 'func7', 'res', 'func8', 'uspeh', 'sravnenie', 'n', 'm', 'v', 'w', 'q', 'c1', 'c2', 'c3', 'c4', 'q2', 'd1', 'd2', 'd3', 'd4', 'i1', 'i2', 'i3', 'i4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'pylab', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz']) dict_keys(['arg', 'loc1', 'glb'])

#Перечень имен глобальных объектов не изменился. В перечне имен локальных объектов появились имена arg, loc1, glb - локальных объектов, находящихся в теле функции func8.

>>>'glb' in globals().keys()

True

#Объект glb есть в перечне глобальных объектов.

#Пункт 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__', 'logistfun', 'slozh', 'b1', 'b2', 'b3', 'b4', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func42', 'slv', 'func5', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'mm', 'alp', 'func_dec', 'func6', 'bb', 'glb', 'func7', 'res', 'func8', 'uspeh', 'sravnenie', 'n', 'm', 'v', 'w', 'q', 'c1', 'c2', 'c3', 'c4', 'q2', 'd1', 'd2', 'd3', 'd4', 'i1', 'i2', 'i3', 'i4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'pylab', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'hh', 'func9', 'loc1'])

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__', 'logistfun', 'slozh', 'b1', 'b2', 'b3', 'b4', 'b1234', 'qq', 'dic4', 'qqq', 'e1', 'dd2', 'qqqq', 'func4', 'func42', 'slv', 'func5', 'a', 'func3', 'sps1', 'func2', 'kort', 'anfun1', 'math', 'anfun2', 'anfun3', 'mm', 'alp', 'func_dec', 'func6', 'bb', 'glb', 'func7', 'res', 'func8', 'uspeh', 'sravnenie', 'n', 'm', 'v', 'w', 'q', 'c1', 'c2', 'c3', 'c4', 'q2', 'd1', 'd2', 'd3', 'd4', 'i1', 'i2', 'i3', 'i4', 'inerz', 'sps', 'spsy', 'TT', 'yy', 'xx', 'pylab', 'fnkt', 'typ_fun', 'func', 'fun_arg', 'zz', 'hh', 'func9', 'loc1'])

#Перечни имен глобальных объектов для функций func9 и func9_1 совпадают. Перечень имен локальных объектов func9_1 содержит объекты arg1, loc1=15, glb1=1. Перечень имен локальных объектов func9 содержит объекты arg2, arg3, loc1=5, glb1=func9_1(loc1). При вызове func9 с аргументами 10 и 1 значение kk получается равным 10+1*(15*5)=85.

>>>print(kk)

85

#Пункт 6.4

>>>znach=input('k1,T,k2,Xm,A,F,N=').split(',') k1,T,k2,Xm,A,F,N=3,10,2,0.2,1,2,5

>>>k1=float(znach[0])

>>>T=float(znach[1])

8

>>>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))

>>> print(vhod)

[0.0, 1.2246467991473532e-16, -2.4492935982947064e-16, 3.6739403974420594e-16, -4.898587196589413e-16]

>>> 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) y= [0, 0, 0, 0, 0]

9

Соседние файлы в папке Лабораторные_Python