Форум программистов, компьютерный форум CyberForum.ru

Построение матрицы наблюдений при использовании функций принадлежности (трапеций) - C++

Восстановить пароль Регистрация
 
oksanaBM
1 / 1 / 0
Регистрация: 27.01.2011
Сообщений: 91
06.06.2014, 12:00     Построение матрицы наблюдений при использовании функций принадлежности (трапеций) #1
В общем, у меня есть задача построения матрицы наблюдений при помощи базисных функций. Написала для случая одного фактора и двух для треугольников, для 1 фактора трапеций. В случае одномерном создавала сетку в виде отрезков , а в двумерном случае сеткой являются прямоугольники. Никак не могу сообразить, как из этого собрать матрицу с двумя факторами для трапеций. ибо они очень трудно представляются. прикрепляю документ о функциях треугольниках и трапециях http://fuzzy-group.narod.ru/files/Fu...p.function.pdf , как они выглядят. может быть кто встречался с такой задачей, глянет код. Спасибо.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//функция проверки вхождения точки в отрезок
bool sector::in_sector(double x) 
{
    return (x >= a) && (x <= b);//для одномерного случая, когда 1 фактор, проверяем вхождение в отрезок
}
 
//функция проверки вхождения отрезка в прямоугольник
bool rectangle::in_rect(double* x) 
{
    return (x[0] >= a[0]) && (x[0] <= b[0]) && (x[1] >= a[1]) && (x[1] <= b[1]);//для двумерного случая - когда два фактора
}
 
 
//функция определения номера для одномерного
int sector::mu_number_one(int i, int j, int choiceFunc, int **mu_loc_number) 
{
    int point_number;
    if (choiceFunc == 1) {//если треугольники
        switch(i) 
        {
            case 0: point_number = mu_loc_number[j][0]; break;
            case 1: point_number = mu_loc_number[j][1]; break;
        }
    }
    else {//если трапеции
        switch(i) 
        {
            case 0: point_number = mu_loc_number[j][0]; break;
            case 1: point_number = mu_loc_number[j][0]; break;
            case 2: point_number = mu_loc_number[j][1];
        };
        }
    return point_number;
}
 
