Текст подпрограммы и версий
ec12c_c.zip
Тексты тестовых примеров
tec12c_c.zip

Подпрограмма:  ec12c_c

Назначение

Решение двумерного интегрального уравнения I рода с разностным ядром, преобразование Фурье которого задано аналитически, методом регуляризации с применением алгоритма быстрого преобразования Фурье и (или) вычисление значений критериальных функций.

Математическое описание

Приближенное решение двумерного интегрального уравнения I рода типа свертки на плоскости

                  +∞   +∞
(1)    Af  ≡   ∫     ∫   K(x - ξ, y - η) f(ξ, η) dξ dη = g(x, y)  ,
                 -∞    -∞
                                   -∞ < x, y < +∞ 

с гладким ядром K осуществляется методом однопараметрической регуляризации А.Н.Тихонова [1] путем сведения задачи к минимизации соответствующего сглаживающего функционала (см. описание подпрограммы ec02c_c в данной Библиотеке).

Предполагается, что известно аналитическое преобразование Фурье ядра  K (λ, ω) и правая часть уравнения (1)  g (x, y) задана на прямоугольнике:  x  [- T1/2, T1/2),  y  [- T2/2, T2/2) в узлах равномерной сетки

xs1 = s1*d1 ,     s1 = - N1/2, - N1/2 + 1, ...,-1, 0, 1, ..., N1/2 - 1
ys2 = s2*d2 ,     s2 = - N2/2, - N2/2 + 1, ...,-1, 0, 1, ..., N2/2 - 1 , 

где  N1, N2 - четные числа узлов,  d1 = T1/N1,  d2 = T2/N2 - шаги сетки по переменным  x, y.

Аналогично введем сетку по переменным  λ,  ω в частотной области

     λm1 = m1 * Δλ   ,   m1 = - N1/2, - N1/2 + 1, ...,-1, 0, 1, ..., N1/2 - 1 ,
     Δλ = 2π / N1 d1  ,
     ωm2 = m2 * Δω  ,     m2 = - N2/2, - N2/2 + 1, ...,-1, 0, 1, ..., N2/2 - 1 ,
     Δω = 2π / N2 d2 

и рассмотрим дискретные значения преобразования Фурье ядра  Кm1, m2 = K (λm1, ωm2).

Далее, аппроксимируя все интегралы по формуле прямоугольников, получаем дискретные аналоги преобразования Фурье правой части ( n1 = N1/2, n2 = N2/2 )

                                 n1-1       n2-1
(2) Gm1,m2 = d1d2     ∑           ∑        gs1,s2 exp( -2π i (s1 m1 /N1 + s2 m2 /N2))
                               s1= -n1  s2= -n2

 и регуляризованного решения

                                                     n1-1          n2-1
(3)  f αs1, s2  =  1 / N1N2d1 d2      ∑             ∑
                                                     m1= -n1    m2= -n2
                  { K*m1,m2 Gm1,m2  exp( 2π i (s1 m1 /N1 + s2 m2 /N2) ) /
                    / [ | Km1,m2 |2 + α ( 1 + (λm12 + ωm22)p ) ]  } 

где  Gs1, s2 = G (xs1, ys2),  α > 0 - параметр регуляризации,  p ≥ 0 - порядок стабилизирующего функционала (p не предполагается целым).

B формуле (3) при  p = 0,  m1 = 0,  m2 = 0 полагается ( λm12 + ωm22 )p = 1.

Для эффективного вычисления сумм вида (2), (3) применяется алгоритм быстрого дискретного преобразования Фурье.

Подпрограмма реализует изложенный алгоритм решения уравнения (1) и вычисляет приближенные значения четырех критериальных функций - невязки  ρ (α), нормы решения  γ (α), регуляризирующего функционала  φ (α), функции "чувствительности"  τ (α) (см. описание подпрограммы ec02c_c), которые могут быть использованы для выбора параметра регуляризации  α.
Вычисление всех критериальных функций происходит через компоненты ДПФ, что требует порядка  N1 N2 операций и значительно облегчает задачу выбора  α.
Выполнение обратного ДПФ в формуле (3) целесообразно производить лишь для выбранных значений  α.
За счет применения БПФ полное время численного решения задачи пропорционально  N1 N2 (log2 N1 + log2 N2), а объем памяти ЭВМ пропорционален  N1 N2.

Подпрограмма предусматривает работу в тpех режимах (в зависимости от значения параметра  L):

L = 1 - задача приводится к "каноническому" виду, т.е. производится вычисление ДПФ правой части уравнения (1),

L = 2 - решается интегральное уравнение и вычисляются значения критериальных функций  ρ (α),  γ (α),  φ (α),  τ (α) для заданного значения  α - при условии, что задача приведена к "каноническому" виду,

