I have a string written in Latex for which I know the dimensions of each symbol. My goal is to validate the dimensional consistency of the expression. I'm having trouble with substitution. For example,
>>> from sympy.physics.units import mass, length, time
>>> from sympy.parsing.latex import parse_latex
>>> eq = parse_latex("F = m a")
>>> eq
Eq(F, a*m)
I can get the symbols from that expression
>>> set_of_symbols_in_eq = eq.free_symbols
And for each symbol in the set I know what dimensions each has:
>>> Fdim = mass * length / time**2
>>> mdim = mass
>>> adim = length / time**2
When I try substituting the dimensions into the original expression, I get an error
>>> eq.subs({F: Fdim, m: mdim, a: adim})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'F' is not defined
That is surprising, because F is a Symbol:
>>> type(eq.lhs)
<class 'sympy.core.symbol.Symbol'>
I think that error means that although F is a Symbol, there isn't a variable named F that points to the Symbol F?
If that's the case, I don't know how to access the symbols in the abstract syntax tree provided by eq.
How would I indicate to SymPy that "F = m a" in eq has variables with certain dimensions?
My goal is to run
>>> dimsys_SI.equivalent_dims(Fdim, mdim * adim)
True
without retyping the expression.
I think I want something like the following, except with dimensions substituted for each symbol.