Re: Help with non-linear system of equations (Trigonometric and Polynomial)
- To: mathgroup at smc.vnet.net
- Subject: [mg115730] Re: Help with non-linear system of equations (Trigonometric and Polynomial)
- From: Daniel Lichtblau <danl at wolfram.com>
- Date: Wed, 19 Jan 2011 05:28:20 -0500 (EST)
Manjinder Benning wrote: > Hi i am trying to do some 3D modeling by finding a 6 unknown 6 equation > simultaneous system. I am using the equation: > > Cos(a) = A.B/|A||B| > where A and B are lines (vectors) in 3 space. > a is the angle between the lines. > > When i run the calculation, Mathematica just runs forever and doesn't come > to a solution. It would be great if a closed form solution could be found. > I am understanding that it is difficult to solve systems with polynomial and > trig parts? > > Description of Problem: > > So i have 3 points in 3-space. > Pl (Xl, Yl, Zl) - A constant point in the air > Pc(Xc, Yc, Zc) - A constant point on the ground (Z=0) > Pe's (Xe_n, Ye_n, Ze_n) - A series of points that lay on the edges of an > ellipse co-planar to Z=0 (which are known experimentally) > A - The angle between the line (Pl -> Pc) and each (Pl -> Pe_n) > > Due to the geometry of the problem (a ellipse) angle A is constant. > > > Are there any methods i can use to make it easier to solve (ie bounding the > problem) or am i dreaming that i will find a closed form solution? > ...any help would be appreciated: > > Heres the code: > > eq1 =Cos[A] == ((Xc - Xl)*(Xe1-Xl) + (Yc-Yl)*(Ye1-Yl) + (-Zl)*(-Zl))/Sqrt[( > (Xc - Xl)^2 + (Yc-Yl)^2+(-Zl)^2 ) * ((Xe1-Xl)^2 +(Ye1-Yl)^2+(-Zl)^2)] > > eq2 =Cos[A] == ((Xc - Xl)*(Xe2-Xl) + (Yc-Yl)*(Ye2-Yl) + (-Zl)*(-Zl))/Sqrt[( > (Xc - Xl)^2 + (Yc-Yl)^2+(-Zl)^2 ) * ((Xe2-Xl)^2 +(Ye2-Yl)^2+(-Zl)^2)] > > eq3 =Cos[A] == ((Xc - Xl)*(Xe3-Xl) + (Yc-Yl)*(Ye3-Yl) + (-Zl)*(-Zl))/Sqrt[( > (Xc - Xl)^2 + (Yc-Yl)^2+(-Zl)^2 ) * ((Xe3-Xl)^2 +(Ye3-Yl)^2+(-Zl)^2)] > > eq4 =Cos[A] == ((Xc - Xl)*(Xe4-Xl) + (Yc-Yl)*(Ye4-Yl) + (-Zl)*(-Zl))/Sqrt[( > (Xc - Xl)^2 + (Yc-Yl)^2+(-Zl)^2 ) * ((Xe4-Xl)^2 +(Ye4-Yl)^2+(-Zl)^2)] > > eq5 =Cos[A] == ((Xc - Xl)*(Xe5-Xl) + (Yc-Yl)*(Ye5-Yl) + (-Zl)*(-Zl))/Sqrt[( > (Xc - Xl)^2 + (Yc-Yl)^2+(-Zl)^2 ) * ((Xe5-Xl)^2 +(Ye5-Yl)^2+(-Zl)^2)] > > eq6 =Cos[A] == ((Xc - Xl)*(Xe6-Xl) + (Yc-Yl)*(Ye6-Yl) + (-Zl)*(-Zl))/Sqrt[( > (Xc - Xl)^2 + (Yc-Yl)^2+(-Zl)^2 ) * ((Xe6-Xl)^2 +(Ye6-Yl)^2+(-Zl)^2)] > > Solve[{eq1,eq2,eq3,eq4,eq5, > eq6},{A,Xl,Yl,Zl,Xc,Yc}] > > much gratitude to all things Mathematica! > Manjinder. Sjoerd de Vries gave a good answer but there are some fine points I had wanted to address. Please pardon a certain amount of replication of what he mentioned. First is that your system is not quite correct. It is overdetermined in the sense that you give six points on an ellipse, and underdetermined in that it will not be able to solve for your six parameters. The reason is of course that once you have the point coordinates, your angle is forced by e.g. the Law of Cosines. I assert this boldly so nobody will realize it took me two days to locate my missing equation. Anyway, you now can form a sixth equation using the cosine law. How do we know the original formulation is really overdetermined? because the geometry of constant angle from a line does in fact determine a quadratic curve (a conic section in the plane), and five points suffice to uniquely identify such a conic. Next item is that in some sense a closed form solution must exist. But it is likely to be horrendously big and not numerically well behaved when you plug in actual values for your points. Since your data is experimental there seems to be little point in not opting for a more numeric approach. Moreover such an approach might behave better in the situation of having an overdetermined ellipse (as de Vries notes, you can just obtain said ellipse via a best fit to the six points). It simplifies matters considerably to move the ellipse so that the major axis is the x axis. You can also center it at the origin, though that does not really affect the equations we will use. The equations needed for translating and rotating an ellipse are easy to set up and I'll omit that. We really want to work with polynomials, so we'll take some squares as needed. Also notice that the angle only appears as as cosine, and we'll end up solving for cos-squared. So there really is no transcendental function until we're done with the algebra, at which point an arccosine will be needed to recover the angle. We'll assume we normalize the ellipse so that it has the form a*x^2+y^2-b==0, with 0<a<=1. Some geometric consideration indicates that the segment from ground point to air point must project onto the major axis, so we do not have yc or yp to bother with. So we have parameters xc, xp, zp, and cossqr. Here is a symbolic formulation. groundpt = {xc, yc, 0}; airpt = {xp, yp, zp}; groundpt = {xc, 0, 0}; airpt = {xp, 0, zp}; ellipse = a*x^2 + y^2 - b; cossquared[v1_, v2_] := (v1.v2)^2/(v1.v1*v2.v2) Here we get an expression to the effect that the cosine squared of angle between segment from air point to ellipse point and segment from air point to ground point, is some constant value. We have, by set-up, assumed the major axis is the x axis. In[132]:= expr = Numerator[ Together[cossqr - cossquared[{x, y, 0} - airpt, groundpt - airpt]]] Out[132]= -x^2 xc^2 + cossqr x^2 xc^2 + 2 x^2 xc xp - 2 cossqr x^2 xc xp + 2 x xc^2 xp - 2 cossqr x xc^2 xp - x^2 xp^2 + cossqr x^2 xp^2 - 4 x xc xp^2 + 4 cossqr x xc xp^2 - xc^2 xp^2 + cossqr xc^2 xp^2 + 2 x xp^3 - 2 cossqr x xp^3 + 2 xc xp^3 - 2 cossqr xc xp^3 - xp^4 + cossqr xp^4 + cossqr xc^2 y^2 - 2 cossqr xc xp y^2 + cossqr xp^2 y^2 + cossqr x^2 zp^2 - 2 x xc zp^2 + cossqr xc^2 zp^2 + 2 x xp zp^2 - 2 cossqr x xp zp^2 + 2 xc xp zp^2 - 2 cossqr xc xp zp^2 - 2 xp^2 zp^2 + 2 cossqr xp^2 zp^2 + cossqr y^2 zp^2 - zp^4 + cossqr zp^4 Notice the above is a quadratic in x and y, that is, the locus in question does in fact lie on a conic. To get equations for the point and angle parameters, in terms of our ellipse parameters, we equate terms in the ellipse. In[155]:= polys = Flatten[CoefficientList[expr, {x, y}]] - Flatten[CoefficientList[ellipse, {x, y}]] /. 0 :> Sequence[] Out[155]= {b - xc^2 xp^2 + cossqr xc^2 xp^2 + 2 xc xp^3 - 2 cossqr xc xp^3 - xp^4 + cossqr xp^4 + cossqr xc^2 zp^2 + 2 xc xp zp^2 - 2 cossqr xc xp zp^2 - 2 xp^2 zp^2 + 2 cossqr xp^2 zp^2 - zp^4 + cossqr zp^4, -1 + cossqr xc^2 - 2 cossqr xc xp + cossqr xp^2 + cossqr zp^2, 2 xc^2 xp - 2 cossqr xc^2 xp - 4 xc xp^2 + 4 cossqr xc xp^2 + 2 xp^3 - 2 cossqr xp^3 - 2 xc zp^2 + 2 xp zp^2 - 2 cossqr xp zp^2, -a - xc^2 + cossqr xc^2 + 2 xc xp - 2 cossqr xc xp - xp^2 + cossqr xp^2 + cossqr zp^2} Say we give numeric values for the ellipse parameters. Then it is a simple matter to find the point and angle parameters. Here is a simple example. In[156]:= Solve[(polys /. {b -> 1, a -> 1/9}) == 0] // N Out[156]= {{cossqr -> 0.779803, xc -> 2.39604, zp -> -0.627285, xp -> 3.33885}, {cossqr -> 0.779803, xc -> 2.39604, zp -> 0.627285, xp -> 3.33885}, {cossqr -> 0.779803, xc -> -2.39604, zp -> -0.627285, xp -> -3.33885}, {cossqr -> 0.779803, xc -> -2.39604, zp -> 0.627285, xp -> -3.33885}, {cossqr -> 1.64877, xc -> -3.33885, zp -> 0. - 0.53139 I, xp -> -2.39604}, {cossqr -> 1.64877, xc -> -3.33885, zp -> 0.+ 0.53139 I, xp -> -2.39604}, {cossqr -> 1.64877, xc -> 3.33885, zp -> 0. - 0.53139 I, xp -> 2.39604}, {cossqr -> 1.64877, xc -> 3.33885, zp -> 0. + 0.53139 I, xp -> 2.39604}} Complex solutions (where the cosine squared may be other than between 0 and 1) get discarded. You then can decide what you want to use. Presumably you want the z coordinate of the air point to be positive. Another subtlety here is that we have the square of the cosine. Should we take the cosine to be positive or negative? This depends on the placement of xp. Geometric considerations show that xc will be inside the ellipse. If xp is such that the air point projects (down) to be also inside the ellipse then the angle is obtuse, so take the negative for the cosine. Else it is acute and so the cosine is positive. By the way, while the above use of Solve (or NSolve) seems easy enough, a different formulation with FindRoot seemed unable to get solutions even when starting near one. I do not know if this was bad setup on my part or numeric instability. In any case, what this indicates to me is that the steps of finding the ellipse from six points, translating/rotating to put into the above canonical form, and solving for {xc,xp,zp,cossqr} are the way to do this. In contrast, setting up five equations based on five ellipse points, augmenting with an equation derived from the Law of Cosines, and solving from there seems not to work: FindRoot gives up and NSolve hangs. For the morbidly curious, the extra eqwuation based on LoC is constructed as below. newpoly = With[ {v1 = groundpt - pts[[1]], v2 = groundpt - airpt, v3 = pts[[1]] - airpt}, (v1.v1 - v2.v2 - v3.v3)^2 - 4*v2.v2*v3.v3*cossqr] Daniel Lichtblau Wolfram Research