//значение функции принадлежности в точке х (ДЛЯ ТРАПЕЦИЙ) для одномерного
double sector::mu_val_tra_one(int i, double x) 
{
    double X3 = (x - a) / (b - a);//левая часть треугольника
    double X1 = 1.0;//верхнеее основание трапеции
    double X2 = (b - x) / (b - a);//правая часть треугольника
    
    switch(i) 
    {
        case 0: return X1;
        case 1: return X2;
        case 2: return X3;
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//функция определения номера для двумерного
int rectangle::mu_number_two(int i, int j, int choiceFunc, int **mu_loc_number_x, int **mu_loc_number_y) {
    int point_number;
        
    switch(i) {
            case 0: point_number = n_x * number_a[1] + number_a[0]; break;
            case 1: point_number = n_x * number_a[1] + number_a[0] + 1; break;
            case 2: point_number = n_x * (number_a[1]+1) + number_a[0]; break;
            case 3: point_number = n_x * (number_a[1]+1) + number_a[0] + 1;
    }
    return point_number;
}
 
//значение функции принадлежности в точке х (ДЛЯ ТРЕУГОЛЬНИКОВ) для одномерного
double sector::mu_val_tri_one(int i, double x) 
{
    double X1 = (b - x) / (b - a);//правая часть треугольника
    double X2 = (x - a) / (b - a);//левая часть треугольника
 
    switch(i) 
    {
        case 0: return X1;
        case 1: return X2;
    }
}
 
//значение функции принадлежности в точке х (ДЛЯ ТРЕУГОЛЬНИКОВ) для двумерного
double rectangle::mu_val_tri_two(int i, double* x) 
{
    double X1 = (b[0] - x[0]) / (b[0] - a[0]);//правая часть треугольника
    double X2 = (x[0] - a[0]) / (b[0] - a[0]);//левая часть треугольника
    double Y1 = (b[1] - x[1]) / (b[1] - a[1]);
    double Y2 = (x[1] - a[1]) / (b[1] - a[1]);
 
    switch(i) 
    {
        case 0: return X1 * Y1;
        case 1: return X2 * Y1;
        case 2: return X1 * Y2;
        case 3: return X2 * Y2;
    }
}
//значение функции принадлежности в точке х (ДЛЯ ТРАПЕЦИЙ) для двумерного
double rectangle::mu_val_tra_two(int i, double* x) 
{
    double X1 = 1.0;
    double X2 = (b[0] - x[0]) / (b[0] - a[0]);//правая часть треугольника
    double X3 = (x[0] - a[0]) / (b[0] - a[0]);//левая часть треугольника
    double Y1 = 1.0;
    double Y2 = (b[1] - x[1]) / (b[1] - a[1]);
    double Y3 = (x[1] - a[1]) / (b[1] - a[1]);
 
    switch(i) 
    {
        case 0: return X1 * Y1;
        case 1: return X2 * Y1;
        case 2: return X3 * Y1;
        case 3: return X1 * Y2;
        case 4: return X2 * Y2;
        case 5: return X3 * Y2;
        case 6: return X1 * Y3;
        case 7: return X2 * Y3;
        case 8: return X3 * Y3;
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//функция построения матрицы наблюдений для двух факторов для ТРЕУГОЛЬНИКОВ
void method::constructMatrixX_two_tri()
{
    if (inData.numberRules == 1) inData.m_loc = number_mu*2 + 1;
    else 
    {
        if (inData.numberRules == 2) inData.m_loc = number_mu*2 + 1;
        
        else inData.m_loc = number_mu*2 + 1;
    }
    for( int i=0; i<inData.dimExp; i++)//для каждого эксперимента 
    {
        for(int j = 0 ; j < inData.m_loc; j++)
            Xmat[i][j] = 0;//обнуляем элементы
    }
        for( int i=0; i<inData.dimExp; i++)//для каждого эксперимента 
            Xmat[i][0] = 1;//выделяем первый столбец под свободный член полностью из единиц 
 
    for(int rect_i = 0 ; rect_i < rect_n; rect_i++)//по каждому прямоугольнику 
    {
        for(int point_i = 0; point_i < C[rect_i].xx_two.size(); point_i++)//по всем точкам в прямоугольнике 
        {
            for(int mu_i = 0; mu_i < 4; mu_i++)//по всем функиям принадлежности
            {
                int col_start1 = 2 * C[rect_i].mu_number_two(mu_i, rect_i, inData.choiceFunction, mu_numbers_x, mu_numbers_y) + 1;
                int col_start2 = 2 * C[rect_i].mu_number_two(mu_i, rect_i, inData.choiceFunction, mu_numbers_x, mu_numbers_y) + 2;
                int row = C[rect_i].number_x_two[point_i];
                double mu_v = C[rect_i].mu_val_tri_two(mu_i, C[rect_i].xx_two[point_i]);
 
                Xmat[row][col_start1] = mu_v * C[rect_i].xx_two[point_i][0];
                Xmat[row][col_start2] = mu_v * C[rect_i].xx_two[point_i][1];
            }
        }
    }}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//функция построения матрицы наблюдений для одного фактора для ТРАПЕЦИЙ
void method::constructMatrixX_one_tra()
{
    if (inData.numberRules == 1) inData.m_loc = number_mu * 2;
    else 
    {
        if (inData.numberRules == 2) inData.m_loc = number_mu * 2;
        else inData.m_loc = number_mu * 2;
    }
 
    for( int i=0; i<inData.dimExp; i++)//для каждого эксперимента 
    {
        for(int j = 0 ; j < inData.m_loc; j++)
            Xmat[i][j] = 0;//обнуляем элементы
    }
 
    int flag = 0;
    for(int sector_i = 0 ; sector_i < sector_n; sector_i++)//по каждому отрезку 
    {
        if (flag == 0)//если не построили прямую, идем ее строить
        {
            int mu_i = 0;//участок, где рассматривается прямая у трапеции mu_i = 0 - mu_val_tra_one(0) = 1.0
            for(int point_i = 0; point_i < D[sector_i].xx_one.size(); point_i++)//по всем точкам в отрезке
            {
                int col_start = 2 * D[sector_i].mu_number_one(mu_i, sector_i, inData.choiceFunction, mu_numbers_x);//индекс столбца
                int row = D[sector_i].number_x_one[point_i];//индекс строки
                double mu_v = D[sector_i].mu_val_tra_one(mu_i, D[sector_i].xx_one[point_i]);//значение функции принадлежности в иксе
                Xmat[row][col_start] = mu_v;
                Xmat[row][col_start+1] = mu_v * D[sector_i].xx_one[point_i];//полчучение собсно значения элемента в матрице наблюдений
                
            }
        flag = 1;//прямую прошли, теперь надо перейти к треугольникам
        }
        else//если построили  прямую, идем строить треугольники
        {
            for (int mu_i = 1; mu_i < 3; mu_i++)//участок, где рассматривается правая часть треугольника
            {
                for(int point_i = 0; point_i < D[sector_i].xx_one.size(); point_i++)//по всем точкам в отрезке
                {
                    int col_start = 2*D[sector_i].mu_number_one(mu_i, sector_i, inData.choiceFunction, mu_numbers_x);//столбец
                    int row = D[sector_i].number_x_one[point_i];//строка
                    double mu_v = D[sector_i].mu_val_tra_one(mu_i, D[sector_i].xx_one[point_i]);//значение функции принадлежности в иксе
                    
                    Xmat[row][col_start] = mu_v;
                    Xmat[row][col_start+1] = mu_v * D[sector_i].xx_one[point_i];
                }
            flag = 0;
            }
        }   
    }  }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2014, 12:00     Построение матрицы наблюдений при использовании функций принадлежности (трапеций)
Посмотрите здесь:

C++ Построение графика функций
Использовании функций rand и c++ C++
Построение графиков элементарных функций C++
C++ При использовании оператора GOTO зацикливается программа при введении букв.
Построение новой матрицы по части заданой матрицы C++
C++ Реализация класса функций принадлежности треугольника и трапеций
C++ Построение функции принадлежности нечеткого множества
При использовании getline ввод при Enter заканчивается только после пробела C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 23:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru