По книге «Scale-Up in Chemical Engineering» Second, Completely Revised and Extended Edition (Marko Zlokarnik).
В книге дана матричная формулировка задачи анализа размерностей. Вместо эвристических рассуждений о том, какие переменные выбирать в роли повторяющихся, какие — нет, можно реализовать небольшой скрипт на Python и прокручивать массу вариантов.
Каждый скрипт для каждой полученной Пи-переменной выдает показатели степени, с которыми должны быть перемножены исходные переменные. Например для первого скрипта:
Pi Group 1: Matrix([[-1], [2], [-2], [1], [0], [0]])
![]()
Означает, что нужно перемножить первый параемтр в -1 степени (поделить на него), умножить на второй в квадрате, поделить на третий в квадрате и уможить на 4-й в первой степени.
Здесь приводятся только скрипты.
Скачать виртуальное кружение вместе со скриптами (Jupyter Notebook).
Имя: PyTheorem.zip Размер: 119065661 байтов (113 MiB) CRC32: AC0AC400
Пример 1 — Число Эйлера и падение давления в трубе
Пример приводится на стр. 17
В книге матричные преобразования ведутся путем вычисления линейных комбинаций строк. В крайнем левом столбце записываются подстановки в обозначениях строк предыдущей матрицы. В конечном счете, путем преобразований, сначала дополненная матрица преобразуется так, что ‘core matrix’ становится верхней треугольной, а потом единичной (‘unity matrix’).
import numpy as np
from sympy import Matrix
# Scale-Up in Chemical Engineering Second,Completely Revised and Extended Edition (Zlokarnik, Marko, Marko Zlokarnik)
# Page 17
# Define dimensions of each variable in terms of [M], [L], [T]
# Format: [M, L, T]
dimensional_matrix = np.array([
[1, -3, 0], # rho (density): [M L^-3]
[0, 1, 0], # d (diameter): [L]
[0, 2, -1], # nu (kinematic viscosity): [L^2 T^-1]
[1, -1, -2], # delta P (pressure drop): [M L^-1 T^-2]
[0, 3, -1], # q (flow rate): [L^3 T^-1]
[0, 1, 0] # l (length): [L]
])
# Choose repeating variables: rho (density), d (diameter), and nu (kinematic viscosity)
repeating_indices = [0, 1, 2]
non_repeating_indices = [3, 4, 5]
# Core matrix (repeating variables): rho, d, nu
core_matrix = dimensional_matrix[repeating_indices].T # Transpose to match dimensions
print("Core matrix: \n{}".format(core_matrix))
# Residual matrix (non-repeating variables): delta P, q, l
residual_matrix = dimensional_matrix[non_repeating_indices].T # Transpose to match dimensions
print("Residual matrix: \n{}".format(residual_matrix))
# Now we can horizontally stack them
augmented_matrix = Matrix(np.hstack((core_matrix, residual_matrix)))
# Display the augmented matrix row by row
print("Augmented matrix row by row:")
for row in augmented_matrix.tolist():
print(row)
# Find the null space (which gives us the Pi groups)
null_space = augmented_matrix.nullspace()
print("Augmented matrix null space row by row:")
for row in null_space:
print(row)
# Display Pi groups (expressed in terms of exponents of the original variables)
pi_groups = []
for ns in null_space:
pi_groups.append(ns)
# Display the Pi groups
print("Pi-groups expressed in terms of exponents of the original variables:")
for i, pi_group in enumerate(pi_groups, 1):
print(f"Pi Group {i}: {pi_group}")
Выдаст в консоль
Core matrix: [[ 1 0 0] [-3 1 2] [ 0 0 -1]] Residual matrix: [[ 1 0 0] [-1 3 1] [-2 -1 0]] Augmented matrix row by row: [1, 0, 0, 1, 0, 0] [-3, 1, 2, -1, 3, 1] [0, 0, -1, -2, -1, 0] Augmented matrix null space row by row: Matrix([[-1], [2], [-2], [1], [0], [0]]) Matrix([[0], [-1], [-1], [0], [1], [0]]) Matrix([[0], [-1], [0], [0], [0], [1]]) Pi-groups expressed in terms of exponents of the original variables: Pi Group 1: Matrix([[-1], [2], [-2], [1], [0], [0]]) Pi Group 2: Matrix([[0], [-1], [-1], [0], [1], [0]]) Pi Group 3: Matrix([[0], [-1], [0], [0], [0], [1]])
![]()
![]()
![]()
Для первого примера, число Эйлера получается комбинированием двух Пи-переменных (см. уравнения 3.2, 3.3 в книге).
![]()
Пример 2 — Сопротивление движению корпуса корабля
Пример приводится на стр. 43
import numpy as np
from sympy import Matrix
# Scale-Up in Chemical Engineering Second,Completely Revised and Extended Edition (Zlokarnik, Marko, Marko Zlokarnik)
# Page 43
# Define dimensions of each variable in terms of [M], [L], [T]
# Format: [M, L, T]
dimensional_matrix = np.array([
[1, -3, 0], # rho (density): [M L^-3]
[0, 1, 0], # l (hull length): [L]
[0, 1, -1], # ship speed v: [L T^-1]
[1, 1, -2], # drag force F: [M L T^-2]
[0, 2, -1], # nu (kinem. viscosity): [L^2 T^-1]
[0, 1, -2], # g (gravity acceleration): [L T^-2]
[0, 3, 0] # ship displacement volume V: [L^3]
])
# Choose repeating variables: rho (density), l (ship length), and ship speed
repeating_indices = [0, 1, 2]
non_repeating_indices = [3, 4, 5, 6]
# Core matrix (repeating variables): rho, l, speed v
core_matrix = dimensional_matrix[repeating_indices].T # Transpose to match dimensions
print("Core matrix: \n{}".format(core_matrix))
# Residual matrix (non-repeating variables): F, nu, g, V
residual_matrix = dimensional_matrix[non_repeating_indices].T # Transpose to match dimensions
print("Residual matrix: \n{}".format(residual_matrix))
# Now we can horizontally stack them
augmented_matrix = Matrix(np.hstack((core_matrix, residual_matrix)))
# Display the augmented matrix row by row
print("Augmented matrix row by row:")
for row in augmented_matrix.tolist():
print(row)
# Find the null space (which gives us the Pi groups)
null_space = augmented_matrix.nullspace()
print("Augmented matrix null space row by row:")
for row in null_space:
print(row)
# Display Pi groups (expressed in terms of exponents of the original variables)
pi_groups = []
for ns in null_space:
pi_groups.append(ns)
# Display the Pi groups
print("Pi-groups expressed in terms of exponents of the original variables:")
for i, pi_group in enumerate(pi_groups, 1):
print(f"Pi Group {i}: {pi_group}")
Выдаст в консоль
Core matrix: [[ 1 0 0] [-3 1 1] [ 0 0 -1]] Residual matrix: [[ 1 0 0 0] [ 1 2 1 3] [-2 -1 -2 0]] Augmented matrix row by row: [1, 0, 0, 1, 0, 0, 0] [-3, 1, 1, 1, 2, 1, 3] [0, 0, -1, -2, -1, -2, 0] Augmented matrix null space row by row: Matrix([[-1], [-2], [-2], [1], [0], [0], [0]]) Matrix([[0], [-1], [-1], [0], [1], [0], [0]]) Matrix([[0], [1], [-2], [0], [0], [1], [0]]) Matrix([[0], [-3], [0], [0], [0], [0], [1]]) Pi-groups expressed in terms of exponents of the original variables: Pi Group 1: Matrix([[-1], [-2], [-2], [1], [0], [0], [0]]) Pi Group 2: Matrix([[0], [-1], [-1], [0], [1], [0], [0]]) Pi Group 3: Matrix([[0], [1], [-2], [0], [0], [1], [0]]) Pi Group 4: Matrix([[0], [-3], [0], [0], [0], [0], [1]])
Здесь первая группа — число Ньютона, вторая — число Рейнольдса, третья — Фруда, четвертая — безразмерный объем измещения.
![]()
![]()
![]()
![]()

