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] <javascript:>>
> 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] <javascript:>.
> > 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.