Я пытаюсь использовать SymPy для выполнения следующих задач:
- Упростим некоторые алгебраические уравнения физических величин и физических констант.
- Выполните анализ размеров, чтобы убедиться, что мои уравнения верны
- Оцените уравнения, добавив значения для физических величин.
Мой MCVE для этой задачи приведен ниже, где я хочу найти количество массы, эквивалентное данной энергии, используя эквивалент массы-энергии . (Я запускаю это в Jupyter, так как это может сделать уравнения красивыми.)
Начиная с E=m*c**2
Я хочу решить для m
:
from sympy import *
E, m, c = symbols('E m c') # symbols, for energy, mass, and speed of light
eq_E = Eq(E, m*c**2) # define equation for E in terms of m and c
eq_m = Eq(m,solve(eq_E,m)[0]) # solve equation for m
display(eq_m)
Отлично! Теперь пришло время провести анализ размеров. Я определю свою энергию E
в джоулях, и мне не нужно определять единицы измерения c
, поскольку это физическая константа, и я работаю в единицах СИ (что, по-видимому, является значением по умолчанию для SymPy). Я хочу узнать, сколько массы находится в 1 Джоулях энергии, и я хочу узнать единицы этой массы. Я определю свои переменные, используя Quantity()
, а затем снова установлю их в уравнении чтобы SymPy мог ее решить:
from sympy.physics.units import Quantity, energy, joule, speed_of_light
from sympy import Eq, solve
m = Quantity('m') # Define unknown mass 'm' as a quantity
E = Quantity('E') # Define known energy 'E' as a quantity
E.set_dimension(energy) # E is a quantity of energy
E.set_scale_factor(1.0*joule, 'SI') # set energy to 1.0 Joules
eq_E = Eq(E,m*speed_of_light**2) # define E = mc^2
eq_m = Eq(m,solve(eq_E,m)[0]) # Solve E = mc^2 for m
display(eq_m)
Это не выглядит красиво, но выражение правильное. Теперь я хочу посмотреть, каково значение m
и какие единицы m
имеет. Сначала я сохраню решение для m
в m_solve
:
m_solve = solve(eq_E,m)[0]
display(m_solve)
Теперь можно посмотреть, какие единицы m_solve
имеет?
print(m_solve.dimension)
AttributeError: 'Mul' object has no attribute 'dimension'
А как насчет значения m_solve
?
print(m_solve.scale_factor)
AttributeError: 'Mul' object has no attribute 'scale_factor'
Что такое Mul
? Как мне получить Quantity
? В более общем смысле, есть ли в SymPy хороший рабочий процесс для манипулирования символьными уравнениями и проверки единиц измерения на этом пути, а затем, наконец, для оценки этих уравнений? Если не SymPy, есть ли хорошие альтернативы? (Я пробовал несколько альтернатив, наиболее многообещающе пинта , но, похоже, не хватает символической поддержки.)