Przyporządkowywanie najbliższej wartości

Tematy związane z tworzeniem dużych aplikacji. Zaganiednia dotyczące architektury oraz zasad tworzenia optymalnych rozwiązań.
4B
Posty: 11
Rejestracja: 07 paź 2012 15:45
Wersja środowiska: LabVIEW 2009

Przyporządkowywanie najbliższej wartości

Post autor: 4B »

Witam Wszystkich,

poszukuję pomocy przy takim zagadnieniu: Muszę wykreślić wykres, gdzie na osi x będzie liczba obrotów wału (omega) z pomiarów. No i mam te pomiary - jest tego 999 punktów. Natomiast na osi y będzie zależność u=2(Mg-2Mr)/F*d. Na razie można przyjąć, że wszystkie wartości, oprócz Mr są w tym wzorze stałymi, a Mr jest zależna od omegi (jest to zależność, którą normalnie odczytuje się z wykresu na kartce, a ja mam ten wykres zdigitalizowany do normalnego pliku .txt). Tylko tu pojawia się szkopuł, bo tych punktów jest 576.

Więc co LabVIEW powinien zrobić (przynajmniej taki mam pomysł), to dla każdego punktu z pliku obrotów:

0,311464586
0,3111492
0,31083389
0,310466124
0,310150978
0,309783403

Znaleźć najbliższy mu (o najbliższej wartości) punkt z pierwsze kolumny pliku z wykresem:

3.09062 0.331071
3.09915 0.333173
3.11197 0.333196
3.12049 0.335298
3.14613 0.335344

(czyli w przypadku punktu 0,311464586 jak i 0,3111492 z pierwszego pliku, to będzie punkt 3.11197 z drugiego pliku) i następnie wstawić odpowiadająca mu wartość z drugiej kolumny, w tym przypadku 0.333196 do równania u=2(Mg-2Mr)/F*d jako Mr i na tej podstawie wykreślić wykres, w którym każda z 999 wartości na osi x, ma swojego y - wyliczonego z równania na u.

Czy zna ktoś jakiś sprawdzony sposób na to?
dzojstik22
Posty: 103
Rejestracja: 17 gru 2011 21:33
Wersja środowiska: LabVIEW 2011

Re: Przyporządkowywanie najbliższej wartości

Post autor: dzojstik22 »

"(czyli w przypadku punktu 0,311464586 jak i 0,3111492 z pierwszego pliku, to będzie punkt 3.11197 z drugiego pliku) i następnie wstawić odpowiadająca mu wartość z drugiej kolumny, w tym przypadku 0.333196 do równania u=2(Mg-2Mr)/F*d jako Mr i na tej podstawie wykreślić wykres, w którym każda z 999 wartości na osi x, ma swojego y - wyliczonego z równania na u."

Możesz to dokładnie opisać- raz u Ciebie punkt ma dwie współrzędne a raz jedną.
4B
Posty: 11
Rejestracja: 07 paź 2012 15:45
Wersja środowiska: LabVIEW 2009

Re: Przyporządkowywanie najbliższej wartości

Post autor: 4B »

Hmm, no dobra - no to przykładowa sekwencja (prawdopodobnie pętli for) :

punkt: 0,311464586 (tak jak pisałem, jest to jeden z 999 punktów na osi x)

-program szuka najbliższego mu odpowiednika w drugim pliku, w pierwszej kolumnie: 3.11197 i do wzoru u=2(Mg-2Mr)/F*d wstawia, za Mr, liczbę z drugiej kolumny: 0.333196
u=2(Mg-2*0.333196)/F*d -> pozostałe, to stałe i tak otrzymujemy wartość y dla tego konkretnie punktu (czyli 0,311464586).

dalej -> punkt 0,3111492

-w tym przypadku, po przeszukaniu pierwszej kolumny drugiego pliku - najbliższą wartością znowu jest 3.11197, czyli znowu wzór na u wygląda tak:
u=2(Mg-2*0.333196)/F*d -> i w efekcie otrzymujemy dla kolejnego punktu z osi x, kolejną wartość y - tyle, że akurat taką samą jak wcześniej. I tak dalej, aż każdy z 999 punktów będzie miał wartość y.

