Биквадратичной будем называть функцию двух переменных вида:
f(x,y) = a[0]+a[1]*x+a[2]*x*x + (a[3]+a[4]*x+a[5]*x*x)*y + (a[6]+a[7]*x+a[8]*x*x)*y*yНетрудно проверить, что такая функция может иметь до пяти различных экстремумов, нахождение которых сводится к решению уравнения 5-й степени. Для решения этого уравнения подключаем модуль "poly34.h".
Даны значения функции в 9-ти точках:
// (-1,-1) ( 0,-1) ( 1,-1) f[0] f[1] f[2] // (-1, 0) ( 0, 0) ( 1, 0) -> f[3] f[4] f[5] // (-1, 1) ( 0, 1) ( 1, 1) f[6] f[7] f[8]
Находим биквадратичную функцию, принимающую в этих точках данные значения:
// Находим ищем биквадратичную функцию a[i] по 9-ти точкам f[j] void findBiQuad(double *f, double *a);
Далее, для биквадратичной функции с коэффициентами a[i] находим точки экстремума (x0[i],y0[i]), значения в них (z0[i]) и возвращаем количество экстремумов:
int extremBiQuad(double *a, int *type, double *x0, double *y0, double *z0);
Внимание! Массивы type, x0, y0, z0 должны иметь не менее пяти элементов каждый!
В массиве type возвращается тип каждого из экстремумов:
// type[i] - тип экстремума, // type[i] = -1 - минимум, // type[i] = 0 - седло, // type[i] = +1 - максимум,
Даны значения функции f в 9-ти точках. (x,y):=точка мимимума биквадратичной функции:
double minBiSq(double *f, double &x, double &y, double maxOffset);
Если |x|> maxOffset или |y|> maxOffset, то вектор (x,y) уменьшается.
Возвращает значение биквадратичной функции в точке минимума.
И последняя функция (служебная)
double vBiSQ(double *a, double x, double y);
по данным девяти коэффициентам биквадратичной функции a[i] найти значение в точке (x,y)
double f[9]; int i = 0; // задаем значения функции в 9-ти точках for (int y = -1; y <= 1; y++) for (int x = -1; x <= 1; x++) f[i++] = 3 + x*x + y*y + 0.1*x - 0.2*y - x*x*y*y -1.5*x*y*y; // восстанавливаем коэффициенты фунции: double a[9]; findBiQuad(f, a); for (int i = 0; i < 9; i++) printf("a[%2d]=%10.5f\n", i, a[i]); // находим экстремумы: double x[5], y[5], z[5]; int type[5]; int k = extremBiQuad(a, type, x, y, z); for( int i=0; iПолучим:
a[ 0]= 3.00000 a[ 1]= 0.10000 a[ 2]= 1.00000 a[ 3]= -0.20000 a[ 4]= 0.00000 a[ 5]= 0.00000 a[ 6]= 1.00000 a[ 7]= -1.50000 a[ 8]= -1.00000 0), type= 0, f( -2.03177, -1.24343)= 7.04924 (седло) 1), type= 0, f( -1.96771, 1.25493)= 6.54961 (седло) 2), type= 0, f( 0.55737, -0.68160)= 3.43456 (седло) 3), type= 0, f( 0.43586, 0.64009)= 3.16955 (седло) 4), type=-1, f( -0.04376, 0.09401)= 2.98814 (минимум)