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

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

Назначение

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

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

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

                   +∞
(1)    Ax  ≡   ∫  k(t - τ)  x(τ) dτ  =  y(t)  ,    -∞ < t < +∞ ,
                  -∞ 

с гладким ядром  k осуществляется методом регуляризации А.Н. Тихонова [1] путем сведения задачи к минимизации по  x сглаживающего функционала

(2)     Mα [x, y]  =  || Ax - y ||2 + α Ω[x]   =  min x ,
 где :
                                        +∞
       || Ax - y ||2  =  1/2π    ∫   | K(λ) X(λ) - Y(λ) |2 dλ  -  квадрат невязки,
                                       -∞
      α > 0 - параметр регуляризации,
                             +∞
       Ω[x]  =  1/2π  ∫  | λ |2p | X(λ) |2 dλ  -  стабилизирующий функционал
                            -∞
 порядка  p ≥ 0 (p не предполагается целым); 

    K (λ), X (λ), Y (λ) - преобразования Фурье ядра  k, решения  x и приближенной правой части  y.
Значение параметра  α определяется из условия

(3)     ρ(α) = ε || y || ,   ρ(α) ≡ || Axα - y || , 

где  xα - регуляризированное решение задачи (2),
        ε - заданный относительный уровень невязки.

Считается, что  k (t) ,  x (t),  y (t) → 0 при  t → ±∞ и функции  k (t),  y (t) заданы на конечном отрезке [-Т/2, Т/2] в узлах равномерной сетки по  t :

     ts  =  s Δt ,   s =  -N/2, -N/2 + 1, ... , -1, 0, 1, ... , N/2 - 1 , 

где  N - четное число узлов,  Δ (t) = T/N - шаг сетки.

Численный алгоритм для решения уравнения типа свертки с дискретным ядром и правой частью методом регуляризации основан на применении дискретного преобразования Фурье временных рядов [2].

B связи с этим выполняются преобразования, заключающиеся в вычислении ДПФ функций  ks = k (ts) и  ys = y (ts), приводящие исходную точку к "каноническому" виду.

Приближенные значения  xsα регуляризованных решений в узлах  ts определяются путем минимизации в спектральной области дискретной аппроксимации сглаживающего функционала и последующего выполнения обратного ДПФ. Для приближенного решения уравнения (3) используется метод касательных Ньютона в соответствии с вычислительной схемой [3].

Качество регуляризованного решения  xα при значении параметра  α, удовлетворяющем критерию (3), оценивается следующими числовыми характеристиками :

1) невязкой    ρ(α)  =  || Axα - y ||  ,         

2) Ω - нормой решения     γ(α)  =  Ω1/2 [ xα ]  ,    

3) значением регуляризирующего функционала 
    φ(α)  =  [ ρ2(α) + αγ2(α) ]1/2  ,

4) функцией "чувствительности"    τ(α)  =  α Ω1/2 [ dxα/dα ] ,
    где  Ω [x] ≡ Ω [x]  при  p = 1/2
    (для вычисления "квазиоптимальных" значений
    параметра регуляризации),

5) найденным значением  α как решением уравнения (3),

6) числом итераций при решении уравнения (3),

7) практически достигнутым относительным уpовнем невязки  ε0. 

Вычисление всех критериальных функций  ρ (α),  γ (α),  φ (α),  τ (α) происходит в спектральной области  λ и требует порядка  N операций.

Возможны следующие режимы вычислений (в зависимости от значения параметра  L).

I.   Решение интегрального уравнения с приведением задачи к "каноническому" виду (L = 1).
II.  Решение интегрального уравнения при условии, что задача приведена к "каноническому" виду (L = 2).
III. Решение интегрального уравнения при условии, что ДПФ ядра вычислено (L = 3).

Эти режимы целесообразно использовать, например, при повторном решении того же интегрального уравнения (L = 2) или при решении уравнения с тем же ядром, но с другой правой частью (L = 3), а также в случае, когда известно аналитическое преобразование Фурье ядра  K (λ)  (L = 3).

