Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I have a set of trig equations, c1,c2,c3 are constants, I excepted the result is

c1 c2 c3 r^2 + (c1^2 + c2^2 + c3^2 - 1) r + c1 c2 c3 == 0 but following code worked so slow, is there a faster method do this?

Eliminate[{
  c1 == Cos[a] Sin[b],
  c2 == Cos[b] Sin[c],
  c3 == Cos[c] Sin[a],
  r== Tan[a] Tan[b] Tan[c]}, {a, b, c}]
share|improve this question
add comment

3 Answers

up vote 4 down vote accepted

Can be made much more efficient if you replace the trigonometric stuff with explicit algebraic variables. This will involve clearing denominators and also augmenting with more algebraic expressions that enforce the basic trig identities.

eqns = {c1 == Cos[a] Sin[b], c2 == Cos[b] Sin[c], c3 == Cos[c] Sin[a],
    r == Tan[a] Tan[b] Tan[c]};
e2 = Apply[Subtract, eqns, {1}];
e3 = e2 /. {Cos[a_] :> c[a], Sin[a_] :> s[a], Tan[a_] :> s[a]/c[a]};
vars = Variables[e3];
newe = Map[#^2 + s[#[[1]]]^2 - 1 &, Cases[vars, c[_]]];
allexprs = Numerator[Together[Join[e3, newe]]];
elims = Cases[vars, _c | _s];
keep = Complement[vars, elims];

elim = Eliminate[allexprs == 0, elims]

(* Out[75]= c3^2 r + c1 c2 c3 (1 + r^2) == (1 - c1^2 - c2^2) r *)

I often find it easier to use GroebnerBasis rather than Eliminate.

Timing[gb = GroebnerBasis[allexprs, keep, elims]]

(* Out[73]= {0.133516, {c1 c2 c3 - r + c1^2 r + c2^2 r + c3^2 r + 
   c1 c2 c3 r^2}} *)
share|improve this answer
    
Daniel, I cannot help but notice some rather baroque programming here if I am thinking clearly. Why not e.g. e2 = Subtract @@@ eqns and e3 = e2 /. {Cos -> c, Sin -> s, Tan -> (s[#]/c[#] &)} and most especially newe = Cases[vars, x : c[y_] :> x^2 + s[y]^2 - 1]? I guess the first two could be a matter of clarity but your code for newe just seems needlessly complicated. Please pardon me for what may seem a rather disrespectful question, but actually it is my respect that makes me care why you chose to code this as you did. –  Mr.Wizard Jul 21 '13 at 13:02
    
You are quite correct that it is a bit on the clumsy side. I did not think about the simple Cos->c, etc. rule. I never quite warmed to the @@@ infix (I often avoid infix...). As for your newe = ..., I guess it's a bit out of my range of coding tactics. Strangely enough, I would reverse your analysis though. I think your first two are both simpler and more clear than what I had, whereas the third I find to be a matter of taste. Reason being, as a usage of pattern matching that is not terribly familiar (to me), reconstructing the idea later would become more difficult. –  Daniel Lichtblau Jul 21 '13 at 16:29
add comment
Eliminate[{
  c1 == Cos[a] Sin[b],
  c2 == Cos[b] Sin[c],
  c3 == Cos[c] Sin[a],
  t1 == Sin[a] Sin[b] Sin[c],
  t2 == Cos[a] Cos[b] Cos[c],
  r == t1/t2 }, {a, b, c, t1, t2}]

(*c3^2 r + c1 c2 c3 (1 + r^2) == (1 - c1^2 - c2^2) r*)


Eliminate[{
  c1 == Cos[a] Sin[b],
  c2 == Cos[b] Sin[c], 
  c3 == Cos[c] Sin[a], 
  (Cos[a] Cos[b] Cos[c]) r == Sin[a] Sin[b] Sin[c] },
 {a, b, c}]

(*c3^2 r + c1 c2 c3 (1 + r^2) == (1 - c1^2 - c2^2) r*)
share|improve this answer
add comment

You can use Solve and take care of the uninteresting periodicity by hand (this last step only for speed) :

sol = Solve[{c1 == Cos[a] Sin[b], c2 == Cos[b] Sin[c], c3 == Cos[c] Sin[a]}, {a, b, c}] 
 /. {C[1] -> 0, C[2] -> 0, C[3] -> 0};

You will get several equivalent solutions which boil down to :

Union[FullSimplify[(Tan[a] Tan[b] Tan[c] /. #)] & /@ sol]
(* {-((-1 + c1^2 + c2^2 + c3^2 - Sqrt[(-1 + c1^2 + c2^2 - 2 c1 c2 c3 + c3^2) (-1 + c1^2 + c2^2 + 2 c1 c2 c3 + c3^2)])/(2 c1 c2 c3)),
    -((-1 + c1^2 + c2^2 + c3^2 + Sqrt[(-1 + c1^2 + c2^2 - 2 c1 c2 c3 + c3^2) (-1 + c1^2 + c2^2 + 2 c1 c2 c3 + c3^2)])/(2 c1 c2 c3))}
*)
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.