a bug in Solve
- To: mathgroup at smc.vnet.net
- Subject: [mg30892] a bug in Solve
- From: Andrzej Kozlowski <andrzej at tuins.ac.jp>
- Date: Sun, 23 Sep 2001 02:16:32 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
It seems to me that I have come across a rather devious bug in Solve which causes it to fail to solve systems of trigonometric equations which in fact it ought to be (or "is") able to solve. Here is an example: Consider the system of equations: eqs = {Cos[x] == -Sqrt[(2/85)*(19 + Sqrt[21])], Sin[x] == (1/4)*(-Sqrt[(2/85)*(19 + Sqrt[21])] + Sqrt[(42/85)*(19 + Sqrt[21])]), Cos[y] == (1/21)*(7 + 3*Sqrt[21]), Sin[y] == (1/84)*(77*Sqrt[(2/85)*(19 + Sqrt[21])] - 13*Sqrt[(42/85)*(19 + Sqrt[21])]), Cos[z] == (1/4)*(Sqrt[(2/85)*(19 + Sqrt[21])] - Sqrt[(42/85)*(19 + Sqrt[21])]), Sin[z] == -Sqrt[(2/85)*(19 + Sqrt[21])]} Trying to solve this directly leads to a misleading answer: In[37]:= Solve[eqs, {x, y, z}] From In[37]:= Solve::ifun:Inverse functions are being used by Solve, so some solutions may \ not be found. Out[37]= {} However, if we break up the system into three systems of equations in a single variable Mathematica solves them correctly: eqs1 = Partition[eqs, 2]; In[39]:= MapThread[Solve, {eqs1, {x, y, z}}] From In[39]:= Solve::ifun:Inverse functions are being used by Solve, so some solutions may \ not be found. From In[39]:= Solve::ifun:Inverse functions are being used by Solve, so some solutions may \ not be found. From In[39]:= Solve::ifun:Inverse functions are being used by Solve, so some solutions may \ not be found. From In[39]:= General::stop:Further output of Solve::ifun will be suppressed during this \ calculation. Out[39]= {{{x -> ArcCos[-Sqrt[(2/85)*(19 + Sqrt[21])]]}}, {{y -> ArcCos[(1/21)*(7 + 3*Sqrt[21])]}}, {{z -> -ArcCos[(1/340)*(Sqrt[170*(19 + Sqrt[21])] - Sqrt[3570*(19 + Sqrt[21])])]}}} Finally, let me explain how I came across this. Consider the matrix: In[40]:= Z = {{1/3 + Sqrt[3/7], -(1/3) + 2/Sqrt[21], -(1/3) + 1/Sqrt[21]}, {-(1/3) + 1/Sqrt[21], 1/3 + Sqrt[3/7], 1/3 - 2/Sqrt[21]}, {-(1/3) + 2/Sqrt[21], 1/3 - 1/Sqrt[21], 1/3 + Sqrt[3/7]}}; It is easy to check that it belongs to SO(3) In[41]:= Z.Transpose[Z]//Simplify Out[41]= {{1,0,0},{0,1,0},{0,0,1}} In[42]:= Det[Z] Out[42]= 1 Now load the Geometry`Rotations` package: << Geometry`Rotations` Since Z is in SO(3) we should be able to find the Euler angles of Z but using Solve produces: In[44]:= Solve[Thread[Flatten[RotationMatrix3D[a,b,c]]==Flatten[Z]],{a,b,c}] From In[44]:= Solve::ifun: Inverse functions are being used by Solve, so some solutions may \ not be found. Out[44]= {} However, In[45]:= Reduce[Thread[Flatten[RotationMatrix3D[a,b,c]]==Flatten[Z]],{Cos[a], Cos[b],Cos[c]}] Out[45]= Cos[a] == -Sqrt[(2/85)*(19 + Sqrt[21])] && Cos[b] == (1/21)*(7 + 3*Sqrt[21]) && Cos[c] == (1/4)*(Sqrt[(2/85)*(19 + Sqrt[21])] - Sqrt[(42/85)*(19 + Sqrt[21])]) && Sin[a] == (1/4)*(-Sqrt[(2/85)*(19 + Sqrt[21])] + Sqrt[(42/85)*(19 + Sqrt[21])]) && Sin[b] == (1/84)*(77*Sqrt[(2/85)*(19 + Sqrt[21])] - 13*Sqrt[(42/85)*(19 + Sqrt[21])]) && Sin[c] == -Sqrt[(2/85)*(19 + Sqrt[21])] || Cos[a] == Sqrt[(2/85)*(19 + Sqrt[21])] && Cos[b] == (1/21)*(7 + 3*Sqrt[21]) && Cos[c] == (1/4)*(-Sqrt[(2/85)*(19 + Sqrt[21])] + Sqrt[(42/85)*(19 + Sqrt[21])]) && Sin[a] == (1/4)*(Sqrt[(2/85)*(19 + Sqrt[21])] - Sqrt[(42/85)*(19 + Sqrt[21])]) && Sin[b] == (1/84)*(-77*Sqrt[(2/85)*(19 + Sqrt[21])] + 13*Sqrt[(42/85)*(19 + Sqrt[21])]) && Sin[c] == Sqrt[(2/85)*(19 + Sqrt[21])] This seems to suggest that the reason why Mathematica can't make the final step and return a solution for a,b and c is probably related to the problem I begun with. Andrzej Kozlowski Toyama International University JAPAN http://platon.c.u-tokyo.ac.jp/andrzej/