Jednocześnie, zdaje sobie sprawę, że takie dwie (takie same) wartości y obok siebie stworzą "schodek" na wykresie który tak ogólnie ma wyjść płynnie opadający.. ale może nie będzie tak widać. A jak będzie widać, to będę myślał jak z 999 punktów wybierać np. co drugi i mieć tylko 499 punktów na osi x. Ale to na razie jest inna bajka.
wiget
Posty: 13
Rejestracja: 31 paź 2009 23:21
Wersja środowiska: LabVIEW 2012
Lokalizacja: Kraków
Kontakt:

Przyporządkowywanie najbliższej wartości

Post autor: wiget »

Witaj, jeśli masz tylko 999 próbek to najszybciej będzie Ci chyba zrobić pętlę for w pętli for - przeszukując (odejmując jedną liczbę od drugiej i wyciągając z różnicy moduł) - w ten sposób faktycznie będzie dużo operacji - ale szybko zaimplementujesz i uzyskasz wynik - moduły oczywiście porównujesz i wybierasz ten indeks z tabeli 2, który ma najmniejszą wartość modułu różnicy. Jak już masz nr indeksu - to wybierasz wartość z kolumny 2 i wstawiasz do wzoru. Brak bodu z braku czasu - jeśi będizesz miał problem to wrzuć pliki wejściowe to postaramy się szybko coś napisać żeby pomóc - ale więcej nauczysz się próbując samemu:)

Powodzenia.
Obrazek
Extensa - certyfikowani programiści LabVIEW z Krakowa.
PiDi
Posty: 641
Rejestracja: 31 gru 2010 01:36
Wersja środowiska: LabVIEW 2017
Lokalizacja: Katowice

Re: Przyporządkowywanie najbliższej wartości

Post autor: PiDi »

Nie wiem, czy kumam, ale to chyba wystarczy:
szukajnajblizszego.png
szukajnajblizszego.png (20.27 KiB) Przejrzano 7820 razy

Ed. A, nie doczytałem postu wigeta, który chce to samo... No to właśnie tak jest, ale bez pętli.
ObrazekObrazekObrazekObrazek
Awatar użytkownika
trooper
Posty: 22
Rejestracja: 22 paź 2012 17:44
Wersja środowiska: LabVIEW 2012
Kontakt:

Re: Przyporządkowywanie najbliższej wartości

Post autor: trooper »

Witam,

Widze ze kolega 4B się stara ... radziłbym jednak mniej chaotycznie na przyszłość. Pytanie dałoby się napisać w jednej linii + rysunek. Jeżeli spędziłbyś nieco więcej czasu na pożądnym napisaniu pytania, myślę, że sam zakodował byś rozwiązanie.
Problem nie jest trudny - nawet jak go źle zrozumiałem, to załączony poniżej przykład poprawisz dość szybko. Założyłem też, że pomyliłeś się w jednej z kolumn i wpisałeś wartości 10 razy większe. Nie musisz brać tych samych wartości - zawsze mozesz interpolować.

Ważna uwaga dot. funkcji interpolującej - funkcja nie moze byc nierosnąca (patrz help do funkcji)- więc jeżeli jest - to pokombinuj. Musisz też dołożyć czytanie z pliku.
Zaznaczę też, że łatwiej się poprawia kod niż pisze od nowa. Jeżeli załączyłbyś fragment czytający z pliku oraz plik byłoby dużo łatwiej
tylko propozycja
tylko propozycja
Pozdrawiam i powodzenia w kodowaniu ... mozesz dać znać czy zadziałało ;)
dzojstik22
Posty: 103
Rejestracja: 17 gru 2011 21:33
Wersja środowiska: LabVIEW 2011

Re: Przyporządkowywanie najbliższej wartości

Post autor: dzojstik22 »

Jeszcze taka uwaga na przyszłość- raz piszesz przecinki a raz kropki między cyframi. Nie wiem jak jest w różnych wersjach labview ale w mojej(2011) nie mogę wpisać kropek. Działania muszą być napisane z przecinkami.
ODPOWIEDZ