Текст подпрограммы и версий mna4r_c.zip , mna4d_c.zip |
Тексты тестовых примеров tmna4r_c.zip , tmna4d_c.zip |
Поиск локального минимума функции одной переменной модифицированным методом Брента (методом обратной параболической интерполяции с вычислением первой производной).
Пусть заданы функция 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