Для оптимального вычисления прямого и обратного ДПФ применяется алгоритм быстрого преобразования Фурье, за счет которого реализованный алгоритм численного решения задачи является эффективным в смысле быстродействия, экономии памяти ЭВМ и влияния ошибок округления, при этом время вычислений пропорционально  N log2 N, а объем памяти пропорционален  N.

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

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

    int ec01r_c (integer *n, real *dt, real *a, real *y, real *p,
            real *eps, integer *l, real *h, real *x, real *z)

Параметры

n - количество заданных значений ядра и правой части уравнения,  n ≥ 4 - целая степень числа два (тип: целый);
dt - заданный шаг сетки по переменным  t, τ, dt > 0 (тип: вещественный);
a - вещественный вектоp длины  n, содержащий заданные значения ядра уравнения на сетке:  a (i) = kI- n/2- 1,  i = 1, 2, ..., n;
y - вещественный вектоp длины  n, содержащий заданные значения правой части уравнения на сетке  y (i) = yI- n/2- 1,  i = 1, 2, ..., n;
p - заданное значение порядка регуляризации  p,  p ≥ 0 (тип: вещественный);
eps - заданный относительный уровень невязки  ε ,  0 < eps < 1 (тип: вещественный);
l - параметр, определяющий режим использования подпрограммы (тип: целый);
l = 1 - решение интегрального уравнения в режиме I,
l = 2 - решение интегрального уравнения в режиме II,
l = 3 - решение интегрального уравнения в режиме III;
h - вещественный вектоp длины 7, содержащий вычисленные характеристики решения при найденном значении  α: h (1) = ρ(α),  h (2) = γ(α),  h (3) = φ(α),  h (4) = τ(α); h (5) = α,  h (6) - число итераций,  h (7) - достигнутый относительный уровень невязки  ε0;
x - вещественный вектоp длины  n, содержащий вычисленные значения регуляризованного решения на сетке:  x (i) = xI- n/2- 1,  i = 1, 2, ..., n;
z - вещественный вектоp длины  n, используемый в подпрограмме как рабочий.

Версии: нет

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

ftf1c_c - подпрограмма вычисления дискретного или обратного дискретного преобразования Фурье комплексного ряда длины, равной степени двух, методом быстрого преобразования Фурье.

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

  1. 

В результате работы подпрограммы при  l = 1 в массиве  a содержится ДПФ ядра  km, а в массиве  y - ДПФ правой части  ym ("канонический" вид задачи).

C учетом симметрии вещественной части и антисимметрии мнимой части преобразований Фурье вещественных рядов относительно центра  m = n/2, хранятся только половины значений  k, y,  m = 0, 1, ..., n/2.
Например, в массиве a спектр располагается следующим образом:

     a(i) = Re kI-1 ,         i = 1, 2, ..., n/2 + 1 ,
     a(i) = Im kI-n/2-1 ,   i = n/2 + 2, n/2 + 3, ..., n ; 

при этом учитывая также, что  Im km = 0,  m = 0, n/2.

  2. 

При первом обращении к подпрограмме (l = 1) необходимо задать значения параметров  n, dt, a, y, p, eps.
При повторном решении того же интегрального уpавнения (l = 2) можно менять только параметры  p, eps, а при решении уравнения с тем же ядром, но с другой правой частью (l = 3) - только параметры  y, p, eps, сохраняя значения всех остальных параметров.

  3. 

Если относительный уровень невязки  ε таков, что  ε ≥ ρ (∞)/|| y || ,   где

ρ(∞)  =  lim  ρ(α) ,
           α → ∞  

и величины  ρ (∞),  || y || вычисляются приближенно, то в подпрограмме строится приближение к предельному решению

x  =  lim  xα  ≡  0
        α → ∞ 

с характеристиками:  h (1) = ρ (∞),  h (2) = 0,  h (3) = ρ (∞),  h (4) = 0,  h (5) = 1018,  h (6) = 0,  h (7) = ε0.

  4.  Если относительный уровень невязки  ε слишком мал и не может быть достигнут, то в подпрограмме вычисляется (если это возможно) нерегуляризованное pешение  xsα при  α = 0.

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

