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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
oksanaBM
1 / 1 / 0
Регистрация: 27.01.2011
Сообщений: 91
#1

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

06.06.2014, 12:00. Просмотров 274. Ответов 0
Метки нет (Все метки)

В общем, у меня есть задача построения матрицы наблюдений при помощи базисных функций. Написала для случая одного фактора и двух для треугольников, для 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;
            }
        }   
    }  }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2014, 12:00
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Построение матрицы наблюдений при использовании функций принадлежности (трапеций) (C++):

Реализация класса функций принадлежности треугольника и трапеций - C++
Здравствуйте. Передо мной стоит такая задача. Необходимо реализовать задачу поиска регрессионной зависимости в условиях нечеткой логики....

Ошибка выполнения программы при использовании функций - C++
Все привет, друзья! Имеется задача: Последовательность {Ai}i-1 образована по правилу Ai=1/i. Дано вещественное число 0&lt;eps&lt;0.1. ...

Как избежать дублирования кода при использовании virtual функций? - C++
Здравствуйте. Есть Класс Студент_А и Студент_Б. В каждом есть поле private содержащее string name. В классе Студент_А есть virtual метод,...

Построение функции принадлежности нечеткого множества - C++
Всем привет =))) Столкнулся с такой задачей: написать программу построения графика функции принадлежности нечеткого множества. У меня...

Использовании функций rand и c++ - C++
Прошу написать код использований функций rand и вывод его с помощью cout . без всяких заморочек и.т.д,просто вывод случайных чисел диапозон...

Построение функций принадлежности - Matlab
Никак не пойму как сделать.

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2014, 12:00
Привет! Вот еще темы с ответами:

Ошибка при использовании функций - Matlab
Здравствуйте! Есть код, в котором значения теплопроводности, теплоемкости и плотности заданы функциями: clc, clear all lmd_fld...

Построение графика при использовании 8-ми наборов переменных - MathCAD
Здравствуйте, опять проблема при построении графика. Есть функция которая задается четырьмя параметрами (углами). При этом существует набор...

Очередность вывода echo при использовании функций - PHP
Уже который раз сталкиваюсь с одной и той же проблемой. Строка выводящая текст: echo...

Падает скрипт при повторном использовании функций - Python
Все очень просто, у меня есть 3 функции которые я вызываю подряд, а потом снова. Мне нужно просто запустить функцию, больше ничего. ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru