# Gradients of the NDSolve PDE solution

I would like to understand, how to obtain gradients of the PDE solution obtained with NDSolve. To be precise let us consider a Laplace equation from one of the examples:

    Clear[x, y, f];
Needs["NDSolveFEM"]
emesh = ToElementMesh[Disk[]];

f = NDSolveValue[{Derivative[0, 2][u][x, y] +
Derivative[2, 0][u][x, y] == 0,
DirichletCondition[u[x, y] == Sin[x y], True]},
u, {x, y} ∈ emesh]


This returns the interpolation function which one can plot and integrate:

    NIntegrate[f[x, y], {x, y} ∈ emesh]

(*  1.52794*10^-8  *)

Plot3D[f[x, y], {x, y} ∈ emesh]


This, however, does not work:

  g[x_, y_] := D[f[x, y], x];
Plot3D[g[x, y], {x, y} ∈ emesh]


Since Integrate does not work on this result, only NIntegratedoes, the problem is probably that one needs to apply a numeric derivative. What and how?

• Duplicate: 1301. Also related: 48383, 50791, 69188. – Michael E2 Jun 8 '15 at 15:36
• @MichaelE2 but this is completely different: its on a mesh :-) – chris Jun 8 '15 at 16:05
• @chris I'm a little slow to understand the ":-)" -- I thought you would object that it's a two-variable function (instead of single-variable). :-) – Michael E2 Jun 8 '15 at 16:14
• @Michael E2 Thank you for the most useful references – Alexei Boulbitch Jun 10 '15 at 7:29

That's an easy one:

g[x_, y_] = D[f[x, y], x];
Plot3D[g[x, y], {x, y} \[Element] emesh]


Note the : in the definition of g :-)

• You beat me to it by a few seconds :-) – user21 Jun 8 '15 at 15:20
• @user21 I think I learnt it from one of your posts! – chris Jun 8 '15 at 15:21
• If one wanted it to be SetDelayed for some reason one could also do g[x_, y_] := Evaluate[D[f[x, y], x]]; – user21 Jun 8 '15 at 15:23
• @user21 feel free to answer this question instead mathematica.stackexchange.com/q/84726/1089 :-) it is more in your league ! – chris Jun 8 '15 at 15:23
• One can also use g = Derivative[1, 0][f]. – Michael E2 Jun 8 '15 at 16:09