По книге «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]])
Здесь первая группа — число Ньютона, вторая — число Рейнольдса, третья — Фруда, четвертая — безразмерный объем измещения.