# ndgrid

массивы для многомерного вычисления функций по координатной сетке

## Последовательность вызова

                X, Y] = ndgrid(x,y)
                [X, Y, Z] = ndgrid(x,y,z)
                [X, Y, Z, T] = ndgrid(x,y,z,t)
                [X1, X2, ..., Xm] = ndgrid(x1,x2,...,xm)

## Аргументы

x, y, z, ...

  векторы

X, Y, Z, ...

  в случае двух входных аргументов - матрицы, в противном случае - гиперматрицы

## Описание

Эта служебная программа полезна для создания массивов для вычисления функций по 2-х, 3-х, ... , n-мерной координатной сетке. Например, в двухмерная координатная сетка определяется двумя векторами, `x` и `y` длиной `nx` и `ny` и вы хотите вычислить функцию (скажем, f) во всех точках координатной сетки, то есть во всех точках с координатами (x(i),y(j)), где i=1,..,nx и j=1,..,ny. В этом случае данная функция может вычислить две матрицы `X,Y` размером nx x ny такие, что:

    X(i,j) = x(i)  для всех i в [1,nx]
    Y(i,j) = y(j)         и j в [1,ny]

и вычисление может быть сделано с `Z=f(X,Y)` (при условии, что вы написали код функции `f` для работы с векторными аргументами, что делается (вообще) с помощью поэлементных операторов `.*`, `./` и `.^` вместо `*`, `/` и `^`).

В трёхмерном случае, рассматриваются три вектора `x, y, z` длиной `nx`, `ny` и `nz`. `X, Y, Z` являются тремя гиперматрицами размерами nx x ny x nz такими, что:

    X(i,j,k) = x(i)
    Y(i,j,k) = y(j)   для всех (i,j,k) в [1,nx] x [1,ny] x [1,nz]
    Z(i,j,k) = z(k)

В общем случае `m` входных аргументов `x1, x2, ... , xm`, тогда `m` выходных аргументов `X1, X2, ... , Xm` являются гиперматрицами размерами nx1 x nx2 x ... x nxm и:

    Xj(i1,i2,...,ij,...,im) = xj(ij)
    для всех (i1,i2,...,im) в [1,nx1] x [1,nx2] x ... x [1,nxm]

## Примеры

    // создание простой двухмерной координатной сетки
    nx = 40; ny = 40;
    x = linspace(-1,1,nx);
    y = linspace(-1,1,ny);
    [X,Y] = ndgrid(x,y);

    // вычисление функции в координатной сетке и построение её на графике
    deff("z=f(x,y)","z=x.^2 + y.^3")
    Z = f(X,Y);
    clf()
    plot3d(x,y,Z, flag=[2 6 4]); show_window()

nx = 40; ny = 40; x = linspace(-1,1,nx); y = linspace(-1,1,ny); [X,Y] = ndgrid(x,y); deff("z=f(x,y)","z=x.^2 + y.^3") Z = f(X,Y); plot3d(x,y,Z, flag=[2 6 4]);

    // создание простой трёхмерной координатной сетки
    nx = 10; ny = 6; nz = 4;
    x = linspace(0,2,nx);
    y = linspace(0,1,ny);
    z = linspace(0,0.5,nz);
    [X,Y,Z] = ndgrid(x,y,z);

    // попытаемся отобразить эту трёхмерную координатную сетку ...
    XF=[]; YF=[]; ZF=[];

    for k=1:nz
       [xf,yf,zf] = nf3d(X(:,:,k), Y(:,:,k), Z(:,:,k));
       XF = [XF xf]; YF = [YF yf]; ZF = [ZF zf];
    end

    for j=1:ny
       [xf,yf,zf] = nf3d(matrix(X(:,j,:),[nx,nz]),..
                         matrix(Y(:,j,:),[nx,nz]),..
                         matrix(Z(:,j,:),[nx,nz]));
       XF = [XF xf]; YF = [YF yf]; ZF = [ZF zf];
    end

    clf()
    plot3d(XF,YF,ZF, flag=[0 6 3], leg="X@Y@Z")
    xtitle("Трёхмерная сетка!"); show_window()

nx = 10; ny = 6; nz = 4; x = linspace(0,2,nx); y = linspace(0,1,ny); z = linspace(0,0.5,nz); [X,Y,Z] = ndgrid(x,y,z);

XF=[]; YF=[]; ZF=[];

for k=1:nz [xf,yf,zf] = nf3d(X(:,:,k), Y(:,:,k), Z(:,:,k)); XF = [XF xf]; YF = [YF yf]; ZF = [ZF zf]; end

for j=1:ny [xf,yf,zf] = nf3d(matrix(X(:,j,:),[nx,nz]),.. matrix(Y(:,j,:),[nx,nz]),.. matrix(Z(:,j,:),[nx,nz])); XF = [XF xf]; YF = [YF yf]; ZF = [ZF zf]; end

clf() plot3d(XF,YF,ZF, flag=[0 6 3], leg="X@Y@Z") xtitle("Трёхмерная сетка!"); show_window()

## Смотрите также

- kron