Interpolacja za pomocą spline, 1000+ punktów.

0

Witam,
Chciałbym dokonać interpolacji punktów.
Znalazłem, że mogę tego dokonać za pomocą spline.
https://kluge.in-chemnitz.de/opensource/spline/
Tutaj wszystko ładnie działa, lecz gdy dodam jeden taki punkt:

X[0]=0.1; X[1]=0.4; X[2]=1.2; X[3]=1.8; X[4]=5;X[5]=0.1;

To program wywala błąd z pamięcią, a gdy dodam X[5]=6, to działa, czyli ta biblioteka liczy dla uszeregowanych punktów.
Jak mogę policzyć interpolację wykresu na podstawie 1000 różnych punktów? Nie mogę posortować moich danych, bo stracą one sens.

0

Jak masz tablicę o rozmiarze 5 std::vector<double> X(5) i użyjesz na niej indeksu 5, który wykracza poza zakres tablic, to wtedy masz "Undefined Behavior".
Czyli program może i ma prawo się zakończyć crashem, ale nie ma takiego obowiązku.
W C++ "Undefined Behavior" służy temu, że kompilator ma generować kod, który jest szybki, ale za toi nie będzie sprawdzał czy np użycie vector/array jest poprawne.
W Java/C# tymczasem masz wyraźnie napisane w standardzie, że w takim wypadku zawsze musi być rzucony wyjątek (czyli zawsze musi być wykonana dodatkowa czynność sprawdzająca, czy indeks się mieści w zakresie tablicy).

0

Oczywiście powiększam wielkość wektora jak coś dodaję.

Edit:
Po dodaniu elementu kod wygląda tak:

std::vector<double> X(6), Y(6);
   X[0]=0.1; X[1]=0.4; X[2]=1.2; X[3]=1.8; X[4]=2.0,X[5]=0.5;
   Y[0]=0.1; Y[1]=0.7; Y[2]=0.6; Y[3]=1.1; Y[4]=0.9,Y[5]=0.5; 

   tk::spline s;
   s.set_points(X,Y); 
1

https://wandbox.org/permlink/zDr1iYZTpfuwEKkN
Trzeba czytać co ci mówi konsola:

prog.exe: spline.h void {anonymous}::set_points(const std::vector<double>&, const std::vector<double>&, bool): Assertion `m_x[i]<m_x[i+1]' failed.

Czyli punkty muszą być posortowane rosnąco względu na x.
Napisałem ci przecież: w internecie szczególnie obowiązuje zasada: "nie wszystko złoto co się świeci"
Korzystasz ze strony tworzonej przez kogoś, kto w programowaniu nie jest orłem (żeby było jasne tragedii nie ma, ale zdecydowanie można znaleźć coś bardziej godnego polecania).

Radzę poszukać książki "Numerical Recipes is C" lub pokrewnej.
Albo popatrzeć na boost https://www.boost.org/doc/libs/1_65_0/libs/math/doc/html/math_toolkit/interpolate/cubic_b.html

1
pwop napisał(a):

Witam,
Chciałbym dokonać interpolacji punktów.
Znalazłem, że mogę tego dokonać za pomocą spline.
https://kluge.in-chemnitz.de/opensource/spline/
Tutaj wszystko ładnie działa, lecz gdy dodam jeden taki punkt:

X[0]=0.1; X[1]=0.4; X[2]=1.2; X[3]=1.8; X[4]=5;X[5]=0.1;

To program wywala błąd z pamięcią, a gdy dodam X[5]=6, to działa, czyli ta biblioteka liczy dla uszeregowanych punktów.
Jak mogę policzyć interpolację wykresu na podstawie 1000 różnych punktów? Nie mogę posortować moich danych, bo stracą one sens.

Kubiczne znaczy 3-go rzędu, co wymaga 4 punktów minimum, i ewentualnie dalszych 3n, bo pierwszy jest tu brany jako ostatni z poprzedniej czwórki.

0

A nie wystarczy Ci interpolacja liniowa: https://en.wikipedia.org/wiki/Linear_interpolation ?
Jest dość łatwa do zaimplementowania.

1

Po poprawieniu kolejności punktów, program się nie crashuje (za poprawność nie dałbym głowy)
https://wandbox.org/permlink/AQHqxKJJz9IKONCS

1 użytkowników online, w tym zalogowanych: 0, gości: 1