solve with "excess" equations

why does the following work

solve([a+b-1,a-b],[a,b])

but this

solve([a+b-1,a-b,c+d],[a,b])

gives an empty solution?

Can "solve" be convinced to ignore unneccassary equations?

edit retag close merge delete

Sort by » oldest newest most voted

You could solve for a, b, c, d and then ignore c and d.

sage: a, b, c, d = var('a b c d')
sage: solns = solve([a+b-1,a-b,c+d],[a,b,c,d]); solns
[[a == (1/2), b == (1/2), c == -r1, d == r1]]
sage: [s[:2] for s in solns]
[[a == (1/2), b == (1/2)]]

Or you can tweak solve to only use the equations which involve the variables that you want to solve for.

sage: def smart_solve(eqns, vars):
....:     return solve([eqn for eqn in eqns if
....:                   any(v in eqn.variables() for v in vars)], vars)
....:
sage: smart_solve([a+b-1,a-b,c+d],[a,b])
[[a == (1/2), b == (1/2)]]

I don't know what would be the pros and cons of having Sage's solve behave in this way (either by default or as an option).

more

Thank you, I kind of went the "smart_solve" way, it just meant yet another iteration of ifs and fors in my application which I'd have liked to avoid. I had expected "solve" to be a bit smarter by itself but perhaps there would be too many implications if you'd expect a full test for solvability. Perhaps an error would be better instead of an empty solution though.