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.