When using the Finite Element Method of NDSolve to solve a set of ODE, the resulting `InterpolatingFunction` showcases a strange chattering in its derivatives. This behavior does not occur when using the default method or Runge-Kutta options.

Let me illustrate the issue with a very simple problem.

**DEFAULT CASE**

A reference solution can be obtained with the following code

    w2 = 6;
    m = 2;
    T = 2.0;
    sol = NDSolveValue[{q'[t] == ζ[t], ζ'[t] + w2*Sin[q[t]] == 0, 
                        q[0] == Pi/3., ζ[0] == 0}, {q, ζ}, {t, 0, T}]

Solutions are smooth. One can easily plot the time derivative of the first solution with

    Plot[sol[[1]]'[t], {t, 0, T}]

**FEM CASE**

The same solutions can be obtained by using the Finite Element Method option of NDSolve:

    solFEM = NDSolveValue[{q'[t] == ζ[t], ζ'[t] + w2*Sin[q[t]] == 0,
                           DirichletCondition[{q[t] == Pi/3., ζ[t] == 0}, t == 0]}, 
                          {q, ζ}, t ∈ Line[{{0}, {T}}], Method -> {"FiniteElement"}]

Of course, the solutions are also smooth in this case and the time derivative of the first solution can be plotted with

    Plot[solFEM[[1]]'[t], {t, 0, T}]

We can compare both plots and see that the one coming from the Finite Element Method has some chattering to it:

[![enter image description here][1]][1]

This is of course just one basic example and the issue shown here tends to be more troublesome for more complicated situations.

So, why does this happen? And since I really need the FEM option for a specific scenario, how can this be avoided or treated?

**EDIT 1**

On appearance, an easy fix would have been to reduce the cell size of the FEM method. This can be achieved by setting the `"MaxCellMeasure"` size to something smaller (like 0.01 or 0.001 for example):

     solFEM = 
     NDSolveValue[{q'[t] == ζ[t], ζ'[t] + w2*Sin[q[t]] == 0, 
       DirichletCondition[{q[t] == Pi/3., ζ[t] == 0}, t == 0]}, 
       {q, ζ}, t ∈ Line[{{0}, {T}}], 
       Method -> {"FiniteElement", "MeshOptions" -> {MaxCellMeasure -> 0.01}}]

However, this only "hides" the issue to the bare eye. One can still see the chattering effect when zooming around the minimum for example:

[![enter image description here][2]][2]
[![enter image description here][3]][3]


  [1]: https://i.sstatic.net/Uu3gb.png
  [2]: https://i.sstatic.net/1B1oD.png
  [3]: https://i.sstatic.net/Kgc2t.png

**Why would this matter?**

My problem with this issue has nothing to do with the curve appearance. On a practical level, if I want to determine, say, the local minimum (or maximum) near some region, then `FindMinimum` (or `FindMaximum`) will inevitably fail. I can easily find the local minimum near `t->0.5` for the "default" solution:

    FindMinimum[sol[[1]]'[t], {t, 0.5}]
    (* {-2.44949, {t -> 0.688223}} *)

However, this is not possible with the FEM solution because chattering obviously affects `FindMinimum`:

    FindMinimum[solFEM[[1]]'[t], {t, 0.5}]
    
>••• FindMinimum: The line search decreased the step size to within the tolerance specified by AccuracyGoal and PrecisionGoal but was unable to find a sufficient decrease in the function. You may need more than MachinePrecision digits of working precision to meet these tolerances.

    (* {-2.1981, {t -> 0.5}} *)

Because of chattering, this simple operation becomes impossible even when directly feeding a very close initial guess:

    FindMinimum[solFEM[[1]]'[t], {t, 0.688223}]
    
>••• FindMinimum: Line search unable to find a sufficient decrease in the function value with MachinePrecision digit precision.

    (* {-2.45211, {t -> 0.69}} *)

This is only one example of the consequences of that chattering effect.