ASKSAGE: Sage Q&A Forum - RSS feedhttps://ask.sagemath.org/questions/Q&A Forum for SageenCopyright Sage, 2010. Some rights reserved under creative commons license.Sat, 08 Aug 2020 01:12:05 +0200solve with "excess" equationshttps://ask.sagemath.org/question/10028/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 unnecessary equations?Mon, 15 Apr 2013 09:54:19 +0200https://ask.sagemath.org/question/10028/solve-with-excess-equations/Answer by slelievre for <p>Why does the following work</p>
<pre><code>solve([a + b - 1, a - b], [a, b])
</code></pre>
<p>but this</p>
<pre><code>solve([a + b - 1, a - b, c + d], [a, b])
</code></pre>
<p>gives an empty solution?</p>
<p>Can <code>solve</code> be convinced to ignore unnecessary equations?</p>
https://ask.sagemath.org/question/10028/solve-with-excess-equations/?answer=14790#post-id-14790You 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).Mon, 15 Apr 2013 10:51:48 +0200https://ask.sagemath.org/question/10028/solve-with-excess-equations/?answer=14790#post-id-14790Comment by andre for <p>You could solve for <code>a</code>, <code>b</code>, <code>c</code>, <code>d</code> and then ignore <code>c</code> and <code>d</code>.</p>
<pre><code>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)]]
</code></pre>
<p>Or you can tweak <code>solve</code> to only use the equations which involve the variables
that you want to solve for.</p>
<pre><code>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)]]
</code></pre>
<p>I don't know what would be the pros and cons of having Sage's <code>solve</code> behave
in this way (either by default or as an option).</p>
https://ask.sagemath.org/question/10028/solve-with-excess-equations/?comment=17896#post-id-17896Thank 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.Mon, 15 Apr 2013 12:02:48 +0200https://ask.sagemath.org/question/10028/solve-with-excess-equations/?comment=17896#post-id-17896Answer by rburing for <p>Why does the following work</p>
<pre><code>solve([a + b - 1, a - b], [a, b])
</code></pre>
<p>but this</p>
<pre><code>solve([a + b - 1, a - b, c + d], [a, b])
</code></pre>
<p>gives an empty solution?</p>
<p>Can <code>solve</code> be convinced to ignore unnecessary equations?</p>
https://ask.sagemath.org/question/10028/solve-with-excess-equations/?answer=52911#post-id-52911Excess variables are interpreted as parameters, and only solutions that are valid for *all* values of the parameters are sought. This explains the empty list in the second case.Sat, 08 Aug 2020 01:12:05 +0200https://ask.sagemath.org/question/10028/solve-with-excess-equations/?answer=52911#post-id-52911