Do we know how other computer algebra systems solve this problem?  How
robust are the algorithms behind wolframalpha.com ?


On Tue, Jan 21, 2014 at 6:00 PM, Aaron Meurer <asmeu...@gmail.com> wrote:

> On Tue, Jan 21, 2014 at 4:55 AM, Harsh Gupta <gupta.hars...@gmail.com>
> wrote:
> > Hi, I'm Harsh Gupta I will be GSOC applicant this year. I want to discuss
> > the solvers idea given on the Idea's
> > page.https://github.com/sympy/sympy/wiki/GSoC-2014-Ideas#solvers
>
> Great to hear it. As noted on the ideas page, this one will require a
> good deal of thought to be done in the application, so let's start
> discussing.
>
> >
> > Some of the aspect of the idea are discussed at
> > https://groups.google.com/forum/?fromgroups=#!starred/sympy/8TM8cnuzkG8.
> >
> >
> > Aaron Meurer said:
> >
> >> I think with TransformationSet we can do quite a bit. That handles
> >> sets like {f(x) | x in A}. I think what is missing is the basic set
> >> builder {x | P(x)}, where P(x) is a boolean predicate.
> >
> >
> >
> > Matthew Rocklin said:
> >
> >>> > Real issue here - how to represent some solutions (e.g. sin(x)==0).
> >>
> >> In sets we would represent this with
> >> In [1]: imageset(k, pi*k, S.Integers)
> >> Out[1]: {π⋅k | k ∊ ℤ}
> >
> >
> > Implementing a general set builder will be very useful, we will need to
> > define basic set operations like union
> > and intersection on them. We might use a syntax like `BuildSet(expr,
> > sym_in_inputset, cond)`
> >
> > In [1]: BuildSet(pi*k, (k, S.Integers), True).intersect(0, 10)
> > Out[1]: {pi, 2*pi, 3*pi}
>
> So probably a good idea would be to look at the kinds of things that
> solve might potentially want to return, and see where the deficiencies
> are in the sets module. Things can get more complicated if you
> consider higher dimensional sets.
>
> >
> >
> > Matthew Rocklin said:
> >
> >> It sounds like maybe solve should return a Set.
> >
> >
> > I think it will be necessary to return set if we want to represent the
> > solution of expressions like `floor(x) - 5`.
> > See https://code.google.com/p/sympy/issues/detail?id=3975.
> > One problem I see with returning sets is that it can break a lot of
> existing
> > code.
>
> Yes, this is a problem. I think we should create custom objects that
> extend sets that allow to keep the current interface, like sols[0] or
> sols[0][x]. The current interface is of course quite a few interfaces,
> which is part of what makes it such a mess, but I think the dict=True
> way is the cleanest.
>
> >
> >
> > As mentioned in the idea page we need to have a method to check if solve
> > returns all the solutions. For polynomials or expressions which are
> > solved by converting to polynomials we can compare the degree of the
> > polynomial to the number of solutions returned.
> >
> > Other method can be verifying the number of the solutions by using the
> > derivative of the function. Say we are given a *continuous* and
> > *differentiable*  function f(x) and it's derivative w.r.t x is g(x),
> > then if g(x) has n solutions then f(x) cannot have more than n + 1
> > solutions. So, if the solve returns n + 1 solutions for f(x) then we are
> > guaranteed that we have found all the solutions.
> > For this we will need a discontinuity finder and we will also have to
> make
> > sure that we have found all the solutions for g(x), i.e., the derivative
> of
> > f(x), which can be done recursively or by using other methods.
>
> How do you determine the points of discontinuity of a function? In
> general, you need to use solve (e.g., to find when you are dividing by
> 0). Hopefully you wouldn't try to recursively solve the same
> expression, or you would get nowhere, except infinite recursion. But
> it does need the same functionality, because if you have expr = p/q,
> you need to be sure you know *all* the zeros of q to be sure where
> expr is discontinuous.
>
> >
> > A third way can be using numerical solver. Say we use solve to find the
> > solution of f(x) for some interval [a, b] then we can also run the
> numerical
> > solver for f(x) on [a, b]
> > if the number of solutions by numerical solver and symbolic solve matches
> > then we can be pretty sure that we have found out all the solutions of
> f(x)
> > in [a, b].
>
> This has limitations too. Among them are:
>
> - Numerical solvers make no such guarantee either. They just try to
> find solutions using whatever method and return them when they do.
>
> - Numerical solvers can be unstable for certain kinds of expressions.
>
> - If you have symbolic parameters, this doesn't work so well. At best,
> you can try a multidimensional numerical solver, but your chances of
> finding all solutions in a higher dimensional space are even worse.
>
> But this can definitely be used to weed out cases where we don't find
> all the solutions. I was personally envisioning a more cautious
> algorithm that only returns true when it is absolutely sure at each
> stage, but I'm unclear just how far we can get with such a thing using
> our current heuristics.
>
> An audit of the current solve code might be in order. In particular,
> I'd like to know:
>
> 1. what are the different "solvers"? (if we split solve into "hints"
> like with dsolve, these would be the different hints), and
> 2. which are algorithmically complete (i.e., we know they will give
> all solutions, or they can detect somehow if they may have missed
> one)?
>
> And this may raise auxiliary questions, like:
>
> - to what degree can the different solvers be separated? For instance,
> one solver (I'm not sure if it's actually implemented) would use
> decompose() to solve recursively. How would such "recursive solvers"
> look in a hints system?
>
> - of those that are heuristic (not algorithmically complete), can they
> be improved?
>
> Another thing I'd like to know is if there's literature on solving
> algorithms, particularly solving transcendental equations, and very
> particularly on if there are any complete algorithms out there for
> some class of equations.
>
> By the way, one algorithm, relating to solving, which we don't have
> implemented yet is CAS (cylindrical algebraic decomposition). This
> would be a GSoC project in itself to implement, though.
>
> Aaron Meurer
>
> >
> > --
> > Harsh
> >
> > --
> > 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 post to this group, send email to sympy@googlegroups.com.
> > Visit this group at http://groups.google.com/group/sympy.
> > For more options, visit https://groups.google.com/groups/opt_out.
>
> --
> 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 post to this group, send email to sympy@googlegroups.com.
> Visit this group at http://groups.google.com/group/sympy.
> For more options, visit https://groups.google.com/groups/opt_out.
>

-- 
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 post to this group, send email to sympy@googlegroups.com.
Visit this group at http://groups.google.com/group/sympy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to