Текст подпрограммы и версий
mna4r_c.zip , mna4d_c.zip
Тексты тестовых примеров
tmna4r_c.zip , tmna4d_c.zip

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

Назначение

Поиск локального минимума функции одной переменной модифицированным методом Брента (методом обратной параболической интерполяции с вычислением первой производной).

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

Пусть заданы функция F (X) и три такие точки A, B и C, локализующие минимум функции F (X), что A < B < C, причем F (B) < F (A) и F (B) < F (C).

Подпрограмма mna4r_c осуществляет поиск точки XMIN локального минимума функции F (X) на отрезке [A, C] с относительной точностью EPS модифицированным методом Брента (методом обратной параболической интерполяции с вычислением первой производной).

Н.С.Бахвалов. Численные методы. Изд - во "Наука", 1979.

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

    int mna4r_c (R_fp f, R_fp fd, real *a, real *b, real *c,
            real *eps, real *xmin, real *fmin, integer *iflag, integer *itmax)

Параметры

f - имя вещественной подпрограммы - функции вычисления F (X);
fd - имя вещественной подпрограммы - функции вычисления первой производной функции F (X);
a, b, c - заданные значения тройки чисел, локализующих минимум функции F (X) (тип: вещественный);
eps - заданная относительная точность вычисления минимума функции F (X) на отрезке [A, C] (тип: вещественный);
xmin - вещественная переменная, значение которой полагается равным найденной точке минимума функции F (X) на отрезке [A, C];
fmin - вещественная переменная, значение которой полагается равным F (XMIN);
iflag - целая переменная, служащая для сообщения о том, удалось ли найти минимум функции F (X) на отрезке [A, C] за itmax или меньше итераций; при этом:
iflag=0 - когда минимум функции F (X) не найден; тогда xmin содержит последнее приближение к точке минимума, а fmin - значение F (X) в этой точке;
iflag=1 - когда минимум найден с точностью eps;
itmax - заданное максимальное количество итераций (тип: целый).

Версии

mna4d_c - поиск минимума функции одной переменной методом Брента (методом обратной параболической итерации) в режиме удвоенной точности. При этом параметры a, b, c, eps, xmin и fmin должны иметь тип double, а подпрограммы - функции f и fd должны быть описаны как double.

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

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

  В подпрограммах mna4r_c и mna4d_c имеется внешняя структура с именем mna4rr_ , содержащая элемент целого типа с именем iter. Переменная iter полагается равной количеству итераций, выполненных при поиске минимума функции. Если iflag = 0, то iter = itmax. В этом случае следует либо увеличить itmax, либо увеличить eps

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

struct {
    int iter;
} mna4rr_;

#define mna4rr_1 mna4rr_

int main(void)
{
    /* Local variables */
    static float fmin, xmin;
    extern int mna4r_c(R_fp, R_fp, float *, float *, float *, float *,
                       float *, float *, int *, int *);
    static float a, b, c__;
    extern float f_c();
    static int iflag, itmax;
    extern float fd_c();
    static float eps;

    a = -10.f;
    b = -9.999f;
    c__ = 11.f;
    eps = 1e-6f;
    itmax = 100;
    mna4r_c((R_fp)f_c, (R_fp)fd_c, &a, &b, &c__, &eps, &xmin, &fmin, &iflag,
            &itmax);

    printf("\n %16.7e \n", xmin);
    printf("\n %16.7e \n", fmin);
    printf("\n %5i \n", iflag);
    printf("\n %5i \n", mna4rr_1.iter);
    return 0;
} /* main */

float f_c(float *x)
{
    /* System generated locals */
    float ret_val;

    ret_val = *x * *x;
    return ret_val;
} /* f_c */

float fd_c(float *x)
{
    /* System generated locals */
    float ret_val;

    ret_val = *x * 2.f;
    return ret_val;
} /* fd_c */


Результаты:

       xmin  = 0.0 ,     fmin = 0.0 
       iflag = 1 ,        mna4rr_1.iter   = 3