Perhaps we could use an interim keyword `coefficients` which defaults to True. If an undetermined coefficients case is detected, a warning can be raised and a message given before returning that solution which says that if a non-coefficients solution is desired (during deprecation period) the keyword `coefficients=False` can be used. Once the deprecation period is over, the `coefficients` keyword and the recognition of undetermined coefficients can be removed.
/c On Thursday, June 30, 2022 at 8:44:52 PM UTC-5 Aaron Meurer wrote: > Ah I missed your "nearly from the beginning" bit. I would say it > should be deprecated, although if there are other kinds of cleanups > that can be done with solve, it might make sense to do them all > together (but this could be a big project). > > Aaron Meurer > > On Thu, Jun 30, 2022 at 6:39 PM Chris Smith <smi...@gmail.com> wrote: > > > > since 2011 (2ff42e6). > > > > On Thursday, June 30, 2022 at 7:17:02 PM UTC-5 Aaron Meurer wrote: > >> > >> How long has the feature been there? > >> > >> Aaron Meurer > >> > >> On Thu, Jun 30, 2022 at 5:51 PM Chris Smith <smi...@gmail.com> wrote: > >> > > >> > Do you have any feelings about making the change without deprecation? > >> > > >> > On Thursday, June 30, 2022 at 6:31:32 PM UTC-5 Aaron Meurer wrote: > >> >> > >> >> How does it decide when to take coefficients? I tried this > >> >> > >> >> >>> solve(a*cos(x) + b*sin(x), [a, b]) > >> >> [(-b*tan(x), b)] > >> >> > >> >> I would expect an undetermined coefficients solution to be [(0, 0)]. > >> >> OTOH, it would need to be careful about this. This is only valid if > >> >> the terms in question are linearly independent (this can be checked > by > >> >> seeing if the Wronskian is nonzero). > >> >> > >> >> Personally, I would prefer if solve() were more explicit and did less > >> >> guessing about what the user wants. The problem with guessing is that > >> >> if you do know what you want, it becomes very difficult to tell > >> >> solve() to do that specific thing. It's especially problematic that > >> >> the actual behavior of solve depends on seemingly insignificant > things > >> >> like how the symbols are specified. Just as a simple example > >> >> (unrelated to undetermined coefficients), say I have an > >> >> underdetermined system like solve([x + y + z, x - y - z], [x, y, z]). > >> >> I would expect specifying [x, y, z] to mean that I don't want the > >> >> solutions to be in terms of any of those variables (even preferring > an > >> >> error to that), but I can't figure out how to make it do that. > >> >> > >> >> There is a function solve_undetermined_coefficients, although it > >> >> currently only supports polynomials. Its behavior seems to be more > >> >> well-specified for problems like this. One can also extract the > system > >> >> manually with collect(), although that's a bit advanced for the > >> >> average user. > >> >> > >> >> It would be better for the solvers to follow the Unix philosophy of > >> >> "each function does one thing and does it well". So there should be > >> >> one function just for solving a function algebraically, one function > >> >> for solving a system, one for solving undetermined coefficients, and > >> >> so on. For a function like simplify(), there is a benefit to the > "just > >> >> do something, even if it might not be exactly what the user wants" > >> >> philosophy. But I don't see the benefit of that for solve(). If you > >> >> have an equation or system of equations, you want to solve it in a > >> >> very specific way, and solving it in some other way is almost always > >> >> unhelpful (or at least that's been my experience). > >> >> > >> >> Aaron Meurer > >> >> > >> >> On Thu, Jun 30, 2022 at 4:27 PM Chris Smith <smi...@gmail.com> > wrote: > >> >> > > >> >> > Nearly from the beginning, `solve` has recognized the > `undetermined coefficients` case wherein a single equation is solved for a > set of symbols which will simultaneously set it equal to zero. This is > different than the normal use of `solve`, however, and might be considered > a bug or feature. As an example, consider: > >> >> > > >> >> > [in1] solve(a*x + b - (2*x + 4), (a, b)) # solve for a and b > >> >> > {a: 2, b: 4} > >> >> > [in2] solve(a*x + b - (2*x + 4), exclude=[x]) # solve for as many > as possible, but not x > >> >> > {a: 2, b: 4} > >> >> > [in3] solve(a*x + b - (2*x + 4), a) # solve for a > >> >> > [(-b + 2*x + 4)/x] > >> >> > [in4] solve(a*x + b - (2*x + 4)) # solve for anything and tell me > what you did > >> >> > [{a: (-b + 2*x + 4)/x}] > >> >> > > >> >> > The "undetermined coefficients" case is returned from inputs 1 and > 2 while the more usual "solution" is returned from 3 and 4. > >> >> > > >> >> > The request for comment is whether this feature should be removed > from `solve` so a better defined equation set is provided rather than > building that equation set automatically when this case is detected as > one-equation-many-symbols. > >> >> > > >> >> > To me it feels natural to get the undetermined coefficients > solution when I ask for many symbols from one equation. If I want sympy to > pick any variable other than some I would use `exclude=some` (where `some` > is a list or set of things to ignore). But not everyone feels this way and > refusing the temptation to guess is important, too. > >> >> > > >> >> > Since this behavior is described in the docstring and has been > present for many years it feels like a regression of this feature to me > (though to others it feels like a bug fix). If you use this feature and/or > have comments, please let us know your thoughts on this: > >> >> > > >> >> > 1) should it be kept? > >> >> > 2) if removed, should there be deprecation? > >> >> > > >> >> > Thanks, > >> >> > Chris > >> >> > > >> >> > -- > >> >> > 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+un...@googlegroups.com. > >> >> > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/b3553af5-0df2-49cb-bfaa-b3c354429864n%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+un...@googlegroups.com. > >> > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/beaefb88-28cb-4661-ae09-a17778bf0bf0n%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+un...@googlegroups.com. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/826aaa9c-19c3-49e9-95ac-70f71cc4a76fn%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/c878be79-eb62-488a-b43e-b337b0c58460n%40googlegroups.com.