Mathematica Stack Exchange is a question and answer site for users of Mathematica. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Note: This questions is quite different from the ones referred to in the comments. Those deal with numerical questions, while this one is algebraic.

I have plots of the following type:

Plot[Cos[50 t] + Cos[51 t], {t, 0, 10}]

enter image description here

I would like to plot a envelope over this plot, i.e. another plot that joins all of maxima and minima of this plot respectively. Here is my attempt, but it's not exactly what I'd like:

Plot[{Cos[50 t] + Cos[51 t], Cos[t] + 1.5, -Cos[t] - 1.5}, {t, 0, 10}]

enter image description here

How can I generate the actual envelope?

share|improve this question
I'm guessing that's something like Cos[42x]+Cos[43x]? – Mark McClure Jun 3 '14 at 18:29
this is completely true but this is for the Fig.1, I want to access to sheath while I do not access to any formula for that. – Unbelievable Jun 3 '14 at 18:32
Well, you've got to give us some kind of input to start with. – Mark McClure Jun 3 '14 at 18:34
I plotted these ones with: Plot[{Cos[50 t] + Cos[51 t], Cos[t] + 1.5, -Cos[t] - 1.5}, {t, 0, 10}], I used of simulated functions 'Cos[t] + 1.5' and '-Cos[t] - 1.5' for the sheath. – Unbelievable Jun 3 '14 at 18:36
Nearly a duplicate of Elegant way of obtaining the envelope of oscillating function, which is a duplicate of Mathematica envelope for the bottom of a plot, a generic function. But this one just straight trigonometry. – Michael E2 Aug 28 '14 at 0:20
up vote 14 down vote accepted

Playing with the manipulate below might help. It's based on the the acoustics of beats.

  {Cos[a*t] + Cos[b*t], 2*Cos[(b - a) t/2], -2*Cos[(b - a) t/2]}, {t, 0, 10},
  PlotStyle -> {
   Directive[Black, Thick], 
   Directive[Black, Thick]}],
 {{a, 20}, 1, 50}, {{b, 21}, 1, 50}]

enter image description here

share|improve this answer
Thank you so much. this is correct – Unbelievable Jun 3 '14 at 18:58

Don't mind me, I'm just having fun.

Grab the definition of HilbertTransform from this previous post, and then:

f[t_] := Cos[50 t] + Cos[51 t] + Sin[53 t] (* more sinusoids = more fun *)
g[t_] := Evaluate@HilbertTransform[f[τ], τ, t]
h[t_] := Abs[f[t] + I g[t]]
Plot[{f[t], h[t], -h[t]}, {t, 0, 10}, ImageSize -> Large, PlotPoints -> 100,
 PlotStyle -> {Automatic, Black, Black}]

enter image description here

You can see that the envelope has a nice analytical form:

ComplexExpand[h[t]] // FullSimplify

$\sqrt{3 + 2\cos t + 2\sin 2t + 2\sin 3t}$

Further reading: analytic representation.

share|improve this answer
This way though doesn't seem to catch when the envelope should go to zero. Shouldn't it e.g. vanish near 2? – Ruslan Jun 4 '14 at 8:34
Should it? It still looks like a sinusoid with small but nonzero amplitude there. (The envelope correctly goes to zero for the original function in the question, if that's what you're concerned about.) – Rahul Jun 4 '14 at 8:55
Ah, OK then, you're right. – Ruslan Jun 4 '14 at 9:02
@Rahul: wow! that's really cool! Would this also work on a set of discrete data? Something like ListLinePlot[Accumulate[RandomReal[{-1, 1}, 1000]]] ... If not, how could one modify it so that it does? I have a bunch of data that makes a seemingly random curve like that and I'd like be able to integrate over some area under the curve like the one that you generated. (Hmmm, i just copy pasted your code, but didn't get the black curve :( what could have gone wrong?) – Solarmew May 16 '15 at 3:46
@Solarmew: You first need to copy the definition of the Hilbert transform from the post I linked to. It also gives a discrete version of the transform, which you could use in much the same way on discrete data. – Rahul May 16 '15 at 15:58

Your Answer


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.