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

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

Назначение

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

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

Решение интегрального уравнeния фредгольма I рода

            b
           ∫ k(x, y)  u(y) dy  =  f(x)  ,  c ≤ x ≤ d ,
          a 

при априорно известной информации об ограниченности первой производной искомого решения  u = u (y) и об участках знакопостоянства его кривизны сводится на основе метода квазирешений В.К.Иванова к задаче минимизации

                   d      b   
     min        ∫   (  ∫  k(x, y)  u(y) dy - f(x) )2 dx
    v, u (a)    c      a 

на множестве кусочно - монотонных функций  v (y) = u' (y), определенных на отрезке [a, b]

                                 y
          u(y)  =  u(a) + ∫ v(t) dt ,   a ≤ y ≤ b ,
                               a
 и удовлетворяющих ограничениям
        v1(y) ≤ v(y) ≤ v2(y) ,   a ≤ y ≤ b , 

v1 (y) и  v2 (y) - заданные на отрезке [a, b] функции. Значение  u (a) может считаться как известным, так и подлежащим определению.

Численная дискретизация этой вариационной задачи после аппроксимации соответствующих интегралов с помощью квадратурных формул на сетках  Ωx = {xi :  c = x1 < ... < xi < ... < xM = d} и Ωy = {yj :  a = y1 < ... < yj < ... < yN = b} приводит к задаче квадратичного программирования

                        M            N
  (1)      min      ∑  pi  (   ∑  dj ki j uj  -  fi  )2
            v, u1    i=1         j=1 

при условии, что вектоp  v = (v1, ..., vN - 1) удовлетворяет ограничениям

                               j -1
  (2)     uj  =  u1  +   ∑   he ve ,     j = 2, ..., N
                               e=1
        
  (3)     v1 j ≤ vj ≤ v2 j ,     j = 1, ..., N-1

  (4)     mj ( vj + 1 - vj ) ≥ 0 ,     j = 1, ..., N-2 , 

где  ki j = k (xi, yj),  fi = f (xi),  dj > 0 - коэффициенты квадратурной формулы трапеции на сетке  Ωy ,  pi > 0 - весовые коэффициенты,  hj = yj + 1 - yj - шаг сетки  Ωy ,  v1j = v1 (yj),  v2j = v2 (yj), параметры  mj определяются условиями кусочной монотонности функции  v = u' и принимают значения 1, 0 или -1.

Численное решение задачи (1) - (4) основано на методе проекции сопряженных градиентов, который позволяет проводить итерационный процесс минимизации в конечномерном пространстве  W2, ρ1 с нормой

                                      N-1
    || v ||  =  ( || v || Q2  +   ∑   ρj (vj - vj-1)2 )1/2 ,
                                      j=2
                       N-1
    || v || Q  =  (   ∑   qj vj2 ) ,
                       j=1 

qj > 0 и  ρj ≥ 0 - заданные числа. Если априори известно, что производная искомого решения является достаточно гладкой функцией, то задание параметров  ρj > 0, связанных с конкретной нормировкой  W2, ρ1 (при  ρj ≡ 0 эта ноpма v  совпадает с || v || Q) позволяет увеличить точность и улучшить качество приближений.

Итерационный процесс считается оконченным после выполнения заданного числа итераций или после достижения заданной точности.

1.  А.Н.Тихонов, В.Я.Арсенин, Методы решения некорректных задач. M. "Hаука", 1974.
2.  В.А.Морозов, Н.Л.Гольдман, М.К.Самарин, Метод дескриптивной регуляризации и качество приближенных решений. ИФЖ, т.33, N 6, 1977.
3.  Ф.П.Васильев, Лекции по методам решения экстремальных задач. Изд - во МГУ, 1974.
4.  Н.Л.Гольдман, Приближенное решение интегрального уpавнения Фредгольма I рода в классе кусочно - выпуклых функций с ограниченной первой производной, сб. "Численный анализ на ФОРТРАНе". Изд - во МГУ, 1978.

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

    int ef02r_c (integer *m, integer *n, real *a, real *f,
            integer *ng, real *v1, real *v2, integer *mu, real *h, real *p,
            real *q, real *r, real *e, integer *isp, integer *lu, real *u,
            real *fu, integer *kn, real *b)

Параметры

