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 <[email protected] <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 <[email protected]> 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 [email protected].
> >> > 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 [email protected] <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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/sympy/dca82ae4-cd0a-4f34-a248-fd64dcee067c%40googlegroups.com.