Пи-теорема в матричной форме

По книге «Scale-Up in Chemical Engineering» Second, Completely Revised and Extended Edition (Marko Zlokarnik).
В книге дана матричная формулировка задачи анализа размерностей. Вместо эвристических рассуждений о том, какие переменные выбирать в роли повторяющихся, какие — нет, можно реализовать небольшой скрипт на Python и прокручивать массу вариантов.

Каждый скрипт для каждой полученной Пи-переменной выдает показатели степени, с которыми должны быть перемножены исходные переменные. Например для первого скрипта:

Pi Group 1: Matrix([[-1], [2], [-2], [1], [0], [0]])

\Pi_{1} = \rho^{-1} d^{2} \nu^{-2} \Delta P^{1} q^{0} l^{0} = \frac{d^{2} \Delta P}{\rho \nu^{2}}

Означает, что нужно перемножить первый параемтр в -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]])

\Pi_{1} = \frac{\Delta p d^{2}}{\rho^{1} \nu^{2}}

\Pi_{2} = \frac{q}{d \nu}

\Pi_{3} = \frac{1}{d}

Для первого примера, число Эйлера получается комбинированием двух Пи-переменных (см. уравнения 3.2, 3.3 в книге).

Eu = \Pi_{1} \Pi_{2}^{2} = \frac{\Delta P d^{4}}{\rho q^{2}}

Пример 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]])

Здесь первая группа — число Ньютона, вторая — число Рейнольдса, третья — Фруда, четвертая — безразмерный объем измещения.

\Pi_1 = \frac{F}{\rho \cdot l^2 v^2} = Ne

\Pi_2 = \frac{\nu}{l \cdot v} = Re^{-1}

\Pi_3 = \frac{g \cdot l}{v^2} = Fr^{-1}

\Pi_4 = \frac{V}{l^3}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.