Текст подпрограммы и версий mna1r_c.zip , mna1d_c.zip |
Тексты тестовых примеров tmna1r_c.zip , tmna1d_c.zip |
Локализация минимума функции одной переменной
Подпрограмма 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