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

Кусочно-линейная аппроксимация - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 4.79
megalexa
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 34
27.06.2012, 10:02     Кусочно-линейная аппроксимация #1
Здравствуйте.

Задача: есть два массива X и Y (с одинаковым количеством элементов - по 19). Необходимо установить зависимость между ними Y(X) так, чтобы можно было находить неизвестное приблизительное число Y при значениях X, не из массива.

Решил использоваться кусочно-линейную аппроксимацию.

Алгоритм (найти отрезок x1 < x < x2, вычислить вес для y1: w1 = (x2 - x) / (x2 - x1), вес для точки y2: w2 = (x - x1) / (x2 - x1), сложить: y(x) = y1*w1 + y2*w2).

Код программы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public: double approximat(int X[19], int Y[19], int x)
{    
// вычисление ближайшего большего и его индекса 
                int max = X[0];
                int indexMax = 0;  // индекс
                 for (int i = 0; i<19; i++)
                    {
                        if (X[i] <= max && x <= X[i]) {max = X[i]; i = indexMax;}
                    }
 
// вычисление ближайшего меньшего и его индекса 
 
                int min = X[19];
                int indexMin = 0;
                 for (int i = 0; i<19; i++)
                    {
                        if (X[i] >= min && x >= X[i]) {min = X[i]; i = indexMin;};
                    }
 
// вычисление нужного Y
double Y = ((max-x) / (max-min))*Y[indexMin] +((x-min)/(max-min))*Y[indexMax];
return Y;
}
P.S, намеренно пишу в этом разделе не на родном C++, а в CLI/C++ (Windows Forms).

компиляция проходит успешно, но окно forms зависает при вычислении.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
27.06.2012, 10:14     Кусочно-линейная аппроксимация #2
C++
1
i = indexMax;
C++
1
i = indexMin;
Конечно зависнет. Как только условие срабатывает, переменная i обнуляется и цикл начинается сначала.
megalexa
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 34
27.06.2012, 10:42  [ТС]     Кусочно-линейная аппроксимация #3
видимо, надо было так indexMax = i и, соответственно, indexMin = i

спасибо за то, что указали, где ошибка

Добавлено через 19 минут
еще одна проблема:

вот, что выводит:

Кусочно-линейная аппроксимация

а должно получиться 760

как-будто обрезает где-то числа (вообще мне точность подойдет, просто интересно, где косяк)

с типами переменных вроде все-норм (там где хватает int - там и int, там где надо double - double)...
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
27.06.2012, 10:52     Кусочно-линейная аппроксимация #4
Скорее всего из-за того, что деление получается целочисленным.
C++
1
double Y = (double(max-x) / (max-min))*Y[indexMin] +(double(x-min)/(max-min))*Y[indexMax];
megalexa
3 / 3 / 0
Регистрация: 16.11.2011
Сообщений: 34
27.06.2012, 11:16  [ТС]     Кусочно-линейная аппроксимация #5
огромное-преогромное спасибо, теперь работает так, как надо.
Yandex
Объявления
27.06.2012, 11:16     Кусочно-линейная аппроксимация
Ответ Создать тему
Опции темы

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