Итак, сегодня я таки реализовал это.
Получилось хреново: то ли эти полиномы очень чувствительны к неоднородности распределения точек, то ли просто хреновые, то ли мое рукожопие сказывается, но получилось даже хуже, чем декомпозиция обычными Церниками.
Для сравнения алгоритмов я делал следующее: волновой фронт "собирался" из полиномов с коэффициентами
double IdxsOri[] = {2., // смещение, 0
1.1, -0.8, // наклон, 1-2
5.5, -3.2, 0., // астигматизм, дефокус, аст., 3-5
6.8, 5.5, 0., 0.,// трилистник, кома, 6-9
0., 0., 3.3, 1.4, 8.}; // 10-14
В первых двух случаях "сбор" выполнялся по обычным полиномам Цернике, а в третьем - по кольцевым (т.к. преобразование коэффициентов кольцевых полиномов в обычные дело почти что невозможное).
Точки распределялись радиально, вот так:
int Sz = 256;
double dTh = D2R(360./32);
polar *P = MALLOC(polar, Sz), *Pptr = P;
for(i = 0; i < 8; i++){
double RR = (double)i * 0.07 + 0.5;
double Th = 0.;
for(j = 0; j < 32; j++, Pptr++, Th += dTh){
Pptr->r = RR;
Pptr->theta = Th;
}
}
Декомпозицию я делал для nmax=7. Буду приводить полученные коэффициенты, погрешности восстановления волнового фронта и погрешности восстановления коэффициентов. И вот что вышло.
1. Декомпозиция обычными полиномами:
0.255, 1.410, -0.800, 5.500, -0.350, 0.063, 6.800, 5.482, 0.000, 0.000, 0.000, 0.000, 1.404, 1.397, 8.000, 0.000, 0.000, 0.009, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 1.209, -0.009, 0.000, 0.000, 0.000, 0.000, 0.000, -0.106,
Std: 0.393473, max abs diff: 1.50205
(Индексы) Std: 0.98986, max abs diff: 2.84992
2. Подбор обычных полиномов методом наименьших квадратов:
0.639, 2.604, -0.890, 6.370, -0.035, 0.228, 7.954, 4.857, 0.094, 0.000, 0.000, -0.919, 1.709, 1.383, 8.601, 0.000, -1.184, -0.639, -0.046, 0.000, 0.000, 0.000, 0.000, 0.471, 0.000, -0.309, -1.267, 0.000, 0.000, 0.000, 0.570, 0.308, 0.027,
Std: 5.11381, max abs diff: 6.52512
(Индексы) Std: 1.32304, max abs diff: 3.16545
3. Декомпозиция кольцевыми полиномами:
2.825, -0.889, -0.800, 5.500, -3.479, -0.613, 6.800, 5.039, 0.000, 0.000, 0.000, 0.000, 2.876, 1.311, 8.000, 0.000, 0.000, 0.338, 0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.140, 0.061, 0.000, 0.000, 0.000, 0.000, 0.000, 0.213,
Std: 0.925624, max abs diff: 2.99611
(Индексы) Std: 0.325278, max abs diff: 1.98926
По набору единичных коэффициентов кольцевые полиномы давали еще более худший результат по сравнению с обычными.
ИТОГ. Или я - идиот… Немного еще посижу завтра над кольцевыми (вдруг я что-то напутал). Если все верно, то получается, я зря потратил время. Но, как говорится, хреновый результат - тоже результат.
Надо будет до отпуска статейку написать в какой-нибудь журнал по моей тематике.