# Not understanding behavior with solution to simultaneous quadratic equations

Hello,

I should preface this by saying I'm brand-new to sage so am probably missing some basics.

I'm writing because I wanted to use Sage to explore the behavior of a system of quadratic equations.

Here's my code

c = 299792458
eps1 = ( vector([9, 10, 10]).norm() -1 ) / c
eps2 = ( vector([9, -10, 10]).norm() -1 ) / c
eps3 = ( vector([-11, 10, 10]).norm() -1 ) / c
eps4 = ( vector([-11, -10, 10]).norm() -1 ) / c

x,y,z,D = var('x y z D')   # GPS solution
x1,y1,z1 = var('x1 y1 z1') # Coordinates of P1

eq1 =  (x - 10)^2 + (y - 10)^2 + (z - 10)^2 == ( vector([x1, y1 -1, z1]).norm() + c*eps1 - D)^2
eq2 =  (x - 10)^2 + (y + 10)^2 + (z - 10)^2 == ( vector([x1, y1 -1, z1]).norm() + c*eps2 - D)^2
eq3 =  (x + 10)^2 + (y - 10)^2 + (z - 10)^2 == ( vector([x1, y1 -1, z1]).norm() + c*eps3 - D)^2
eq4 =  (x + 10)^2 + (y + 10)^2 + (z - 10)^2 == ( vector([x1, y1 -1, z1]).norm() + c*eps4 - D)^2


If I solve the system with S = solve([eq1, eq2, eq3, eq4,D==0], x, y, z, D)I get symbolic solutions as expected (y is constantly 0 which is unexpected and doesn't seem right, but that's a different matter).

However, if I try to specify values for x1,y1,z1 by using solve([eq1, eq2, eq3, eq4, x1==0, y1==0, z1==0, D==0], x, y, z) it returns an empty list, which I assume means no solution. On the other hand, if I use my solution S from before and explicitly substitute x1==0, y1==0, z1==0, D==0 I get the solutions I'm expecting.

Could anyone explain this behavior? Is it somehow easier for Sage to solve the more general equation than the one with parameters plugged in? Will Sage sometimes fail to find existent solutions to such systems, or have I just done something wrong?

Many thanks, Justin

edit retag close merge delete

Sort by » oldest newest most voted

Operating as you did, I get the same results. Furthermore, I get:

sage: solve([eq1, eq2, eq3, eq4, D==0, x1==0], [x, y, z, D])
[]


This, IMHO, means that sage concludes that no valye of x, y, z, d allows you to conclude that x1==0, which is indeed true. What is more annoying is that

sage: solve([eq1, eq2, eq3, eq4, D==0, x1==0], [x, y, z, D, x1])


never returns (you have to interrupt Sage in order to get tyour prompt back). This may be a bug...

But to get your solutions while instantiating tour parameters, you can write:

sage: [[eq.subs([x1==0, y1==0, z1==0]) for eq in s] for s in S]
[[x == 1, y == 0, z == 20, D == 0], [x == 1, y == 0, z == 0, D == 0]]


which looks entirely reasonable...

IMNSHO, the cleaner way to solve your problem is:

sage: S0=solve([eq1, eq2, eq3, eq4],[x,y,z])
sage: [[eq.subs([x1==0, y1==0, z1==0, D==0]) for eq in s] for s in S0]


totally separating variables (x, y, z) and parameters (D is a parameter...).

HTH,

more

What is more annoying is that

>    sage: solve([eq1, eq2, eq3, eq4, D==0, x1==0], [x, y, z, D, x1])


never returns (you have to interrupt Sage in order to get tyour prompt back). This may be a bug...

No it isn't : in this second case, x1 appears as an unknown and as a parameter. Sage is sort-of-forced to enter an infinite loop...

This could be detected, but probably requres a solver cleverer than Maxima's...