From: rusin@vesuvius.math.niu.edu (Dave Rusin) Newsgroups: comp.graphics.algorithms,sci.math.num-analysis Subject: Re: How to solve for three unknowns with three quadratic equations Date: 27 Mar 1998 04:02:06 GMT In article <6f8par\$s9d\$1@vixen.cso.uiuc.edu>, Peter J. Wahle wrote: >I'm working on a graphics related problem that results in three quadratic >equations in three unknowns. I need to solve for the unknowns. > >They are of the form >l^2 = aX^2 + bXZ + cZ^2 >r^2 = dY^2 + eYZ + cZ^2 >t^2 = aX^2 + fXY + dY^2 > >Where a, b, c, d, e, f, l, r, and t are real constants; >and X, Y, and Z are the unknowns I need to solve for. >X, Y, and Z must be real. > >Any suggestion on how I might solve this? >A direct method would be preferred, but >iterative methods could be useful. The previous suggestions to solve numerically are probably best, but you did ask for a "direct" method (and anyway the numerical techniques will need to know something global like where to start looking for solutions). You can take these three polynomials in 3 variables and eliminate two of them, that is, express X and Y (say) as rational functions of Z, and find the polynomial equation of which Z is a root. This is not exactly elegant, but in this case it shows we _can_ get such expressions for X and Y; Z must satisfy a degree-8 polynomial. It's a little better than that: this polynomial is actually a quartic in Z^2; so you just want to know the real, positive roots of this quartic. As one poster pointed out, it's clear geometrically that there are no such roots for some choices of the parameters. So excluding degenerate cases, it seems to me that there are up to 8 points of intersection among these three cylinders, always occuring in antipodal pairs. Given specific values of the parameters, it is perhaps not unreasonable to write down the quartic explicitly and solve for its roots. (Indeed, one could compute a Sturm sequence and so on, and give a certain number of inequality tests which would determine the number of points of intersection, and with a bit more work could separate them into intervals. If you think I'm going to do that symbolically, you've overestimated my patience!) For your viewing pleasure I give below the formula for Y and the quartic which Z^2 must satisfy; the corresponding formula for X is not given, as a service to news-servers everywhere (simply use symmetry). Computations done with Maple. dave myanswer={poly=(d*a*t^4-2*d*a*t^2*l^2+d*a*l^4-2*r^2*a*t^2*d+2*r^2*a*d*l^2+r^4*a *d-r^2*l^2*f^2)^2+(-2*d*r^4*a^2*t^2*e^2-6*d^2*b^2*t^2*r^4*a-24*d^2*a^2*c*l^2*t^ 4-24*d^2*a^2*c*l^2*r^4+14*d*a*l^4*r^2*c*f^2+2*d*a*t^4*r^2*c*f^2+24*d^2*a^2*t^2* c*r^4+2*d^2*a*l^4*r^2*b^2-24*d^2*a^2*l^4*r^2*c+4*d*a^2*t^4*r^2*e^2+6*d^2*a*t^4* r^2*b^2-2*d^2*b^2*t^6*a+4*d*a^2*l^4*r^2*e^2-d*r^6*a*e*b*f+2*d^2*r^6*a*b^2-24*d^ 2*a^2*t^4*r^2*c+2*d*r^6*a*c*f^2-8*d^2*r^6*a^2*c+8*d^2*a^2*t^6*c+2*d*a*l^6*c*f^2 -8*d^2*a^2*l^6*c-2*r^4*l^2*f^4*c+d*a*t^4*r^2*e*b*f-r^4*l^2*f^2*e^2*a-r^4*l^2*f^ 3*e*b+2*d*r^4*a^2*l^2*e^2+4*d^2*r^4*a*l^2*b^2+48*d^2*a^2*t^2*c*r^2*l^2+2*e^2*d* a^2*l^6-6*e^2*d*a^2*t^2*l^4-e*b*f^3*l^4*r^2-e^2*l^2*f^2*a*t^4+6*e^2*d*a^2*l^2*t ^4-2*e^2*d*a^2*t^6-2*r^2*l^4*f^4*c+4*d^2*a*t^4*l^2*b^2+24*d^2*a^2*l^4*t^2*c-2*d ^2*a*l^4*b^2*t^2-6*d*a*t^2*l^2*r^2*e*b*f+d*r^4*a*t^2*e*b*f+2*e^2*l^4*f^2*a*t^2- 8*d*a^2*t^2*l^2*r^2*e^2-16*d*a*t^2*c*r^2*l^2*f^2+5*d*a*l^4*r^2*e*b*f-r^6*d*b^2* f^2-8*d^2*a*t^2*l^2*r^2*b^2-e^2*l^6*f^2*a+2*d*a*t^4*c*l^2*f^2+14*d*r^4*a*c*l^2* f^2-4*d*r^4*a*t^2*c*f^2+5*d*r^4*a*l^2*e*b*f-r^2*d*b^2*f^2*l^4+2*r^4*d*b^2*f^2*t ^2-r^2*d*b^2*f^2*t^4+e*d*b*f*t^2*a*l^4+e*d*b*f*l^2*a*t^4-4*d*a*t^2*l^4*c*f^2-e* b*f^3*t^2*r^2*l^2-e*d*b*f*t^6*a-e*d*b*f*l^6*a)*Z^2+(-10*d^2*r^4*a*c*b^2+48*d^2* a^2*c^2*r^2*l^2-48*d^2*a^2*t^2*c^2*r^2-2*e^4*a^2*t^2*l^2-2*d^2*b^4*t^2*r^2+c^2* l^4*f^4+r^4*c^2*f^4+d^2*b^4*t^4+e^4*a^2*l^4+e^4*a^2*t^4+24*d^2*a^2*c^2*r^4+24*d ^2*a^2*c^2*t^4-10*d*a^2*t^4*c*e^2-2*d*a*t^4*c^2*f^2-10*d^2*c*b^2*a*t^4+d*r^4*b^ 2*e^2*a+d*r^4*b^3*e*f+3*d*r^4*b^2*c*f^2-2*d*r^4*a^2*c*e^2-10*d*r^4*a*c^2*f^2+3* e^2*a*l^4*c*f^2+e^2*b^2*f^2*t^2*r^2+e^3*b*f*a*t^4+e^2*c*f^2*a*t^4+e^2*b^2*r^2*l ^2*f^2+3*e^2*d*b^2*a*t^4+r^4*c*f^2*e^2*a+r^4*c*f^3*e*b+4*r^2*l^2*f^4*c^2+4*d*a* t^2*c*r^2*e*b*f+d^2*r^4*b^4-48*d^2*a^2*t^2*c^2*l^2-2*d^2*a*l^4*c*b^2+24*d^2*a^2 *l^4*c^2+12*d*a^2*t^2*c*r^2*e^2+12*d*a*t^2*c^2*r^2*f^2-10*d*a^2*l^4*c*e^2-10*d* a*l^4*c^2*f^2+20*d^2*a*t^2*c*r^2*b^2+e*b*f^3*l^4*c+e*d*b^3*f*t^4+e^3*b*f*a*l^4- 12*d^2*a*c*l^2*r^2*b^2+e^2*l^2*f^2*b^2*t^2+e^2*d*b^2*a*l^4-28*d*a*c^2*r^2*l^2*f ^2-2*d*a*l^4*c*e*b*f-2*d*a*t^4*c*e*b*f+2*d*c*b^2*r^2*l^2*f^2-4*d*b^2*t^2*r^2*e^ 2*a-2*d*r^4*a*c*e*b*f-20*d*a*c*l^2*r^2*e*b*f-2*d*b^3*t^2*r^2*e*f+c*d*b^2*f^2*l^ 4+c*d*b^2*f^2*t^4-4*d*b^2*t^2*r^2*c*f^2-12*d*a^2*c*l^2*r^2*e^2+4*r^2*l^2*f^3*c* e*b+4*d*a*t^2*l^2*c*e*b*f+12*d^2*a*t^2*l^2*c*b^2+20*d*a^2*t^2*l^2*c*e^2+12*d*a* t^2*c^2*l^2*f^2-4*e^2*a*t^2*c*l^2*f^2+e*d*b^3*f*l^2*r^2+e*b*f^3*t^2*r^2*c+e^3*a *l^2*r^2*b*f+e^3*a*t^2*r^2*b*f+2*r^2*l^2*f^2*c*e^2*a+e*d*b^3*f*l^2*t^2+e*b*f^3* t^2*c*l^2-2*e^3*b*f*a*t^2*l^2-4*e^2*d*a*l^2*b^2*t^2)*Z^4+(-(e^2*a+f*b*e+d*b^2+f ^2*c-4*d*c*a)*(2*f^2*c^2*l^2+2*f^2*c^2*r^2+f*c*e*b*t^2+f*c*r^2*e*b+f*c*l^2*e*b- 8*c^2*a*d*r^2+8*c^2*t^2*a*d-8*c^2*a*d*l^2-2*c*d*b^2*t^2-2*c*e^2*a*t^2+2*c*d*b^2 *r^2+2*c*l^2*e^2*a+e^2*b^2*t^2))*Z^6+c^2*(e^2*a+f*b*e+d*b^2+f^2*c-4*d*c*a)^2*Z^ 8, Y = -(r^4*a*d-Z^4*e^2*c*a+4*d*a*c^2*Z^4-c*Z^4*d*b^2-2*d*a*t^2*l^2-4*d*a*c *Z^2*l^2-d*Z^2*b^2*t^2+4*d*a*t^2*c*Z^2-c*Z^4*e*b*f-4*c*Z^2*a*d*r^2+c*Z^2*l^2*f^ 2+r^2*e*Z^2*b*f+r^2*Z^2*e^2*a-2*r^2*a*t^2*d+r^2*d*b^2*Z^2+r^2*c*Z^2*f^2+2*r^2*a *d*l^2+d*a*t^4+d*a*l^4-c^2*Z^4*f^2-r^2*l^2*f^2)/Z/(-d*r^2*b*f-2*d*r^2*a*e+d*b*f *t^2+d*b*f*l^2+4*Z^2*d*c*a*e-e^2*Z^2*b*f-e^3*Z^2*a+2*e*a*t^2*d+e*l^2*f^2-e*Z^2* d*b^2-e*Z^2*c*f^2-2*e*a*d*l^2)}: