Aproksymacja czy Interpolacja

Aug 24, 2009 26 Replies

Mam czujnik mierz±cy pewne parametry fizyczne. Wk³adam go do cieczy, a on mi wystawia napiêcie do kilkudziesiêciu do kilkuset mV w zale¿no¶ci od zawarto¶ci roztworu.



Zale¿no¶æ napiêcia U od stê¿enia x nie jest ¿adn± znan± funkcj±. Jedyne co mam to tabelka U(x) dla 10-ciu warto¶ci x i odpowiadaj±cym im napiêciom U


100% - 70mV
90% - 150mV ...
0% - 655mV

Jak naszkicuje sobie wykres to jest to taki podwójny garb.



Chcia³bym odczytywaæ warto¶ci po¶rednie ale nie wiem co mam zrobiæ i w jaki sposób.


  1. Czy wykonywaæ interpojacjê ?
  2. Czy mo¿e aproksymowaæ tê funkcjê wielomianem i maj±c przybli¿one F(x) dopiero liczyæ po¶rednie warto¶ci?

Gdzie mogê znale¼æ kawa³ki kodu w C++ ?



Valhalla pisze:

Jeśli chcesz interpolować to i tak musisz wygładzić żeby usunąć błędy pomiarowe. Możesz to robić odcinkami krzywą np 2 stopnia i po troszku przesuwać odcinek na którym robisz aproksymację . Przy okazji generować gęstszą siatkę danych. Możesz też użyć wielomianu na aproksymację całości. Skoro są dwa garby to i jest przynajmniej jeden dołek. Czyli musisz użyć co najmniej wielomianu 4 stopnia a najlepiej wyższego. Tylko że 10 punktów pomiarowych to stanowczo za mało żeby to dokładnie policzyć. Jeśli potrzebujesz. Nie napisałeś czy to ma być wyliczane w mikrokontrolerze czy tylko chcesz sobie odczytać sam wartości pośrednie. Jeśli dla siebie to wystarczy rysunek na papierze mm i krzywiki albo arkusz i wykres z wygładzaniem linii. W przypadku procka to interpolacja gdy nie masz mocy obliczeniowej a aproksymacja gdy nie masz dużo pamięci na dokładną tabelę.

Dnia 24-08-2009 o 17:25:13 Valhalla snipped-for-privacy@lol.lol napisał(a):

Ja bym sobie próbował znaleźć jakiś wielomian który opisłaby taki przebieg jaki masz na wykresie (ale skoro na 10 wartościach masz dwa ekstema - to chyba trochę trzeba by się napracować, zeby znaleźć coś sensownego). BTW Matlab miał jakiegoś toolboxa do robienia takich rzeczy.

Ewentualnie - jeżeli otrzymana dokładność by Ci wystarczyła - aproksymował bym funkcję opisującą odpowiedź przetwornika w odcinkach. Tzn. od jednego punktu gdzie znasz wartość do drugiego punktu "sąsiedniego" wyznaczałbym prostą (albo funkcję wyższego rzędu) i z równania prostej (albo funkcji wyższego rzędu) wyznaczałbym wartość argumentu. Po przekroczeniu przez odpowiedz przetwornika dziedziny funkcji aproksymującej użyłbym kolejnej funkcji która opisuje kolejny "fragment".

Kawałki kodu na mnożenie stałych przez zmienną ... jedną zmienną?

Obliczenia w PC-cie. Dane lec± z urz±dzenia po RS-ie. Producent nie da³ nic innego jak tabelkê

11-tu warto¶ci i maksymalny b³±d pomiarowy +/- dla 10-40 stopni celsiusza. Sondy s± powtarzalne bardzo ale nijak nie opisane krzyw±.

Mocy obliczeniowej dosyæ.

filug pisze:

Dwa garby. Między nimi musi być dolinka czyli trzy ekstrema. No i nie wiadomo co ma być poza skrajnymi punktami. Do tego przydałyby się punkty przegięcia ale to nie na takiej ilości punktów :)

BTW Matlab miał jakiegoś toolboxa do robienia takich rzeczy.

Pewnie octave ma też

Może sam chce pisać kod do robienia aproksymacji na wielomianach. Stanowczo odradzałbym. Najlepiej poszukać gotowego solvera a w kod wpisać tylko znalezioną funkcję.

Valhalla pisze:

Interpolacja nie bardzo wyjdzie w miejscach gdzie jest większa krzywizna lub duża odległość między punktami. Musiałbyś najpierw zagęścić punkty tak jak wspominałem ale to trochę roboty. Najprościej dać wielomian począwszy od 4 stopnia i patrzeć jak leży na punktach wzorcowych. Podnosisz stopień aż przestaje być widoczna poprawa w układaniu się na punktach (możesz liczyć odchylenie standardowe w tych punktach) lub zaczynają się dziwne osobliwości (dodatkowe ekstrema) pomiędzy punktami lub na końcach zakresu. Pewnie zatrzymasz się koło 7 stopnia.

Mario pisze:

Miało być 6. 7 to już dość wysoki.

Mario pisze:

Na początek można zacząć od funkcji polyfit.

Dnia 24-08-2009 o 18:40:12 Mario snipped-for-privacy@poczta.onet.pl> napisał(a):

Racja trzy ekstema :) Mój błąd, a raczej przejęzyczenie :)

Pewnie tak, ale ocatve niestety nie miałem w ręce więc nie będę zmyślać.

