Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Функция для линейной интерполяции на C++ / 10 сообщений из 10, страница 1 из 1
22.09.2015, 13:07
    #39058261
FreeRotor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для линейной интерполяции на C++
Всем привет.
Пытаюсь написать код для линейной интерполяции функции заданной двумя массивами вещественных чисел.
Не могу понять как обработать ситуацию когда значение из переданного массива аргументов попадает в интервал значений уже имеющегося массива аргументов. Мне приходило в голову что нужно использовать бинарный поиск? - но это уж слишком как-то сложно. Гуглил, но тоже как-то не нашел варианта не использующего какие-то вспомогательные библиотеки.

Спасибо!
...
Рейтинг: 0 / 0
22.09.2015, 15:07
    #39058437
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для линейной интерполяции на C++
Бинарный поиск это не сложно. Тут готовый пример на С/С++ с подробными комментариями.

В остальном слабо понял что надо сделать.
...
Рейтинг: 0 / 0
22.09.2015, 15:33
    #39058505
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для линейной интерполяции на C++
Dima TБинарный поиск это не сложно. Тут готовый пример на С/С++ с подробными комментариями.
Зачем? Есть же binary_search и lower_bound
...
Рейтинг: 0 / 0
22.09.2015, 15:52
    #39058547
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для линейной интерполяции на C++
Осталось только понять назачем всё это. Обычно интерполяции совершенно не мешает удвоение
входных данных.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.09.2015, 04:48
    #39058964
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для линейной интерполяции на C++
Dimitry SibiryakovОсталось только понять назачем всё это. Обычно интерполяции совершенно не мешает удвоение
входных данных.


Вообще говоря, определитель СЛАУ не должен быть равен нулю(матрица должна быть невырожденной), в противном случае нельзя говорить о единственном решении задачи интерполяции. Если узлы будут, например, совпадать, то искомый обобщённый многочлен найден не будет.

FreeRotor, хотелось бы увидеть ваш алгоритм, и код. Я вижу вашу проблему не в том что какие-то значения попадают в интервал (ибо предварительно отсортировать массив вам ничто не мешает), а в возможном дублировании данных(впрочем данную проблему так-же можно решить на этапе предварительной обработки данных).
...
Рейтинг: 0 / 0
23.09.2015, 14:20
    #39059464
FreeRotor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для линейной интерполяции на C++
Всем СПАСИБО. Особенно помогли примеры.
И этот , кстати тоже. Почему удалили не понятно - компилируется и работает.
...
Рейтинг: 0 / 0
25.09.2015, 09:43
    #39060901
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для линейной интерполяции на C++
FreeRotorВсем СПАСИБО. Особенно помогли примеры.
И этот , кстати тоже. Почему удалили не понятно - компилируется и работает.

Странно. Тот пример вам понятен, а вот функция бинарного поиска не очень. Покажете нам что сделали(если это не тайна) ? Интересно.
...
Рейтинг: 0 / 0
26.09.2015, 19:19
    #39062037
FreeRotor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для линейной интерполяции на C++
Да все просто в общем-то, как и всегда, когда увидишь готовое решение ;).

Этот момент, конечно, был неочивиден.
Код: plaintext
1.
           double* wh = std::lower_bound(srcVectorArgs, srcVectorArgs + srcSize, new_x);


Мой код берет на вход вектора задающие аргумент и соответствующие значения функции, подгружает сетку для нахождения новых значений функции и соответственно интерполирует

Код: plaintext
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.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
#include <math.h>
#include <iostream>
#include <algorithm>
#include <stdio.h>


void linInterp(double* srcVectorArgs, double* srcVectorFuncs, int srcSize,
               double* newVectorArgs, double* newVectorFuncs, int resSize)
{
    for (int i=0;i<resSize;i++)
    {
       double new_x = newVectorArgs[i];
       int index;
       if (new_x <= srcVectorArgs[0])
           index = 0;
       else if (new_x >=srcVectorArgs[srcSize-1])
           index = srcSize-2;
       else
       { 
           double* wh = std::lower_bound(srcVectorArgs, srcVectorArgs + srcSize, new_x);
           index = wh - srcVectorArgs-1;            
       }
             
       if(new_x == srcVectorArgs[index])
       {
           newVectorFuncs[i] = srcVectorFuncs[index];
       }
       else
       {     
           double xLower = srcVectorArgs[index];
           double xHigher = srcVectorArgs[index+1];
           double yLower = srcVectorFuncs[index];
           double yHigher = srcVectorFuncs[index+1];
           double slope = (yHigher - yLower)/(xHigher - xLower);
           newVectorFuncs[i] = slope * (new_x-xLower) + yLower;

       }
    }   
}




int main()
{
    int srcSize=100;
    int resSize=400;

    double xnew[resSize];
    double ynew[resSize];

    double x[srcSize];
    double y[srcSize];

  
    char data[] = "data.txt";
    char grid_file[] = "grid.txt";
    FILE* file = fopen(data, "r");
    int j=0;
    while(!feof(file)) {
        fscanf(file, "%lf %lf", &x[j], &y[j]);
        j++;
    }
    FILE* fgrid = fopen(grid_file, "r");
    int i=0;
    while(!feof(fgrid)) {
        fscanf(fgrid, "%lf", &xnew[i]);
        i++;
    }
    for(int j=0;j<srcSize;j++){
        printf("%lf %lf\n", x[j], y[j]);
    }

   linInterp(x,y,srcSize,xnew,ynew,resSize);    
   for(int j=0;j<resSize;j++){
       printf("%lf %lf\n", xnew[j], ynew[j]);
   }

    return 0;
}
...
Рейтинг: 0 / 0
26.09.2015, 19:35
    #39062043
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для линейной интерполяции на C++
SashaMercuryСтранно. Тот пример вам понятен, а вот функция бинарного поиска не очень. Покажете нам что сделали(если это не тайна) ? Интересно.
Кое-кто тоже по началу тупил 15549279 :)
...
Рейтинг: 0 / 0
27.09.2015, 03:00
    #39062243
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция для линейной интерполяции на C++
Dima T,
я и сейчас порой долго соображаю;)
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Функция для линейной интерполяции на C++ / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]