Рассматривается решение интегрального уравнения типа свертки ( с ядром  k (t) = exp (- t2) и правой частью  y (t) = (π/2) 1/2 exp (- t2/2) ( точное решение  x (t) = exp (- t2) ) или y1 (t) = (π/3) 1/2 exp (- 2/3 t2) ( точное решение  x1 (t) = exp (- 2t2) ).

Ниже приводится фрагмент программы, вычисляющей решения и соответствующие значения критериальных функций при заданном относительном уpовне невязки  ε с использованием регуляризатора порядка  p = 1 и равномерной на отрезке [- 1, 1] сетки из  n = 8 точек.

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

    static int n = 8;
    static float dt = .25f;
    static float p = 1.f;
    static float pi = 3.14159265f;

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

    /* Local variables */
    extern int ec01r_c(int *, float *, float *, float *,
                       float *, float *, int *, float *, float *, float *);
    static float a[8], h__[7];
    static int i__, i, l;
    static float t, x[8], y[8], z__[8], y1[8], xt[8], xt1[8], eps;
    int i__1;

    i__1 = n;
    for (i__ = 1; i__ <= i__1; ++i__) {
        t = dt * (-n / 2 + i__ - 1);
        a[i__ - 1] = (float)exp((float)(-t * t));
        xt[i__ - 1] = (float)exp((float)(-t * t));
        y[i__ - 1] = (float)sqrt((float)(pi / 2.f)) *
                (float)exp((float)(-t * t / 2.f));
        xt1[i__ - 1] = (float)exp((float)(t * -2.f * t));
/* l1: */
        y1[i__ - 1] = (float)sqrt((float)(pi / 3.f)) *
                 (float)exp((float)(-t * t * 2.f / 3.f));
    }
    for (i = 0; i <= 6; i+= 2) {
        printf("\n %16.7e %16.7e \n",a[i], a[i+1]);
    }
    for (i = 0; i <= 6; i+= 2) {
        printf("\n %16.7e %16.7e \n",xt[i], xt[i+1]);
    }
    for (i = 0; i <= 6; i+= 2) {
        printf("\n %16.7e %16.7e \n",y[i], y[i+1]);
    }
    l = 1;
    eps = .08f;
    printf("\n\n %16.7e \n",eps);
    ec01r_c(&n, &dt, a, y, &p, &eps, &l, h__, x, z__);

    for (i = 0; i <= 4; i+= 2) {
        printf("\n %16.7e %16.7e ",h__[i], h__[i+1]);
    }
        printf("\n %16.7e \n",h__[6]);
    for (i = 0; i <= 6; i+= 2) {
        printf("\n %16.7e %16.7e \n",x[i], x[i+1]);
    }
    for (i = 0; i <= 6; i+= 2) {
        printf("\n %16.7e %16.7e \n",xt1[i], xt1[i+1]);
    }
    for (i = 0; i <= 6; i+= 2) {
        printf("\n %16.7e %16.7e \n",y1[i], y1[i+1]);
    }
    l = 3;
    eps = .085f;
    printf("\n\n %16.7e \n",eps);
    ec01r_c(&n, &dt, a, y1, &p, &eps, &l, h__, x, z__);

    for (i = 0; i <= 4; i+= 2) {
        printf("\n %16.7e %16.7e ",h__[i], h__[i+1]);
    }
        printf("\n %16.7e \n",h__[6]);
    for (i = 0; i <= 6; i+= 2) {
        printf("\n %16.7e %16.7e ",x[i], x[i+1]);
    }
    return 0;
} /* main */


Результаты:

       h__  =  ( 0.122,  1.213,  0.164,  0.335,  0.008,  3,  0.080 )
       x    =  ( 0.339,  0.447,  0.712,  0.991,  1.113,  0.991,  0.712,  0.447 )



       l = 3;
       eps = .085f;
       ec01r_c(&n, &dt, a, y1, &p, &eps, &l, h__, x, z__);

Результаты:

       h__  =  ( 0.102,  1.492,  0.149,  0.325,  0.005,  3,  0.085 )
       x    =  ( 0.094,  0.225,  0.549,  0.893,  1.046,  0.893,  0.549,  0.225 )