Re: Gradient of a List
- To: mathgroup at smc.vnet.net
- Subject: [mg82640] Re: Gradient of a List
- From: Valeri Astanoff <astanoff at gmail.com>
- Date: Fri, 26 Oct 2007 05:34:45 -0400 (EDT)
- References: <ffn0uv$60k$1@smc.vnet.net>
On 24 oct, 10:49, olalla <operez... at ikasle.ehu.es> wrote:
> Hi everybody,
>
> Does anybody know how can I get the "gradient" of a list ofpoints?
>
> My real problem is:
>
> I have a scalar field previously obtained numerically that for a
> given point (xi,yi) takes a value f(xi,yi). What I want to do is an
> estimation of thegradientof this scalar field BUT I haven't got any
> analytical function that expresses my field so I can't use the Grad
> function.
>
> How can I solve this using Mathematica?
>
> Thanks in advance
>
> Olalla, Bilbao UPV/EHU
Good day,
Here is a DIY solution using ListInterpolation
(not very fast nor clever, but it works):
In[1]:= gridify[xyz_List?MatrixQ /;Dimensions[xyz][[2]]==3]:=
Module[{xi,yi,nx,ny,t,ff,u,v,z},
xi = xyz[[All,1]]//Union;
yi = xyz[[All,2]]//Union;
nx = Length[xi]; ny = Length[yi];
xmin = Min[xi]; xmax = Max[xi];
ymin = Min[yi]; ymax = Max[yi];
dx = (xmax-xmin)/(nx-1);
dy = (ymax-ymin)/(ny-1);
Print["xmin = ",xmin," xmax = ",xmax," dx = ",dx];
Print["ymin = ",ymin," ymax = ",ymax," dy = ",dy];
z[x_,y_]:=
(t= xyz[[Ordering[xyz,6,(x-#1[[1]])^2+(y-#1[[2]])^2<
(x-#2[[1]])^2+(y-#2[[2]])^2&]]];
ff[u_,v_]=Fit[t,{1,u,v,u^2,v^2,u v},{u,v}];
ff[x,y]);
Table[{{x,y}, z[x,y]} ,{x,xmin,xmax,dx},{y,ymin,ymax,dy}]
];
Toy example with 2x^2+3y^2 as test function with 100 points:
In[2]:= data=Table[{xr=RandomReal[],yr=RandomReal[],2xr^2+3yr^2},
{100}];
data //Short
Out[3]//Short= {{0.00503481,0.14094,0.0596427},<<98>>,
{0.638564,0.679141,2.19923}}
In[4]:= g=gridify[data];
During evaluation of In[4]:= xmin = 0.00503481 xmax = 0.960222 dx =
0.00964836
During evaluation of In[4]:= ymin = 0.00759144 ymax = 0.994708 dy =
0.00997087
In[5]:= f=ListInterpolation[ g];
Compute interpolated value at (.5,.6) :
In[6]:= f[.5,.6]
Out[6]= 1.58
Check value:
In[7]:= 2x^2+3y^2/.x->.5/.y->.6
Out[7]= 1.58
Compute gradient:
In[8]:= fx[f_,y0_] :=Interpolation[Table[{x,f[x,y0]},
{x,xmin,xmax,dx}]] ;
fy[f_,x0_] :=Interpolation[Table[{y,f[x0,y]},{y,ymin,ymax,dy}]] ;
grad[f_,x0_,y0_]:={fx[f,y0]'[x0],fy[f,x0]'[y0]};
In[11]:= grad[f,.5,.6]
Out[11]= {2.,3.6}
Check gradient:
In[12]:= {D[2x^2+3y^2,x],D[2x^2+3y^2,y]}/.x->.5/.y->.6
Out[12]= {2.,3.6}
hth
Valeri Astanoff