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

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

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


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

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

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

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


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