| 
      Текст подпрограммы и версий  mnb8r_c.zip mnb8d_c.zip  | 
      Тексты тестовых примеров   tmnb8r_c.zip tmnb8d_c.zip  | 
Решение задачи одномерной минимизации функции многих переменных по заданному направлению и на заданном интервале методом золотого сечения.
Для решения задачи
min φ (x0 + α s) , x0 ∈ En , s ∈ En , α ∈ R , α
используется метод золотого сечения. При этом предполагается, что задан отрезок [a, b] изменения параметра α такой, что функция φ (x), рассмотренная вдоль направления s, принимает на [a, b] свое минимальное значение.
В.Г.Карманов, Математическое программирование, Изд - во "Hаука", M., 1975, стp.153 - 155.
    int mnb8r_c (integer *n, real *x, real *s, real *xx, S_fp fun,
            real *aa, real *bb, real *epsx, real *eps, integer *itmax,
            integer *maxk, real *fmin, real *xmin, integer *kount,
            integer *iter, integer *nacc, integer *ierr)
Параметры
| n - | размерность пространства переменных (тип: целый); | 
| x - | вещественный вектоp длины n, задающий начальную точку x0 поиска одномерного минимума; | 
| s - | вещественный вектоp длины n, задающий направление поиска; | 
| xx - | вещественный вектоp длины n, используемый в подпрограмме как рабочий; | 
| fun - | имя подпрограммы вычисления значения минимизиpуемой функции; | 
| aa - | нижняя граница интервала, содержащего точку минимума (тип: вещественный); | 
| bb - | верхняя граница интервала, содержащего точку минимума (тип: вещественный); | 
| epsx - | заданная точность вычисления точки минимума по аpгументу (тип: вещественный); | 
| eps - | заданная точность вычисления минимума по функционалу (тип: вещественный); | 
| itmax - | заданное максимально допустимое число итераций метода (тип: целый); | 
| maxk - | заданное максимально допустимое число вычислений функции (тип: целый); | 
| fmin - | вещественная переменная, на выходе из подпрограммы содержащая вычисленное максимальное значение функции; | 
| xmin - | вещественная переменная, на выходе из подпрограммы содержащая значение шага α до точки минимума по направлению; | 
| kount - | целая переменная, на выходе из подпрограммы содержащая выполненное число вычислений функции; | 
| iter - | целая переменная, на выходе из подпрограммы содержащая выполненное число итераций; | 
| nacc - | целая переменная, задающая признак варианта алгоритма: | 
| nacc=1 - | на каждой итерации вычисляется только одна новая контрольная точка; | 
| nacc=2 - | для каждого нового интервала вычисляются обе контрольные точки (см. замечания по использованию); | 
| ierr - | целая переменная, служащая для сообщения об ошибках и причинах окончания поиска: | 
| ierr= 1 - | достигнута точность eps; | 
| ierr= 2 - | достигнута точность epsx; | 
| ierr=65 - | заданная точность epsx ≤ 0; | 
| ierr=66 - | заданные значения aa, bb, и epsx таковы, что либо bb ≤ aa, либо (bb - aa) < epsx; | 
| ierr=67 - | выполнено itmax итераций, но ни epsx, ни eps не достигнуты; | 
| ierr=68 - | выполнено maxk вычислений функции, но ни epsx, ни eps не достигнуты. | 
Версии
| mnb8d_c - | решение задачи одномерной минимизации функции многих переменных по заданному направлению и на заданном интервале методом золотого сечения, вычисления проводятся с двойной точностью. | 
Вызываемые подпрограммы: нет
Замечания по использованию
| 
    В подпрограмме mnb8d_c и подпрограмме fun параметры x, s, xx, aa, bb, epsx, eps, fmin, xmin, f, fe должны иметь тип double. Тип остальных параметров не меняется.  | |
| 
    Подпрограмма fun составляется пользователем. Первый оператор подпрограммы вычисления функции должен иметь вид:              int fun(float *x, float *f, float *fe)
         Параметры
         x   - вещественный вектор длины  n, задающий точку
                 пространства, в которой  вычисляется значение функции;
         f   - вещественная переменная, содержащая
                 вычисленное значение в точке  x;
         fe - заданная точность вычисления значения функции
                 в точке x (тип: вещественный). 
   Параметр fe не должен переопределяться в теле подпрограммы fun и может не использоваться для вычисления значения функции. Имя подпрограммы вычисления значения функции должно быть определено в вызывающей подпрограмме оператором extern. На очередной итерации метода на интервале [ak, bk] фиксиpуются две контрольные точки v1 и v2, такие что ak < v1 < v2 < bk. При nacc = 1 в качестве одной из точек (v1 или v2) используется точка, вычисленная на пpедыдущей итерации. При этом погрешность вычислений может накапливаться от итерации к итерации. При nacc = 2 на каждой итерации v1 и v2 вычисляются заново, однако число вычислений функции на каждой итерации удваивается. | 
    min  φ (x0 + α s) ,   x0 ,   s ∈ E1 ,    x0 = 0.0 ,   s = 1.0
      α 
    φ (x)  =  100*e-x + x 
    Оптимальное значение   α*  =  - ln(0.01)
    φ (x0 + α* s)  =  1 - ln(0.01)
int main(void)
{
    /* Initialized data */
    static int n = 1;
    static float x[1] = { 0.f };
    static float s[1] = { 1.f };
    static float aa = 4.2f;
    static float bb = 4.8f;
    static float eps = 1e-16f;
    static float epsx = 1e-6f;
    static int itmax = 100;
    static int maxk = 100;
    /* Local variables */
    static int nacc;
    static float fmin;
    extern int func_c();
    static int iter;
    static float xmin;
    extern int mnb8r_c(int *, float *, float *, float *, U_fp, float *,
                       float *, float *, float *, int *, int *, float *,
                       float *, int *, int *, int *, int *);
    static int kount;
    static float xx[1];
    static int ier;
    nacc = 1;
    printf("\n %16.7e %16.7e \n", aa, bb);
    printf("\n %16.7e \n", eps);
    printf("\n %16.7e \n", epsx);
    printf("\n %5i \n", itmax);
    printf("\n %5i \n", maxk);
    mnb8r_c(&n, x, s, xx, (U_fp)func_c, &aa, &bb, &epsx, &eps, &itmax, &maxk,
            &fmin, &xmin, &kount, &iter, &nacc, &ier);
    printf("\n\n %5i \n", ier);
    printf("\n %5i \n", iter);
    printf("\n %16.7e %16.7e \n", fmin, xmin);
    printf("\n %5i \n", kount);
    return 0;
} /* main */
int func_c(float *x, float *f, float *fe)
{
    /* Builtin functions */
    double exp(double);
    /* Parameter adjustments */
    --x;
    /* Function Body */
    *f = (float)exp((float)(-x[1])) * 100.f + x[1];
    return 0;
} /* func_c */
Результаты:
      ier   =  1
      iter  =  14
      fmin  =  5.605170 + 00
      xmin  =  4.605681 + 00
      kount  =  15