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.

Reply via email to