|
Текст подпрограммы и версий mna3r_c.zip , mna3d_c.zip |
Тексты тестовых примеров tmna3r_c.zip , tmna3d_c.zip |
Поиск локального минимума функции одной переменной методом Брента (метод обратной параболической интерполяции).
Пусть зананы функция F (X) и три такие точки A, B и C, локализующие минимум функции F (X), что A < B < C, причем F (B) < F (A) и F (B) < F (C).
Подпрограмма mna3r_c осуществляет поиск точки XMIN локального минимума функции F (X) на отрезке [A, C] с относительной точностью EPS методом Брента (методом обратной параболической интерполяции).
Н.С.Бахвалов. Численные методы. Изд - во "Наука", 1979.
int mna3r_c (R_fp f, real *a, real *b, real *c, real *eps,
real *xmin, real *fmin, integer *iflag, integer *itmax)
Параметры
| f - | имя вещественной подпрограммы - функции вычисления 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 - | заданное максимальное количество итераций (тип: целый). |
Версии
| mna3d_c - | поиск минимума функции одной переменной методом Брента (методом обратной параболической итерации) в режиме удвоенной точности. При этом параметры a, b, c, eps, xmin и fmin должны иметь тип double, а подпрограмма - функция f должна быть описана как double |
Вызываемые подпрограммы: нет
Замечания по использованию
| В подпрограммах mna3r_c и mna3d_c имеется внешняя структура с именем mna3rr_ , содержащая элемент целого типа с именем iter. Переменная iter полагается равной количеству итераций, выполненных при поиске минимума функции. Если iflag = 0, то iter = itmax. В этом случае следует либо увеличить itmax, либо увеличить eps. |
struct {
int iter;
} mna3rr_;
#define mna3rr_1 mna3rr_
int main(void)
{
/* Local variables */
static float fmin, xmin;
extern int mna3r_c(R_fp, float *, float *, float *, float *, float *,
float *, int *, int *);
static float a, b, c__;
extern float f_c();
static int iflag, itmax;
static float eps;
a = -10.f;
b = -9.999f;
c__ = 11.f;
eps = 1e-6f;
itmax = 100;
mna3r_c((R_fp)f_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", mna3rr_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 */
Результаты:
xmin = 0.0 , fmin = 0.0
iflag = 1 , mna3rr_1.iter = 10