0
$\begingroup$

I know the values for a function v[x,y] on an irregular grid of (x,y) points. Call the table storing all these points xyvtriples. Because of the irregular grid, the Mathematica function Interpolation only works as

interpolatedvfunc = Interpolation[xyvtriples, InterpolationOrder -> 1];

But what I really need are the partial derivatives of interpolatedfunc with respect to each argument, and for those partials to be continuous, which won't happen due to the edges produced by InterpolatioOrder -> 1.

Is there any way around this? I can make a very fine grid of (x,y) points to (I hope) counter any problems with forcing a spline like interpolation if I can somehow force this to happen.

Thanks.

$\endgroup$
4
  • $\begingroup$ If NDSolve can do it, you can, too: (E.g. usol = NDSolve[{-Laplacian[u[x, y], {x, y}] == 1, DirichletCondition[u[x, y] == 0, True]}, u, {x, y} \[Element] Disk[]]; Plot3D[Evaluate[D[u[x, y], x] /. First[usol]], {x, y} \[Element] Disk[]]. But I don't understand your setup/workflow and feel it's not worth trying something out I don't really need and don't know if it will help. Please give a minimal working example (in code) for us to copy/paste and play with. $\endgroup$
    – Michael E2
    Apr 16, 2022 at 15:06
  • 1
    $\begingroup$ You say that you can make a very fine grid of $(x,y)$ points; what, then, is stopping you from making this fine grid so regular that Interpolation will accept it at higher order? $\endgroup$
    – Roman
    Apr 16, 2022 at 15:45
  • $\begingroup$ This may be an XY problem. If you tell us how you calculate the values of your $v(x,y)$, then maybe somebody can suggest a direct way of calculating the partial derivatives instead of taking a detour over interpolation and numerical differentiation. $\endgroup$
    – Roman
    Apr 16, 2022 at 15:46
  • 1
    $\begingroup$ You might also use polyharmonicSpline[]. $\endgroup$
    – Michael E2
    Apr 16, 2022 at 15:53

2 Answers 2

1
$\begingroup$

You could use the first interpolation to create data on a grid. Then you can interpolate this new data with the default InterpolationOrder->3. Here is an example:

f1 = Interpolation[dat, InterpolationOrder -> 1] Plot3D[f1[x, y], {x, 0, 2 Pi}, {y, 0, 2 Pi}]

enter image description here

Now we can create new data and interpolate it:

dat2 = Table[{x, y, f1[x, y]}, {x, 0, 2 Pi}, {y, 0, 2 Pi}] f2 = Interpolation[dat]; Plot3D[f2[x, y], {x, 0, 2 Pi}, {y, 0, 2 Pi}]

enter image description here

Finally you can get the partial derivatives.

$\endgroup$
1
$\begingroup$

I can make a very fine grid of (x,y) points to (I hope)...

I hope to have guessed the OP's setup/workflow...and that this quote indicates that the data/function to be interpolated can be generated for any set of points.

In which case, we can use a quadratic ElementMesh[] to get a higher-order interpolation.

Needs@"NDSolve`FEM`";
emesh = ToElementMesh[Disk[]];
data = Function[{x, y}, Sin[3 x] Cos[2 y]^2] @@@ 
   emesh["Coordinates"]; (* need data pt for each of these coords *)
ifn = ElementMeshInterpolation[{emesh}, data];
Plot3D[Evaluate[D[ifn[x, y], {{x, y}}]], {x, y} \[Element] emesh]

Being order 2, ifn is not of class $C^2$:

Plot3D[Evaluate[D[ifn[x, y], {x, 2}]], {x, y} \[Element] emesh, 
 PlotPoints -> 100, NormalsFunction -> None, Mesh -> None]
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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