I agree with your assessment. Here's my minimum working example where I don't use eval(str()) and get the problem. >>> import sys >>> sys.version '3.6.9 (default, Apr 18 2020, 01:56:04) \n[GCC 8.4.0]' >>> import sympy >>> sympy.__version__ '1.5.1' >>> 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( eq.lhs, eq.rhs ) False
For context, here are the variables >>> eq.lhs F >>> eq.rhs a*m >>> F Dimension(length*mass/time**2) >>> a Dimension(length/time**2) >>> a*m Dimension(length*mass/time**2) >>> m Dimension(mass, M) On Wednesday, May 27, 2020 at 8:59:42 PM UTC-4, Aaron Meurer wrote: > > Why are you using eval(str(eq.lhs))? That should just give back eq.lhs. > > Aaron Meurer > > On Wed, May 27, 2020 at 6:35 PM Ben <ben.is...@gmail.com <javascript:>> > wrote: > > > > 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> 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. > >> > 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 sy...@googlegroups.com <javascript:>. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/6e6c4358-7894-4099-9d27-74c5fefe2a31%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/dca82ae4-cd0a-4f34-a248-fd64dcee067c%40googlegroups.com.