МКТ

Проектная работа выпускника школы 1514 Мочалова Гоши. Библиотека MKT.py умеет не все необходимое, но пользоваться ей можно, чтобы быстро построить несложные графики в векторном формате в термодинамических координатах.

Оси #

Класс Axes создает график и оси. Параметры:

Состояния #

Класс State позволяет задать состояние газа. Параметры:

Процессы в осях (и не только) #

Метод process создает линейный переход между состояниями.

Аргументы:

Метод isothermal класса Axes создает переход между состояниями по изотерме.

Аргументы:

Метод adiobatic пока не работает.

Метод marker создает точку для состояния на графике. Аргументы:

Метод line создает вспомогательные линии до осей или до начала координат. Аргументы:

Метод lines аналогичен методу line, но вместо одного состояния принимает список состояний. Аргументы:

Метод grid создает сетку на графике. Аргументы:

Прочее #

savefig(filename) - сохраняет график в файл filename

Примеры #

Файл с библиотекой MKT.py надо разместить в той же директории, что и программу для построения графика, либо прописать путь при импортировании. В системе необходимо установить latex для отображения шрифтов, либо изменить параметр ltx=False (придется иногда и переписать некоторые обозначения, которые должны быть отображены на графике).

Треугольник p~V, изохора, изобара #

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from MKT import *

axes = Axes(7, 'P/$p$', 'V/$V$', ltx=True, fontsize=42, yratio=0.6)

p1 = (1, '')
v1 = (1.5, '')

p2 = (4, '')
v2 = (6, '')

p3 = (1, '')
v3 = (6, '')

state1 = State(axes, p=p1, v=v1, xtick=False, ytick=False, patch='1', patch_pos='LT')
state2 = State(axes, p=p2, v=v2, xtick=False, ytick=False, patch='2', patch_pos='RRT')
state3 = State(axes, p=p3, v=v3, xtick=False, ytick=False, patch='3', patch_pos='RRB')

axes.process(state1,state2, arrow=True)
axes.process(state2,state3, arrow=True)
axes.process(state3,state1, arrow=True)

axes.marker(state1, ms=13)
axes.marker(state2, ms=13)
axes.marker(state3, ms=13)

axes.line(state1)

#savefig('filename.pdf')
show()

Результат:

Две изотермы с числами #

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from MKT import *

rc('text.latex', preamble=r'\usepackage[T2A]{fontenc}')
rc('text.latex', preamble=r'\usepackage[utf8]{inputenc}')
rc('text.latex', preamble=r'\usepackage[russian]{babel}')

axes = Axes(10, 'P/$p,\\textrm{кПа}$', 'V/$V,\\textrm{л}$', ltx=True, fontsize=29)

p0 = (0, '0')
p1 = (1, '100')
p2 = (2, '200')
p3 = (3, '300')
p4 = (4, '400')
p5 = (5, '500')
p6 = (6, '600')
p7 = (7, '700')
p8 = (8, '800')

v0 = (0, '0')
v1 = (1, '1')
v2 = (2, '2')
v3 = (3, '3')
v4 = (4, '4')
v5 = (5, '5')
v6 = (6, '6')
v7 = (7, '7')
v8 = (8, '8')


state81 = State(axes, p=p8, v=v1, xtick=False)
state18 = State(axes, p=p1, v=v8, ytick=False, patch='2', patch_pos='R')
state83 = State(axes, p=p8, v=v3, xtick=False)
state38 = State(axes, p=p3, v=v8, ytick=False, patch='1', patch_pos='R')

# Only for ticks
state61 = State(axes, p=p6, v=v1, xtick=False)
state41 = State(axes, p=p4, v=v1, xtick=False)
state21 = State(axes, p=p2, v=v1, xtick=False)
state01 = State(axes, p=p0, v=v1, xtick=False)
state12 = State(axes, p=p1, v=v2, ytick=False)
state14 = State(axes, p=p1, v=v4, ytick=False)
state16 = State(axes, p=p1, v=v6, ytick=False)

# plot 2 isothermes
axes.isothermal(state81, state18, arrow=True, lwmult=1.8)
axes.isothermal(state83, state38, arrow=True, lwmult=1.8)

