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

Interpolacja za pomocą spline, 1000+ punktów.
PW
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:50
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:

Kopiuj
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.

MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 3 godziny
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).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
PW
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:50
0

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

Edit:
Po dodaniu elementu kod wygląda tak:

Kopiuj
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); 
edytowany 4x, ostatnio: flowCRANE
MarekR22
A gdzie to napisałeś? W ogóle co to za zadawanie pytania, o błąd w kodzie, którego nie pokazujesz. Dałeś jedynie linka do innego kodu, od którego rozpocząłeś modyfikacje.
MarekR22
A jeszcze jedno, w internecie szczególnie obowiązuje zasada: "nie wszystko złoto co się świeci".
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 3 godziny
1

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

prog.exe: spline.h:294: void {anonymous}::tk::spline::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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22
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:

Kopiuj
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.

lion137
Znalazl kubiczne, ale nie wiemy, czy takie chcial:-)
lion137
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 godzin
  • Postów:4946
0

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


MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 3 godziny
1

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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.