L = 3 - вычисляются только значения критериальных функций  ρ (α),  γ (α),  φ (α),  τ (α) для заданного значения  α без построения решения (3) - при условии, что задача приведена к "каноническому" виду.

Эти режимы целесообразно использовать, например, при повторном решении того же интегрального уравнения или при выборе значения параметра регуляризации  α.
Аналогичный алгоритм описан в [3].
Отметим, что по сравнению с подпрограммой ec02c_c в данной подпрограмме экономятся два двумерных массива размера  N1 * N2.

1.  А.Н.Тихонов. O регуляризации некоppектно поставленных задач, ДАН CCCP, 1963, т.153, N 1, 49 - 52.
2.  В.А.Морозов, Н.Н.Кирсанова, А.Ф.Сысоев. Комплекс алгоритмов быстрого преобразования Фурье дискретных рядов, сб. "Численный анализ на ФОРТРАНе", вып.15, Изд - во МГУ, M., 1976.
3.  М.В.Арефьева, А.Ф.Сысоев. O реставрации изображений методом регуляризации с применением быстрого преобразования Фурье, сб. "Численный анализ на ФОРТРАНе. Методы и алгоритмы". Изд - во МГУ, M., 1981.

Использование

    int ec12c_c (C_fp f, real *gr, real *gi, integer *n1,
            integer *n2, real *d1, real *d2, real *alp, real *p, integer *l,
            real *h, real *fr, real *fi)

Параметры

f(w1,w2)- комплексная подпрограмма - функция вычисления преобразования Фурье ядра  k (λ, ω) в точке  λ = w1,  ω = w2;
gr, gi - двумерные вещественные массивы размера  n1 * n2 содержащие соответственно вещественные и мнимые части элементов заданной матрицы правой части на сетке
      gr(i, j) = re g I-n1/2-1,  J-n2/2-1 ,

      gi(i, j) = im g I-n1/2-1,  J-n2/2-1 ,

      i = 1, 2, ..., n1,   j = 1, 2, ..., n2;  
n1 - заданное число стpок матрицы правой части  gs1, s2,  n1 ≥ 4 - целая степень числа два (тип: целый);
n2 - заданное число столбцов матрицы правой части  gs1, s2,  n2 ≥ 4 - целая степень числа два (тип: целый);
d1 - заданный шаг сетки по переменным  x, ξ, d1 > 0 (тип: вещественный);
d2 - заданный шаг сетки по переменным  y, η, d2 > 0 (тип: вещественный);
alp - заданное значение параметра регуляризации  α,  alp ≥ 0 (тип: вещественный);
p - заданное значение порядка регуляризатора  p,  p ≥ 0 (тип: вещественный);
l - параметр, определяющий режим использования подпрограммы (тип: целый);
l = 1 - вычисление ДПФ правой части уравнения (1),
l = 2 - построение решения и вычисление значений критериальных функций в предположении, что вещественные и мнимые части элементов ДПФ правой части содержатся соответственно в массивах gr, gi,
l = 3 - вычисление только значений критериальных функций в том же предположении, что при  l = 2;
h - вещественный вектоp длины 4, содержащий вычисленные значения критериальных функций при заданном значении  alp:  h (1) = ρ (α),  h (2) = γ (α),  h (3) = φ (α),  h (4) = τ (α);
fr, fi - двумерные вещественные массивы размера  n1 * n2, содержащие соответственно вещественные и мнимые части элементов вычисленного регуляризованного решения на сетке
      fr(i, j) = re f αI-n1/2-1, J-n2/2-1 ,

      fi(i, j) = im f αI-n1/2-1, J-n2/2-1 ,

      i = 1, 2, ..., n1 ,   j = 1, 2, ..., n2; 

Версии: нет

Вызываемые подпрограммы

ftftc_c - подпрограмма вычисления двумерного дискретного или обратного дискретного преобразования Фурье комплексной матрицы размера  n1 * n2,  n1 = 2 j1,  n2 = 2 j2 методом быстрого преобразования Фурье.

Замечания по использованию

  1. 

B результате работы подпрограммы при  l = 1 в массиве  gr содержится вещественная часть, а в массиве  gi мнимая часть элементов ДПФ правой части.

  2. 

Комплексная подпрограмма - функция  f (w1, w2), вычисляющая значения преобразования Фурье ядра  k (λ, ω) в точке  λ = w1,  ω = w2, должна быть написана пользователем.

  3. 

Массивы  gr, gi используются при всех значениях  l, а массивы  fr, fi - только при  l = 2 или 3.

  4.  Если каждый раз при обращении к подпрограмме ec12c_c ДПФ правой части вычислять заново, то общее число массивов, используемых для решения задачи, можно сократить, совмещая параметры  gr и  fr,  gi и  fi.

Пример использования

