Good morning,
To verify that the issue is not due to using an old version, I re-ran the
same example with the current development version of SymPy.
>>> import sys
>>> sys.version
'3.6.9 (default, Apr 18 2020, 01:56:04) \n[GCC 8.4.0]'
>>> sympy.__version__
'1.7.dev'
>>> 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
>>> dimsys_SI.equivalent_dims( eval(str(eq.lhs)), eval(str(eq.rhs)) )
True
Should I open an issue on github for this?
On Wednesday, May 27, 2020 at 9:48:02 PM UTC-4, Ben wrote:
>
> 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]> 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].
>> > 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/35ed29bb-4bdf-4229-92a0-26b3b1449092%40googlegroups.com.