[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
Эти функции не методы класса mglData
, но они дают дополнительные возможности по обработке данных. Поэтому я поместил их в эту главу.
mglData
mglTransform (const mglData &
real, const mglData &
imag, const char *
type)HMDT
mgl_transform (HCDT
real, HCDT
imag, const char *
type)Выполняет интегральное преобразование комплексных данных real, imag в выбранном направлении и возвращает модуль результата. Порядок и тип преобразований задается строкой type: первый символ для x-направления, второй для y-направления, третий для z-направления. Возможные символы: ‘f’ – прямое преобразование Фурье, ‘i’ – обратное преобразование Фурье, ‘s’ – синус преобразование, ‘c’ – косинус преобразование, ‘h’ – преобразование Ханкеля, ‘n’ или ‘ ’ – нет преобразования.
mglData
mglTransformA const mglData &
ampl, const mglData &
phase, const char *
type)HMDT
mgl_transform_a HCDT
ampl, HCDT
phase, const char *
type)Аналогично предыдущему с заданными амплитудой ampl и фазой phase комплексных чисел.
void
mglFourier const mglData &
re, const mglData &
im, const char *
dir)void
mgl_data_fourier HCDT
re, HCDT
im, const char *
dir)Выполняет Фурье преобразование для комплексных данных re+i*im в направлениях dir. Результат помещается обратно в массивы re и im.
dn
['dir'='x']mglData
mglSTFA (const mglData &
real, const mglData &
imag, int
dn, char
dir='x'
)HMDT
mgl_data_stfa (HCDT
real, HCDT
imag, int
dn,char
dir)Выполняет оконное преобразование Фурье длиной dn для комплексных данных real, imag и возвращает модуль результата. Например, для dir=‘x’ результат будет иметь размер {int(nx/dn), dn, ny} и будет равен res[i,j,k]=|\sum_d^dn exp(I*j*d)*(real[i*dn+d,k]+I*imag[i*dn+d,k])|/dn.
dz=0.1 k0=100
]mglData
mglPDE (HMGL
gr, const char *
ham, const mglData &
ini_re, const mglData &
ini_im, mreal
dz=0.1
, mreal
k0=100
, const char *
opt=""
)HMDT
mgl_pde_solve (HMGL
gr, const char *
ham, HCDT
ini_re, HCDT
ini_im, mreal
dz, mreal
k0, const char *
opt)Решает уравнение в частных производных du/dz = i*k0*ham(p,q,x,y,z,|u|)[u], где p=-i/k0*d/dx, q=-i/k0*d/dy – псевдо-дифференциальные операторы. Параметры ini_re, ini_im задают начальное распределение поля. Координаты в уравнении и в решении полагаются в диапазоне осей координат. Замечу, что внутри этот диапазон увеличивается в 3/2 раза для уменьшения отражения от границ расчетного интервала. Параметр dz задает шаг по эволюционной координате z. В данный момент использован упрощенный алгоритм, когда все “смешанные” члена (типа ‘x*p’->x*d/dx) исключаются. Например, в 2D случае это функции типа ham = f(p,z) + g(x,z,u). При этом допускаются коммутирующие комбинации (типа ‘x*q’->x*d/dy). Переменная ‘u’ используется для обозначения амплитуды поля |u|. Это позволяет решать нелинейные задачи – например, нелинейное уравнение Шредингера ham='p^2+q^2-u^2'
. Также можно указать мнимую часть для поглощения (типа ham = 'p^2+i*x*(x>0)'
), но только если зависимость от ‘i’ линейная, т.е. ham = hre+i*him. См. раздел PDE solving hints, для примеров кода и графика.
x0 y0 z0 p0 q0 v0 [dt=0.1 tmax=10]
mglData
mglRay (const char *
ham, mglPoint
r0, mglPoint
p0, mreal
dt=0.1
, mreal
tmax=10
)HMDT
mgl_ray_trace (const char *
ham, mreal
x0, mreal
y0, mreal
z0, mreal
px, mreal
py, mreal
pz, mreal
dt, mreal
tmax)Решает систему геометрооптических уравнений dr/dt = d ham/dp, dp/dt = -d ham/dr. Это гамильтоновы уравнения для траектории частицы в 3D случае. Гамильтониан ham может зависеть от координат ‘x’, ‘y’, ‘z’, импульсов ‘p’=px, ‘q’=py, ‘v’=pz и времени ‘t’: ham = H(x,y,z,p,q,v,t). Начальная точка (при t=0
) задается переменными {x0, y0, z0, p0, q0, v0}. Параметры dt и tmax задают шаг и максимальное время интегрирования. Результат – массив {x,y,z,p,q,v,t} с размером {7 * int(tmax/dt+1) }.
r=1 k0=100
xx yy]mglData
mglQO2d (const char *
ham, const mglData &
ini_re, const mglData &
ini_im, const mglData &
ray, mreal
r=1
, mreal
k0=100
, mglData *
xx=0
, mglData *
yy=0
)mglData
mglQO2d (const char *
ham, const mglData &
ini_re, const mglData &
ini_im, const mglData &
ray, mglData &
xx, mglData &
yy, mreal
r=1
, mreal
k0=100
)HMDT
mgl_qo2d_solve (const char *
ham, HCDT
ini_re, HCDT
ini_im, HCDT
ray, mreal
r, mreal
k0, HMDT
xx, HMDT
yy)Решает уравнение в частных производных du/dt = i*k0*ham(p,q,x,y,|u|)[u] в сопровождающей системе координат, где p=-i/k0*d/dx, q=-i/k0*d/dy – псевдо-дифференциальные операторы. Параметры ini_re, ini_im задают начальное распределение поля. Параметр ray задает опорный луч для сопровождающей системы координат. Можно использовать луч найденный с помощью mglRay()
. Опорный луч должен быть достаточно гладкий, чтобы система координат была однозначной и для исключения ошибок интегрирования. Если массивы xx и yy указаны, то в них записываются декартовы координаты для каждой точки найденного решения. См. также mglPDE()
. См. раздел PDE solving hints, для примеров кода и графика.
mglData
mglJacobian (const mglData &
x, const mglData &
y)mglData
mglJacobian (const mglData &
x, const mglData &
y, const mglData &
z)HMDT
mgl_jacobian_2d (HCDT
x, HCDT
y)HMDT
mgl_jacobian_3d (HCDT
x, HCDT
y, HCDT
z)Вычисляет якобиан преобразования {i,j,k} в {x,y,z}, где координаты {i,j,k} полагаются нормированными в интервал [0,1]. Якобиан находится по формуле det||dr_\alpha/d\xi_\beta||, где r={x,y,z} и \xi={i,j,k}. Все размерности всех массивов должны быть одинаковы. Данные должны быть трехмерными если указаны все 3 массива {x,y,z} или двумерными если только 2 массива {x,y}.
mglData
mglTriangulation (const mglData &
x, const mglData &
y)mglData
mglTriangulation (const mglData &
x, const mglData &
y, const mglData &
z)HMDT
mgl_triangulation_2d (HCDT
x, HCDT
y)HMDT
mgl_triangulation_3d (HCDT
x, HCDT
y, HCDT
z)Выполняет триангуляцию для произвольно расположенных точек с координатами {x,y,z} (т.е. находит треугольники, соединяющие точки). Первая размерность всех массивов должна быть одинакова x.nx=y.nx=z.nx
. Получившийся массив можно использовать в triplot или tricont для визуализации реконструированной поверхности.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated by Autobuild on September 28, 2013 using texi2html 1.82.