Hi Peter, On Mon, Feb 9, 2015 at 9:09 AM, Peter Chervenski <[email protected]> wrote: > I made this function to test for the equivalence of two expressions. It > doesn't really prove anything, but if the tests are many, the probability of > it being wrong becomes negligible. Do such utility functions have a place in > SymPy? > > def equiv(a, b, ntests=15): > """ Test if expression a is equivalent to b > by comparing the results of many random numeric tests """ > > # get the symbols > sb_a = filter(lambda x: x.is_Symbol, a.atoms()) > sb_b = filter(lambda x: x.is_Symbol, b.atoms()) > > sb = list(set(sb_a + sb_b)) > > eq = True > for i in xrange(ntests): > k = dict(zip(sb, np.random.randn(len(sb)))) > > r_a = a.subs( k ) > r_b = b.subs( k ) > > # prove there is a difference > if (r_a - r_b)**2 > 1e-30: # not the same? the expressions are > different > eq = False > break > > return eq
Absolutely. I've also implemented a similar function in one PR: https://github.com/sympy/sympy/pull/8036/files?diff=unified#diff-2c9ef1ef2c82f5d5781d0d12e1fe4910R33 It was pointed out to me that we have similar machinery here already: https://github.com/sympy/sympy/blob/master/sympy/utilities/randtest.py#L43 This should be unified and put into sympy. We can call it "zero_numerical" or something like that ("test_numerically", ...). Mathematica calls this PossibleZeroQ (though I think it does both symbolic an numerical tests). Look at the implementation in my PR --- you should allow the user to specify the range (I call it [a, b]) as well as the precision. I think we can perhaps just test for 0, and then your "equiv" can just call this zero testing function for a-b. Ondrej -- 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 post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/sympy. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CADDwiVCti4Rcqoe7Mo7Yz%3D4cZ5jj6gG7%2BrxvGfrjeK5SLOa4%2BA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