Chyba nie skoro ma czujnik i potrzebuje czymś opisać jego odpowiedź.

U¿ytkownik "Valhalla" snipped-for-privacy@lol.lol napisa³ w wiadomo¶ci news:h6ubb8$1oc$ snipped-for-privacy@opal.futuro.pl...

Czysto matematycznie: interpolacja jest funkcja dokladna we wszystkich punktach zmierzonych. Co dla N punktow wymaga wielomianu stopnia N-1, czy ogolnie funkcji o N wspolczynnikach. Jesli to bedzie interpolacja wielomianem, to cecha uboczna sa zazwyczaj duze oscylacje na skrajnych obszarach.

Aproksymacja nie musi sie dokladnie zgadzac w punktach pomiarowych i efektem jest wielomian stopnia znacznie nizszego.

W zyciowych przypadkach zawsze stosujemy aproksymacje - dzieki temu bledy pomiarowe sie usredniaja a nie poteguja. No chyba ze sie decydujemy na interpolacje w przedzialach [funkcje sklejane].

Do aproksymacji trzeba zalozyc postac funkcji - na podstawie teorii, literatury, intuicji wzrokowej, a moze wynikow dopasowania. Jak juz wspominasz roztwor - to moze byc jakas funkcja wykladnicza czy logarytmiczna - kiepsko aproksymowana wielomianami.

Ha, ha, a pare grubych ksiazek z teoria nie ³aska najpierw przeczytac ? :-P

J.

filug pisze:

No ale nie ma funkcji kalibracyjnej. Wrzuca punkty do solvera i ma funkcję.

U¿ytkownik "J.F." <jfox snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:h6uhvc$p9h$ snipped-for-privacy@news.onet.pl...

Przecie¿ to rozwi±zania tego problemu wystarczy znajomo¶æ wielomianu Newtona...

Pozdrowienia. Krzysztof z Tychów.

Do _dobrego_ rozwiazania trzeba troche wiecej - np szczescia przy zapuszczaniu programow bez pojecia co one robia :-)

J.

No w³a¶nie. Je¶li kto¶ jest w temacie to mo¿e wie czym zamienic 11 punktów pomiarowych na aproksymowan± funkcjê ? :-) To by by³o ¶wietnym rozwi±zaniem. Maj±c fynkcjê reszta to jedna linia kodu :-)

Valhalla schrieb:

niestety nie zawsze. Na przykład jest sobie taka funkcja do oceny zakłóceń wprowadzanych do sieci przez urządzenia energetyczne (flicker). Jest to funkcja opisana w normach, bazująca na subjektywnych odczuciach pewnej populacji. Niestety implementacja tej funkcji "z marszu" wymaga przynajmniej 128 bitowej dokładności, a najlepiej jeszcze większej, bo przy mniej dokładnych obliczeniach idzie się kurwić. W twoim przypadku próbowałbym przybliżyć funkcję kawałkami wielomianowymi 3 stopnia stosując sklejanie gładkie (spline). Jak masz Matlab lub Octave, to możesz spróbować fitting, jak już ktoś tutaj poradził, ale jak będziesz miał wzór funkcyjny, to radzę sprawdzić czułość na dyskretne współczynniki, bo może się okazać, że zmiana wartości któregoś współczynnika o 1LSB zmienia wartość funkcji kilkakrotnie.

Waldek

Użytkownik "Mario" snipped-for-privacy@poczta.onet.pl> napisał w wiadomości news:h6ufq6$ikj$ snipped-for-privacy@news.onet.pl... filug pisze:

Oj tam... W Excelu jest coś, co się nazywa linia trendu (wielomianowa). Radzi sobie calkiem niezle.

Maciek

U¿ytkownik "Valhalla" snipped-for-privacy@lol.lol napisa³ w wiadomo¶ci news:h6ubb8$1oc$ snipped-for-privacy@opal.futuro.pl...

A podaj moze te wszystkie wartosci.

J.

U¿ytkownik "Valhalla" snipped-for-privacy@lol.lol napisa³ w wiadomo¶ci news:h6v1af$c7c$ snipped-for-privacy@opal.futuro.pl...

W³a¶nie Ci napisa³em co zrobiæ! U¿yæ wielomianu interpolacyjnego Newtona. Dla 11 punktów wyjdzie funkcja 10 stopnia. To mo¿na liczyæ nawet rêcznie.

Pozdrowienia. Krzysztof z Tychów.

Krzysztof Tabaczyñski schrieb:

a robiłeś to często na komputerze? Ręcznie się da, ale komputerowo nie za bardzo. Wielomiany stopni wyższych niż 5-6 są dość upierdliwe. Musisz liczyć w double precision, a jeszcze wyżej w double double albo jeszcze gorzej. Funkcje spline są lepsze i dokładniejsze.

Waldek

U¿ytkownik "Waldemar Krzok" snipped-for-privacy@zedat.fu-berlin.de> napisa³ w wiadomo¶ci news: snipped-for-privacy@mid.uni-berlin.de...

Kilkadziesi±t razy zamienia³em wielopozycyjn± tabelkê na funkcjê za pomoc± pakietu Borlanda (chyba "Solver"?). Jeszcze w latach 80-tych, na AT. Oczywi¶cie raz najpierw zrobi³em to rêcznie... :-)

Pozdrowienia. Krzysztof z Tychów.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required