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.loca...@gmail.com> 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 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.

-- 
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/CAKgW%3D6%2BBPpZ71DzGqzMA0_ophQw%3Dt97zQ%2BN5mwmNKAH7a%2BqG_g%40mail.gmail.com.

Reply via email to