m - заданная размерность вектоpа правой части  f (тип: целый);
n - заданная размерность вектоpа искомого решения  u = (u1, ..., un) (тип: целый);
a - заданный вещественный двумерный массив размерности  m * n, элементы которого  a (i, j) = ki j;
f - заданный вещественный вектоp длины  m, содержащий компоненты вектоpа правой части  f;
ng - заданный признак наличия ограничений на производную искомого решения (тип: целый);
ng = 0 - если ограничения отсутствуют;
ng = 1 - если выполнены ограничения (3);
ng = 2 - если выполнены ограничения (4);
ng = 3 - если выполнены ограничения (3) и (4);
v1 - вещественный вектоp длины  n, первые  n - 1 компонент которого содержат нижние ограничения  v1 j;
v2 - вещественный вектоp длины  n, первые  n - 1 компонент которого содержат верхние ограничения  v2 j;
mu - целый вектоp длины  n, первые  n - 2 компонент которого содержат параметры  mj;
h - вещественный вектоp длины  n, первые  n - 1 компонент которого содержат шаги  hj разностной сетки  Ωy на отрезке [a, b];
p - вещественный вектоp длины  m, содержащий весовые коэффициенты  pi > 0;
q - вещественный вектоp длины  n, первые  n - 1 компонент которого содержат весовые коэффициенты  qj > 0;
r - вещественный вектоp длины  n + 1 значений параметров  ρj таких, что:  r (1) = 0.,  r (j) = ρj ≥ 0,  j = 2, ..., n - 1,  ρ (n) = 0.,  ρ (n + 1) = 0.;
e - заданная точность вычисления по градиенту (тип: вещественный);
isp - заданное максимально допустимое число итераций (тип: целый);
lu - параметр, задаваемый из условия (тип: целый):
lu = 1 - если значение  u (a) известно,
lu = 0 - если значение  u (a) неизвестно;
u - вещественный вектоp длины  n, задающий произвольное начальное приближение;  u (1) = u (a) в случае заданного значения  u (a); в результате работы подпрограммы  u содержит вычисленное решение   u;
fu - вещественная переменная, содержащая вычисленное значение минимизируемого функционала;
kn - целая переменная, указывающая причину выхода из подпрограммы:
kn = 0 - если выполнено заданное число итераций;
kn = 1 - если достигнута точность по градиенту,
kn = 2 - если достигнута точность по функционалу;
kn = 3 - если достигнута точность по аргументу;
b - вещественный вектоp длины  m + 7n + 2, используемый как рабочий.

Версии: нет

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

ef01r_c - приближенное решение интегрального уравнения Фредгольма i рода в классе ограниченных кусочно - монотонных функций.

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

  1. 

Кpоме искомого решения  u подпрограмма позволяет получить приближение для его производной: компоненты вычисленного вектоpа  v = (v1, ..., vn - 1) расположены в  b (m + 1), ..., b (m + n - 1).

  2. 

При работе подпрограммы исходная информация, расположенная в массивах  a и  f, не сохраняется.

  3.  Справедливы замечания 3) - 5) к использованию подпрограммы ef01r_c.

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

int main(void)
{
    /* Initialized data */
    static float v1[11] = { 0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f };
    static int ng = 3;
    static int lu = 1;
    static int isp = 20;
    static float v2[11] = { 1.1f,1.1f,1.1f,1.1f,1.1f,1.1f,1.1f,1.1f,1.1f,1.1f,
            0.f };
    static int mu[11] = { 1,1,1,1,1,-1,-1,-1,-1,0,0 };
    static float h__[11] = { .1f,.1f,.1f,.1f,.1f,.1f,.1f,.1f,.1f,.1f,0.f };
    static float p[11] = { 1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f,1.f };
    static float q[11] = { .05f,.1f,.1f,.1f,.1f,.1f,.1f,.1f,.1f,.1f,.05f };
    static float r__[12] = { 0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f,0.f };
    static int m = 11;
    static int n = 11;

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

    /* Local variables */
    extern int ef02r_c(int *, int *, float *, float *, int *, float *,
            float *, int *, float *, float *, float *, float *, float *,
            int *, int *, float *, float *, int *, float *);
    static float a[121]  /* was [11][11] */, b[90], e, f[11];
    static int i__, i, j;
    static float s, u[11], y, sf;
    static int kn;
    static float fu;
    int i__1, i__2;
    float r__1;

#define a_ref(a_1,a_2) a[(a_2)*11 + a_1 - 12]

    e = 1e-7f;
    i__1 = m;
    for (i__ = 1; i__ <= i__1; ++i__) {
        i__2 = n;
        for (j = 1; j <= i__2; ++j) {
            if (i__ - j != 0) {
                goto l2;
            } else {
                goto l1;
            }
l1:
            a_ref(i__, j) = 1.f / q[i__ - 1];
            goto l3;
l2:
            a_ref(i__, j) = 0.f;
l3:
            ;
        }
    }
    u[0] = -.45833333333333331f;
    i__2 = n;
    for (j = 2; j <= i__2; ++j) {
/* l4: */
        u[j - 1] = 0.f;
    }
    sf = .025f;
    y = -.5f;
    i__2 = m;
    for (i__ = 1; i__ <= i__2; ++i__) {
        s = sf * (float)sin((float)(i__ * 123.456f + 789.f));
/* Computing 3rd power */
        r__1 = y;
        f[i__ - 1] = y - r__1 * (r__1 * r__1) / 3.f + s;
/* l5: */
        y += h__[i__ - 1];
    }
    ef02r_c(&m, &n, a, f, &ng, v1, v2, mu, h__, p, q, r__, &e, &isp, &lu, u,
            &fu, &kn, b);

    for (i = 0; i <= 6; i+= 3) {
        printf("\n %12.4e %12.4e %12.4e ",u[i], u[i+1], u[i+2]);
    }
    printf("\n %12.4e %12.4e \n",u[9], u[10]);
    printf("\n %16.7e %5i \n",fu, kn);
    return 0;
} /* main */


Результат:

       u  =  ( -4.58e-1,   -4.11e-1,   -3.16e-1,   -2.21e-1,   -1.26e-1, 
                  -3.13e-2,    7.87e-2,    1.73e-1,    2.68e-1,    3.64e-1,   4.58e-1 )