К оглавлению

Биквадратичная функция на плоскости по 9-ти точкам


BiQuadr.h - заголовочный файл
BiQuadr.cpp - реализация.

Биквадратичной будем называть функцию двух переменных вида:

    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 (минимум)

К оглавлению


free counters