axes.grid()
savefig('PV-t-t.png')
show()

Результат:

Линейный процесс в PV #

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from MKT import *

axes = Axes(10, 'P/$p$', 'V/$V$', ltx=True, fontsize=32)

p1 = (4, '$p_0$')
p2 = (8, '$4p_0$')
v1 = (4, '$V_0$')
v2 = (8, '$2V_0$')
state1 = State(axes, p=p2, v=v1, patch='1', patch_pos='T')
state2 = State(axes, p=p1, v=v2, patch='2', patch_pos='R')

axes.process(state1,state2, arrow=False)

axes.marker(state1, ms=7)
axes.marker(state2, ms=7)

axes.line(state1, 'xp')
axes.line(state2, 'xp')
axes.line(state1, 'yp')
axes.line(state2, 'yp')

savefig('PV-linear.png')
show()

Результат:

Перерисовать квадрат из PV в VT #

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
from MKT import *

axes = Axes(10, 'P/$P$', 'V/$V$', ltx=True, fontsize=26, yratio=0.8)

v14 = (2, '')
v23 = (8, '')
p12 = (8, '')
p34 = (2, '')
state1 = State(axes, v=v14, p=p12, patch='$1$', patch_pos='L', xtick=False, ytick=False)
state2 = State(axes, v=v23, p=p12, patch='$2$', patch_pos='R', xtick=False, ytick=False)
state3 = State(axes, v=v23, p=p34, patch='$3$', patch_pos='R', xtick=False, ytick=False)
state4 = State(axes, v=v14, p=p34, patch='$4$', patch_pos='L', xtick=False, ytick=False)
axes.process(state1, state2)
axes.process(state2, state3)
axes.process(state3, state4)
axes.process(state4, state1)
axes.marker(state1, ms=13)
axes.marker(state2, ms=13)
axes.marker(state3, ms=13)
axes.marker(state4, ms=13)
savefig('PV-square.png')


### MAKE VT for same points
axes = Axes(10, 'V/$V$', 'T/$T$', ltx=True, fontsize=26, yratio=0.8)
nuR=6 # mol * J / (mol*K) = J/K
t1 = (p12[0]*v14[0]/nuR, '')
t2 = (p12[0]*v23[0]/nuR, '')
t3 = (p34[0]*v23[0]/nuR, '')
t4 = (p34[0]*v14[0]/nuR, '')
state1 = State(axes, v=v14, t=t1, patch='$1$', patch_pos='RB', xtick=False, ytick=False)
state2 = State(axes, v=v23, t=t2, patch='$2$', patch_pos='R', xtick=False, ytick=False)
state3 = State(axes, v=v23, t=t3, patch='$3$', patch_pos='L', xtick=False, ytick=False)
state4 = State(axes, v=v14, t=t4, patch='$4$', patch_pos='TT', xtick=False, ytick=False)
axes.process(state1, state2)
axes.process(state2, state3)
axes.process(state3, state4)
axes.process(state4, state1)
axes.marker(state1, ms=13)
axes.marker(state2, ms=13)
axes.marker(state3, ms=13)
axes.marker(state4, ms=13)
axes.line(state1)
axes.line(state4)
savefig('VT-p-v-p-v.png')

show()

Результат:

Цикл изохора, изотерма, изобара #

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from MKT import *

axes = Axes(10, 'P/$P$', 'V/$V$', ltx=True, fontsize=32, yratio=0.8)

p1 = (12/9, '')
p2 = (6, '')
v1 = (2, '')
v2 = (9, '')
state1 = State(axes, p=p1, v=v1, xtick=False, ytick=False, patch='1', patch_pos='BL')
state2 = State(axes, p=p2, v=v1, xtick=False, ytick=False, patch='2', patch_pos='TL')
state3 = State(axes, p=p1, v=v2, xtick=False, ytick=False, patch='3', patch_pos='R')

axes.process(state1,state2, lwmult=1.2)
axes.isothermal(state2, state3, lwmult=1.2)
axes.process(state3,state1, lwmult=1.2)

#savefig('8.32.pdf')
savefig('PV-v-t-p')
show()

Результат: