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

Odpowiedz Nowy wątek
2018-10-19 17:28
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.

Pozostało 580 znaków

2018-10-19 18:26
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, 2018-10-19 18:30

Pozostało 580 znaków

2018-10-19 18:28
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); 
edytowany 4x, ostatnio: furious programming, 2018-10-19 18:54
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 2018-10-19 18:33
A jeszcze jedno, w internecie szczególnie obowiązuje zasada: "nie wszystko złoto co się świeci". - MarekR22 2018-10-19 18:33

Pozostało 580 znaków

2018-10-19 18:51
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/lib[...]lkit/interpolate/cubic_b.html


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22, 2018-10-19 18:59

Pozostało 580 znaków

2018-10-19 19:13
exp7
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.

Znalazl kubiczne, ale nie wiemy, czy takie chcial:-) - lion137 2018-10-19 19:22

Pozostało 580 znaków

2018-10-19 19:58
0

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


Pozostało 580 znaków

2018-10-20 09:06
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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