# Make a differentiable smooth sawtooth waveform

So, I am trying to understand the effect of sawtooth waveform on a mechanical system model. For example, a system of a plate and a box on it. And then we try to oscillate the plate.

In order to do that, I need to calculate the inertial force caused by the sawtooth waveform. And to find the inertial force, I need to calculate second derivative of sawtooth waveform. But because, you know, sawtooth waveform is not differentiable everywhere, I think make an approximation by using a smooth sawtooth waveform is enough. 'Smooth' here, I mean substitute upper tip and bottom tip of the sawtooth waveform into a circular curve of a certain radius.

So in short, my question is: How to make sawtooth wavefrom with a dull tip with Mathematica? Here, although I said sawtooth, it would be better if applicable to any triangle waveform.

EDIT:

What if my triangle waveform is made from a completely arbitrary piecewise function such as below

f = Piecewise[{{10 Mod[x, 1], 0 <= Mod[x, 1] < 0.1},
{-(10/9) Mod[x, 1] + (10/9), 0.1 <= Mod[x, 1] < 1}}];
Plot[Evaluate[f], {x, -3, 3}]


Is it still possible?

-
there is a formula for a fourier series approximation here..demonstrations.wolfram.com/… –  george2079 Dec 5 '13 at 13:49
@george2079 Unfortunately there are Gibbs oscillations. It is very bad especially for derivatives. You need to introduce a smooth cut-off of the Fourier series with one of the window function. It is more difficult task then the Gaussian smoothing. –  ybeltukov Dec 5 '13 at 14:11
Of course.. I answered the title question w/o thinking about what he wanted to do with it. –  george2079 Dec 5 '13 at 16:16

There are nice trigonometric formulas

δ = 0.01;

trg[x_] := 1 - 2 ArcCos[(1 - δ) Sin[2 π x]]/π;
sqr[x_] := 2 ArcTan[Sin[2 π x]/δ]/π;
swt[x_] := (1 + trg[(2 x - 1)/4] sqr[x/2])/2;

Plot[{TriangleWave[x], trg[x]}, {x, -2, 2}, PlotRange -> All]
Plot[{SquareWave[x], sqr[x]}, {x, -2, 2}, PlotRange -> All, Exclusions -> None]
Plot[{SawtoothWave[x], swt[x]}, {x, -2, 2}, PlotRange -> All, Exclusions -> None]


You can use Gaussian smoothing and interpolation:

n = 1000;
δ = 0.02;

f = Interpolation[Prepend[#, {0.0, #[[-1, 2]]}], PeriodicInterpolation -> True] &@
Transpose@{#, GaussianFilter[SawtoothWave[#], δ n {5, 1},
Padding -> "Periodic"]} &@Range[1/n, 1.0, 1/n];

Plot[{SawtoothWave[x], f[x]}, {x, -1.2, 1.2}]


Here n is the number of interpolation points and δ is the standard deviation of the smoothing.

The second derivative:

Plot[f''[x], {x, -0.1, 0.1}]


-
congratulations on your 10k! :) –  rm -rf Dec 11 '13 at 18:14
@rm-rf Thanks! I learned a lot of interesting things when I was earning this reputation :) –  ybeltukov Dec 11 '13 at 18:34

One approach is to convolve the sawtooth wave directly with a Gaussian kernel. Since this can be done analytically, it is possible to return a function that is in closed form and hence can be differentiated without interpolation.

f = Integrate[SawtoothWave[t/10] Exp[-3 (t - x)^2] , {t, 0, 50}]
Plot[f, {x, 0, 50}]


You can control the amount of "rounding" at the top and bottom by the width of the Exp function. Defining the derivative:

df[x_] := D[f, x];


gives a closed form (though it is not exactly "simple"). The second derivative D[df[x], x] is also possible analytically. The method also works fine with TriangleWave instead of SawtoothWave.

-
It is exactly my fist idea! But I tried to integrate from -∞ to ∞ with no luck. –  ybeltukov Dec 5 '13 at 23:14
@ybeltukov -- I think this is why the built-in Convolve function doesn't work. But really, the problem doesn't require the full integral, only a portion is needed. –  bill s Dec 5 '13 at 23:26

The Fourier series of the sawtooth is differentiable, being made up of sines. However, as ybeltukov pointed out in a comment I did not read until he made me aware of it, Fourier series of piecewise continuously differentiable functions tend to overshoot a jump discontinuities, something which is called Gibbs phenomenon. For that reason a Fourier series may not work very well for derivatives.

Plot[(2/Pi) Sum[(-1)^k Sin[2 Pi  k t]/k, {k, 10000}], {t, 0, 3}]


Be sure to read ybeltukov's comments below! I'm lifting the content into the answer since its so useful it deserves to be more visible. He suggests this solution:

(2/Pi) N@ Sum[(-1)^k Sin[2 Pi k t]/k BlackmanNuttallWindow[k/2/200], {k, 200}]


He plotted the second derivative and got this good looking graph:

-
Gibbs oscillations not die out as the frequency increases. See my comment under OP's question. The second derivative always has heavy oscillating tails. I think it is not good from the physical point of view. –  ybeltukov Dec 6 '13 at 0:24
@ybeltukov I did not see that comment, thank you. I had never heard of Gibbs phenomenon before, however I observed it when I plotted the function for a smaller range of k, but I thought it died out with higher ones. I will update the post accordingly. –  Pickett Dec 6 '13 at 0:31
Try something like (2/Pi) N@ Sum[(-1)^k Sin[2 Pi k t]/k BlackmanNuttallWindow[k/2/200], {k, 200}]. It produces nice shape of the second derivative. –  ybeltukov Dec 6 '13 at 0:37
Gibbs phenomenon only occurs at jump discontinuities. The Sawtooth wave is a continuous function, so there will be no Gibbs phenomenon for the function, but it will be present in the derivate (which has jump discontinuities). –  Aditya Dec 6 '13 at 5:33
@Aditya why do you claim the sawtooth wave is continuous function? –  Kuba Dec 6 '13 at 7:25