I am trying to find the solution to the following sine wave equation

wavt = 2Pi*a*Sin[2Pi*a*t]+2Pi*b*Sin[2Pi*b*t]+2Pi*c*Sin[2Pi*c*t];


where a, b and c are all positive real numbers that do not necessarily share a common GCD. I've tried both Solve and Reduce but it gives the message "this system cannot be solved by the methods available to...". Using FindRoot only gives an answer for t = 0. Substituting real numbers does give solutions, which makes me suspect that this equation is transcendental. I've spent days here looking at workarounds for other transcendental equations but have been unable to modify them to this problem. They all seem to involve setting numerical limits on the symbolic variables but this is beyond my humble programming abilities. If I include conditions such as


then it does evaluate but without stopping. I only need to find a finite number of solutions from t = 0 so I'm pretty sure a solution can be found. Any help would be greatly appreciated.

  • 5
    $\begingroup$ Can you give the equation in Mathematica code format, rather than $\LaTeX$ $\endgroup$ – Feyre Jan 31 '17 at 11:47
  • 4
    $\begingroup$ im sure you will need to do this numerically. try FindRoot $\endgroup$ – george2079 Jan 31 '17 at 12:31
  • $\begingroup$ This is non-linear equation in $t$. As George says, you'll have to use numerical solution. $\endgroup$ – Nasser Jan 31 '17 at 14:01

You mention that you don't know how to "set numerical limits" on the roots. If you don't know where a root of a function is (or if it even exists), the quick-and-dirty way to estimate it is simply to Plot it. For example:

Plot[wavt[t, 1.334, 0.302, 0.191], {t, 0, 1}] 

enter image description here

We see from this graph that there are roots between 0.3 & 0.5; between 1.1 and 1.3; between 1.3 and 1.5; and between 1.8 and 2.0. We can then feed these ranges into FindRoot to find more precise values of the roots:

FindRoot[wavt[t, 1.334, 0.302, 0.191] == 0, {t, 0.3, 0.5}]
FindRoot[wavt[t, 1.334, 0.302, 0.191] == 0, {t, 1.1, 1.3}]
FindRoot[wavt[t, 1.334, 0.302, 0.191] == 0, {t, 1.3, 1.5}]
FindRoot[wavt[t, 1.334, 0.302, 0.191] == 0, {t, 1.8, 2.0}]

(* {t -> 0.401602} *)
(* {t -> 1.16367} *)
(* {t -> 1.47312} *)
(* {t -> 1.87635} *)

Unfortunately, I do not believe that it is possible to make this process completely automated; you'll need to plot the function for your chosen values of $a$, $b$, $c$, adjust the range until you find a desired number of roots, estimate the ranges that the roots lie in, and then run FindRoot using these ranges.

  • 3
    $\begingroup$ see here for using NDSolve for automated root finding: mathematica.stackexchange.com/a/109276/2079 $\endgroup$ – george2079 Feb 1 '17 at 20:46
  • $\begingroup$ Thank you Michael Seifert. I suspected this might be the case because MCA could easily find the solutions when I plugged in real values. However, looking at posts such as this (mathematica.stackexchange.com/questions/54896/…) makes me suspect that some workaround might eventually be found to find an algebraic solution within certain limits. E.g., we might restrict the domain of frequencies to, say, 1<c<b<a<1000. And by looking at these in the time domain some form of restriction might present itself. $\endgroup$ – Rick Feb 2 '17 at 0:50

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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