В начало

Нахождение минимума биквадратичной функции двух переменных на C++

С.И.Хашин


bi_quadr.h - заголовочный файл
bi_quadr.cpp - реализация. Биквадратичной функцией будем называть функцию двух переменных вида:
f (x,y) = a0 + a1 x + a2 x2 + (a3 + a4 x + a5 x2) y + (a6 + a7 x + a8 x2) y2.
Функция такого вида однозначно определяется своими значениями в 9-ти точках:
     (-1,-1) ( 0,-1) ( 1,-1)     f0[0]  f0[1]  f0[2]
     (-1, 0) ( 0, 0) ( 1, 0) ->  f1[0]  f1[1]  f1[2]
     (-1, 1) ( 0, 1) ( 1, 1)     f2[0]  f2[1]  f2[2]
Точки экстремума функции должны удовлетворять системе уравнений:
    df/dx = 0
    df/dy = 0
или
a1 + 2a2 x + (a4 + 2a5 x) y + (a7 + a8 x) y2 = 0
a3 + a4 x + a5 x2 + (a6 + a7 x + a8 x2) y=0.
Выразим из второго уравнения y:
y = - ½ (a3 + a4 x + a5 x2)/ (a6 + a7 x + a8 x2).
Подставив это выражение в первое уравнение, получим уравнение от одной переменной x. Его левая часть является рациональной функцией со знаменателем
(a6 + a7 x + a8 x2)2
и числителем – многочленом 5-й степени от x. Корни этого многочлена соответствуют экстремумам исходной функции. Как следствие, их не более пяти.

Таким образом, нахождение экстремумов биквадратичной фунции сводится к решению уравенения 5-й степени.

В рассматриваемом модуле предлагается одна-единственная функция

  double minBiQuad(double *f0, double *f1, double *f2, double delta, double &xm, double &ym);
Она по данным 9-ти значениям биквадратичной функции
     (-1,-1) ( 0,-1) ( 1,-1)     f0[0]  f0[1]  f0[2]
     (-1, 0) ( 0, 0) ( 1, 0) ->  f1[0]  f1[1]  f1[2]
     (-1, 1) ( 0, 1) ( 1, 1)     f2[0]  f2[1]  f2[2]
находит точку (xm,ym) её минимума на квадрате
-1-δ ≤ x ≤ 1+δ
-1-δ ≤ y ≤ 1+δ .
Возвращаемое значение — найденный минимум.

free counters