Текст подпрограммы и версий
mna1r_c.zip , mna1d_c.zip
Тексты тестовых примеров
tmna1r_c.zip , tmna1d_c.zip

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

Назначение

Локализация минимума функции одной переменной

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

Подпрограмма mna1r_c для заданной функции одной переменной F (X) выполняет поиск трех таких точек A, B и C, что A < B < C, причем F (B) < F (A) и F (B) < F (C).

Если такие три точки A, B и C найдены, то это означает, что минимум функции (локальный или глобальный) находится между ними.

Перед работой подпрограммы должны быть заданы отличные друг от друга начальные значения для A и B и максимальное количество попыток NMAX для локализации минимума.

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

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

    int mna1r_c (R_fp f, real *a, real *b, real *c, real *fa,
            real *fb, real *fc, integer *iflag, integer *nmax)

Параметры

f - имя вещественной подпрограммы - функции вычисления F (X);
a, b, c - вещественные переменные, значения которых полагаются равными тройке чисел, локализующих минимум функции F (X) (см. также описание параметра iflag); должны быть заданы начальные значения для A и B;
fa, fb -
fc  
вещественные переменные, значения которых полагаются равными F (A), F (B), F (C) соответственно для вычисленных значений A, B, C;
iflag - целая переменная, служащая для сообщения о том, удалось ли локализовать минимум за nmax или меньше попыток; при этом
iflag=0 - когда минимум не локализован; тогда переменные a, b и c содержат значения, полученные при последней попытке;
iflag=1 - когда минимум локализован; тогда переменные a, b и c содержат искомую тройку чисел, локализующих минимум;
nmax - заданное максимальное количество попыток для локализации минимума (тип: целый).

Версии

mna1d_c - локализация минимума функции одной переменной в режиме удвоенной точности. При этом параметры a, b, c, fa, fb и fc должны иметь тип double, а подпрограмма - функция f должна быть описана как double .

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

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

  В подпрограммах mna1r_c и mna1d_c имеется внешняя структура с именем mna1rr_ , содержащая элемент целого типа с именем nreal. Переменная nreal полагается равной количеству попыток, выполненных для локализации минимума. Если iflag = 0, то nreal = nmax .

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

struct {
    int nreal;
} mna1rr_;

#define mna1rr_1 mna1rr_

int main(void)
{
    /* Local variables */
    static int nmax;
    extern int mna1r_c(R_fp, float *, float *, float *, float *, float *,
                       float *, int *, int *);
    static float a, b, c__;
    extern float f_c();
    static int iflag;
    static float fa, fb, fc;

    a = 2.5f;
    b = 2.51f;
    nmax = 100;
    mna1r_c((R_fp)f_c, &a, &b, &c__, &fa, &fb, &fc, &iflag, &nmax);

    printf("\n %16.7e \n", a);
    printf("\n %16.7e \n", b);
    printf("\n %16.7e \n", c__);
    printf("\n %16.7e \n", fa);
    printf("\n %16.7e \n", fb);
    printf("\n %16.7e \n", fc);
    printf("\n %5i \n", iflag);
    printf("\n %5i \n", mna1rr_1.nreal);
    return 0;
} /* main */

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

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

    ret_val = *x / 10.f + (float)cos(*x);
    return ret_val;
} /* f_c */


Результаты:

     a   =  2.75576 ,        b   =   3.07554 ,      c__   =   3.59296 
     fa = - 0.650909 ,    fb = - 0.690265 ,    fc = - 0.540556 
                     
    iflag = 1 
    mna1rr_1.nreal = 3