Thanks Aaron for your help. With your guidance, I solved my problem (though my use of eval() feels hacky).
>>> import sympy >>> from sympy.physics.units import mass, length, time >>> from sympy.physics.units.systems.si import dimsys_SI >>> from sympy.parsing.latex import parse_latex >>> eq = parse_latex("F = m a") >>> F = mass * length / time**2 >>> m = mass >>> a = length / time**2 >>> dimsys_SI.equivalent_dims( eval(str(eq.lhs)), eval(str(eq.rhs)) ) True I used eval() rather than variable substitution >>> Fdim = mass * length / time**2 >>> mdim = mass >>> adim = length / time**2 >>> lhs_dim = eq.lhs.subs([(F, Fdim), (m, mdim), (a, adim)]) >>> rhs_dim = eq.rhs.subs([(F, Fdim), (m, mdim), (a, adim)]) because I was not able to figure out how to simplify the RHS >>> rhs_dim Dimension(length/time**2)*Dimension(mass, M) Even though the RHS dimensions simplify to be equivalent to the LHS, I get an error when I compare the LHS and RHS: >>> dimsys_SI.equivalent_dims( lhs_dim, rhs_dim ) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.6/dist-packages/sympy/physics/units/dimensions.py", line 455, in equivalent_dims deps2 = self.get_dimensional_dependencies(dim2) File "/usr/local/lib/python3.6/dist-packages/sympy/physics/units/dimensions.py", line 448, in get_dimensional_dependencies dimdep = self._get_dimensional_dependencies_for_name(name) File "/usr/local/lib/python3.6/dist-packages/sympy/physics/units/dimensions.py", line 422, in _get_dimensional_dependencies_for_name for k, v in d.items(): AttributeError: 'NoneType' object has no attribute 'items' On Wednesday, May 27, 2020 at 7:01:02 PM UTC-4, Aaron Meurer wrote: > > You're right that you have to define the Python variable name to > access F like that. See > https://docs.sympy.org/latest/tutorial/gotchas.html. > > You can get all the symbols in an expression with eq.free_symbols. Or > if you know the symbol is F you can just set > > F = symbols('F') > > since symbols with the same name are equal, so F will be the same as > the symbol F in the expression from parse_latex. > > Aaron Meurer > > On Wed, May 27, 2020 at 2:37 PM Ben <ben.is...@gmail.com <javascript:>> > wrote: > > > > Hello, > > > > 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.physics.units.systems.si import dimsys_SI > > >>> 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: > > >>> eq.lhs > > F > > >>> 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. > > >>> dimsys_SI.equivalent_dims( eq.lhs, eq.rhs ) > > False > > > > -- > > You received this message because you are subscribed to the Google > Groups "sympy" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to sy...@googlegroups.com <javascript:>. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/a4e2b3fe-27b2-45b8-a7f6-598caea772de%40googlegroups.com. > > > -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sympy+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/6e6c4358-7894-4099-9d27-74c5fefe2a31%40googlegroups.com.