В начало
Нахождение минимума биквадратичной функции двух переменных на 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+δ .
Возвращаемое значение — найденный минимум.