|
Текст подпрограммы и версий 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