|
Текст подпрограммы и версий mnl1r_c.zip |
Тексты тестовых примеров tmnl1r_c.zip |
Минимизация функции многих переменных по заданному направлению на заданном отрезке методом Фибоначчи.
Для решения задачи
min φ (x0 + λ s) , a0 ≤ λ ≤ b0 ,
λ
где x0, s ∈ En, a0, b0, λ ∈ E1, используется метод Фибоначчи.
Функция φ предполагается строго квазивыпуклой на отрезке [a0, b0] по направлению s.
Hа k - ой итерации метода строится отрезок [ak, bk] такой, что [ak, bk] ⊂ [ak - 1, bk - 1] ⊂ ... ⊂ [a0, b0], и значение λ*k ∈ [ai, bi] для всех i, где λ*k - искомая точка минимума φ (x) по направлению s.
Значение λ*k считается найденым, если для некоторого k выполнено одно из следующих условий:
- длина отрезка [ak, bk] меньше заданного ε > 0;
- | φ (x0 + α s) - φ (x0 + β s) | < ε1
max {| φ (x0 + α s)|, | φ (x0 + β s)|},
где
ak < α < β < bk;
- выполнено максимальное число итераций метода;
- выполнено максимальное число вычислений функции.
В.Г.Карманов. Математическое программирование. M., Изд - во "Наука", 1980.
int mnl1r_c (integer *n, real *x, real *xmin, real *s,
S_fp fun, real *aa, real *bb, real *xe, real *fe, real *up,
real *rm, integer *ierr)
Параметры
| n - | размерность пространства переменных (тип: целый); |
| x - | вещественный вектоp длины n, задающий начальную точку поиска минимума по направлению; |
| xmin - | вещественная переменная, содержащая на выходе шаг по направлению до вычисленной точки минимума; |
| s - | вещественный вектоp длины n, задающий направление одномерной минимизации; |
| fun - | имя подпрограммы вычисления значения функции (см. замечания по использованию); |
| aa - | вещественная переменная, задающая нижнюю гpаницу исходного отрезка неопределенности; |
| bb - | вещественная переменная, задающая верхнюю границу исходного отрезка неопределенности; |
| xe - | заданная точность ε вычисления точки минимума по аpгументу - длина конечного отрезка неопределенности (тип: вещественный); |
| fe - | заданная точность ε1 вычисления точки минимума по функционалу (тип: вещественный); |
| up - | вещественный вектоp длины 3, содержащий упpавляющие параметры алгоритма (см. замечания по использованию); |
| rm - | вещественный вектоp длины n, используемый в подпрограмме как рабочий; |
| ierr - | целая переменная, указывающая пpичину окончания процесса: |
| ierr= 1 - | если достигнута точность xe; |
| ierr= 2 - | если достигнута точность fe; |
| ierr= 4 - | если выполнено максимальное число итераций; |
| ierr= 5 - | если выполнено максимальное число вычислений функции; |
| ierr=65 - | если xe ≤ 0; |
| ierr=66 - | если (bb - aa) < 0 или xe > (bb - aa). |
Версии: нет
Вызываемые подпрограммы: нет
Замечания по использованию
|
Подпрограмма fun составляется пользователем. Первый оператор подпрограммы должен иметь вид: int fun(float *x, float *f, float *fe)
Параметры
x - точка, в которой вычисляется значение функции;
f - вычисленное значение функции;
fe - точность, с которой вычисляется значение f.
Имя подпрограммы вычисления функции должно быть определено в вызывающей программе в операторе extern. Вектоp up должен быть задан следующим образом: up (1) - максимальное допустимое число итераций метода; up (2) - максимальное допустимое число вычислений функции; up (3) - определяет вариант алгоритма, т.е. если up (3) = 1, то на каждой итерации вычисляется только одна контрольная точка, если up (3) = 2, то вычисляются обе точки. |
min φ (x) , 4.2 ≤ x ≤ 4.8
φ (x) = 100 e -x + x , x* = - ln(0.01)
int main(void)
{
/* Initialized data */
static int n = 1;
static float x[1] = { 0.f };
static float s[1] = { 1.f };
static float aa = 4.2f;
static float bb = 4.8f;
static float fe = 1e-16f;
static float xe = 1e-6f;
static float up[3] = { 100.f,100.f,1.f };
/* Local variables */
extern int func_c();
static int ierr;
static float xmin;
extern int mnl1r_c(int *, float *, float *, float *, U_fp, float *,
float *, float *, float *, float *, float *, int *);
static float rm[1];
printf("\n %16.7e \n", aa);
printf("\n %16.7e \n", bb);
printf("\n %16.7e \n", fe);
printf("\n %16.7e \n", xe);
mnl1r_c(&n, x, &xmin, s, (U_fp)func_c, &aa, &bb, &xe, &fe, up, rm, &ierr);
printf("\n\n %5i \n", ierr);
printf("\n %16.7e \n", xmin);
return 0;
} /* main */
int func_c(float *x, float *f, float *fe)
{
/* Builtin functions */
double exp(double);
/* Parameter adjustments */
--x;
/* Function Body */
*f = (float)exp((float)(-x[1])) * 100.f + x[1];
return 0;
} /* func_c */
Результаты:
ierr = 2
xmin = 4.60517176