Рассматривается задача решения интегрального уравнения ( с ядром  k (x, y), аналитическое преобразование Фурье которого имеет вид

              k(λ, Ω) = π exp[ -1/4 (λ2 + ω2) ] ,
   и правой частью
              g(x, y) = π/2 exp[ -1/2 (x2 + y2) ]

   ( точное решение   f(ξ, η) = exp [ - (ξ2 + η2) ] ) .

Ниже приводится фрагмент программы, вычисляющей решение и соответствующие значения критериальных функций при значении параметра регуляризации  α = 3 * 10- 2 с использованием регуляризатора порядка  p = 1 и равномерной на квадрате [- 1, 1) * [- 1, 1) сетки из n1*n2 точек, где  n1 = 8 , n2 = 8.

int main(void)
{
    /* Initialized data */

    static int n1 = 8;
    static int n2 = 8;
    static float d1 = .25f;
    static float d2 = .25f;
    static float alp = .03f;
    static float p = 1.f;

    /* Builtin functions */
    double exp(double);

    /* Local variables */
    extern void f_c();
    static float h__[4];
    static int i__, i, j, l;
    static float t1, t2, fi[64]  /* was [8][8] */, gi[64] /* was [8][8] */,
                         fr[64]  /* was [8][8] */, gr[64] /* was [8][8] */;
    extern int ec12c_c(U_fp, float *, float *, int *, int *, float *,
            float *, float *, float *, int *, float *, float *, float *);
    int i__1, i__2;

#define gi_ref(a_1,a_2) gi[(a_2)*8 + a_1 - 9]
#define gr_ref(a_1,a_2) gr[(a_2)*8 + a_1 - 9]

    i__1 = n1;
    for (i__ = 1; i__ <= i__1; ++i__) {
        i__2 = n2;
        for (j = 1; j <= i__2; ++j) {
            t1 = d1 * (-n1 / 2 + i__ - 1);
            t2 = d2 * (-n2 / 2 + j - 1);
            gr_ref(i__, j) = (float)exp((float)(-(t1 * t1 + t2 * t2) / 2.f)) *
                    1.57079632679f;
/* l1: */
            gi_ref(i__, j) = 0.f;
        }
    }
    l = 1;
    ec12c_c((U_fp)f_c, gr, gi, &n1, &n2, &d1, &d2, &alp, &p, &l, h__, fr, fi);
    l = 2;
    ec12c_c((U_fp)f_c, gr, gi, &n1, &n2, &d1, &d2, &alp, &p, &l, h__, fr, fi);

    printf("\n %16.7e %16.7e %16.7e %16.7e \n",
           h__[0], h__[1], h__[2], h__[3]);
    for (i = 1; i <= 58; i += 8) {
    printf("\n %16.7e %16.7e %16.7e %16.7e \n %16.7e %16.7e %16.7e %16.7e ",
            fr[i-1], fr[i], fr[i+1], fr[i+2],
            fr[i+3], fr[i+4], fr[i+5], fr[i+6]);
    }
    printf("\n");
    for (i = 1; i <= 58; i += 8) {
    printf("\n %16.7e %16.7e %16.7e %16.7e \n %16.7e %16.7e %16.7e %16.7e ",
            fi[i-1], fi[i], fi[i+1], fi[i+2],
            fi[i+3], fi[i+4], fi[i+5], fi[i+6]);
    }
    printf("\n");
    return 0;
} /* main */


/* Complex */ void f_c(complex * ret_val, float *w1, float *w2)
{
    /* System generated locals */
    float r__1;
    complex q__1;

    /* Builtin functions */
    double exp(double);

    r__1 = (float)exp((float)((*w1 * *w1 + *w2 * *w2) * -.25f)) *
            3.14159265359f;
    q__1.r = r__1, q__1.i = 0.f;
     ret_val->r = q__1.r,  ret_val->i = q__1.i;
    return ;
} /* f_c */


Результаты:

       h__  =  ( 0.406963,  1.260784,  0.461851,  0.847403 )

                | 0.051,  0.096,  0.206,  0.315,  0.360,  0.315,  0.206,  0.096 |
                | 0.096,  0.142,  0.252,  0.361,  0.407,  0.361,  0.252,  0.142 |
                | 0.206,  0.252,  0.362,  0.473,  0.519,  0.473,  0.362,  0.252 |
       fr   = | 0.315,  0.361,  0.473,  0.584,  0.631,  0.584,  0.473,  0.361 |
                | 0.360,  0.407,  0.519,  0.631,  0.677,  0.631,  0.519,  0.407 |
                | 0.315,  0.361,  0.473,  0.584,  0.631,  0.584,  0.473,  0.361 |
                | 0.206,  0.252,  0.362,  0.473,  0.519,  0.473,  0.362,  0.252 |
                | 0.096,  0.142,  0.252,  0.361,  0.407,  0.361,  0.252,  0.142 |
 
       fi - все значения имеют порядки  10-12 - 10-14.