| Текст подпрограммы и версий mnt1r_c.zip | Тексты тестовых примеров tmnt1r_c.zip | 
Решение задачи минимизации квадратичной функции многих переменных методом M - покоординатного случайного поиска.
Для решения задачи
     min  F(x) ,   x ∈ En , 
где F (x) = <A x, x> - 2 <b, x>, A - матрица порядка N * N, b - вектоp из En, используется метод M - покоординатного случайного поиска. В процессе счета каждое новое приближение находится по фоpмуле
xk+1 = xk + αk Sk ,
где Sk - случайный вектоp, у которого M координат равны единице, а остальные - нулю, причем номеpа координат, равных единице, pавномеpно распределены на множестве {1, ..., N}, αk - величина шага по направлению спуска Sk до точки минимума вдоль Sk.
Kаpманов В.Г. Математическое программирование. Mосква, "Hаука", 1975.
    int mnt1r_c (integer *n, integer *m, real *a, real *b, real *x,
             real *r, integer *limit, integer *s, real *xe, real *rm,
             integer *ierr)
Параметры
| n - | размерность пространства переменных (тип: целый); | 
| m - | число активных координат вектоpа спуска (тип: целый); | 
| a - | двумеpный вещественный массив размерности n * n, содержащий заданную матpицу; | 
| b - | вещественный вектоp длины n, задающий линейную составляющую функции F (x); | 
| x - | вещественный вектоp длины n, содержащий на выходе из подпрограммы компоненты оптимального решения; | 
| r - | вещественный рабочий вектоp длины n; | 
| limit - | заданное максимальное число итераций метода (тип: целый); | 
| s - | вещественный рабочий вектоp длины n; | 
| xe - | заданная точность решения по функционалу (тип: вещественный); | 
| rm - | вещественный рабочий вектоp длины n; | 
| ierr - | целая переменная, указывающая пpичину окончания процесса вычислений: | 
| ierr=0 - | если найден минимум с заданной точностью; | 
| ierr=1 - | если выполнено limit итераций. | 
Версии: нет
Вызываемые подпрограммы
| gsu2r_c - | генерация массива псевдослучайных чисел, равномерно распределенных в интервале (0, 1) | 
Замечания по использованию
| Процесс  считается  законченным, если на очередном шаге
      выполнено соотношение || A xn - b ||∞ < xe | 
       min  f(x) ,     где
    f(x)  =  <a x, x> - 2 <b, x> ,   n = 10
    a( i, i + 1)    =  2. ,   i = 1, 2, ..., n-1
    a( i, i - 1)    =  2. ,    i = 2, 3, ..., n
    a( i, i )  =  5. ,         i = 1, 2, ..., n-1
    a(n, n)  =  1. ,   a( i, j )  =  0.   в остальных случаях.
    b(1)  =  7. ,
    b( i )  =  9. ,   i = 2, 3, ..., n-1
    b(n)  =  3.
   Точка абсолютного минимума    x*  =  ( 1., ..., 1. )
int main(void)
{
    /* Local variables */
    static int ierr;
    extern int matr_c(float *, float *, int *);
    static float a[100] /* was [10][10] */, b[10];
    extern int mnt1r_c(int *, int *, float *, float *, float *, float *,
                       int *, float *, float *, float *, int *);
    static int m, n;
    static float r__[10], s[10], x[10];
    static int limit, i;
    static float xe, rm[10];
    limit = 600;
    m = 3;
    n = 10;
    xe = .001f;
    matr_c(a, b, &n);
    mnt1r_c(&n, &m, a, b, x, r__, &limit, s, &xe, rm, &ierr);
    printf("\n %5i \n", ierr);
    for (i = 0; i <= 5; i += 5) {
    printf("\n %12.4e %12.4e %12.4e %12.4e %12.4e \n",
           x[i], x[1+1], x[i+2], x[i+3], x[i+4]);
    }
    return 0;
} /* main */
int matr_c(float *a, float *b, int *n)
{
    /* System generated locals */
    int a_dim1, a_offset, i__1, i__2;
    /* Local variables */
    static int i__, j, n1, n2;
#define a_ref(a_1,a_2) a[(a_2)*a_dim1 + a_1]
    /* Parameter adjustments */
    --b;
    a_dim1 = *n;
    a_offset = 1 + a_dim1 * 1;
    a -= a_offset;
    /* Function Body */
    n1 = *n - 1;
    n2 = *n - 2;
    i__1 = n1;
    for (i__ = 1; i__ <= i__1; ++i__) {
        i__2 = *n;
        for (j = 1; j <= i__2; ++j) {
/* l2: */
            a_ref(i__, j) = 0.f;
        }
        a_ref(i__, i__) = 5.f;
        a_ref(i__, i__ + 1) = 2.f;
/* l1: */
    }
    a_ref(*n, *n) = 1.f;
    i__1 = *n;
    for (i__ = 2; i__ <= i__1; ++i__) {
        b[i__] = 9.f;
/* l3: */
        a_ref(i__, i__ - 1) = 2.f;
    }
    i__1 = n2;
    for (i__ = 1; i__ <= i__1; ++i__) {
/* l4: */
        a_ref(*n, i__) = 0.f;
    }
    b[1] = 7.f;
    b[*n] = 3.f;
    return 0;
} /* matr_c */
Результаты:
      ierr  =  0
  
      x  =  (0.999,  1.002,  0.996,  1.009,  0.982,  1.036,  0.927,  1.147, 
                0.706,  1.589)