Nie wiem jak zabrać się do przeliczania na zmiennych w czasie rzeczywistym, mam zakres wartości 0,25-63,5 które wykładniczo odpowiadają liczbą, wartość 24 = liczba 3, wartosc 48 liczba 8, 63,5 - wartosc 500, liczę na jakąś pomoc. Celem jest napisanie przelicznika wartości na odpowiednik liczby.
Nie wiem, ale nie rozumiem na jakiej podstawie mają być przypisywane wartości. Opisz trochę dokładniej problem, no i popraw błędy ortograficzne.
0,25-63,5 które wykładniczo odpowiadają liczbą, wartość 24 = liczba 3, wartosc 48 liczba 8, 63,5 - wartosc 500
No dobrze, ale jaką wartość stanowi odpowiednik dolnej granicy?
Wartość podstawowa | Po przeliczeniu |
---|---|
0/1 ???? | 0,25 |
{...} | {...} |
24 | 3 |
{...} | {...} |
48 | 8 |
{...} | {...} |
500 | 63,5 |
O takie coś chodzi? Chcesz mieć jakiś wzór do przeliczania wartości w lewej strony na te z prawej? |
Może napisz jeszcze skąd się te liczby i ich odpowiedniki biorą i gdzie je wykorzystujesz to być może łatwiej będzie coś wymyślić.
Tak , o to chodzi, granica dolnego zakresu dla 0,25 równa sie 2 aczkolwiek ta wartość nie jest zbyt dokładna, najdokładniejsze są 48 i 24, ponieważ zakres 0,25-63,5 jest to zakres ustawień Timera, a wynik częstotliwość w hz, i problemem jest przeliczanie tego.
Dla mnie to wygląda na zwykłą normalizację MIN-MAX.
X * = (X-minX) / maxX-mniX.
X* - wartość znormalizowana, X - wartość pola oryginalnego, minX - najmniejsza wartość pola X, maxX największa wartość pola X; (maxX-minX) = zakres.
wtedy np. 0.5 będzie oznaczało na 32.4 itd.
wartosc 32,5 odpowiada 4
Chodzi o to że tworzysz znormalizowane wartości dla tych liczb.
Np. jeśli zrobisz wykres tych oryginalnych wartości i tych znormalizowanych to otrzymasz taki sam wykres tylko wartości znormalizowanych.
Potem można normalizację odwrócić czyli zdenormalizować i masz wynik wartości oryginalnej.
Np. do sieci neuronowej musisz wprowadzić wartości znormalizowane i wypluje ona też wartość znormalizowaną wtedy denormalizujesz i masz rzeczywisty wynik sieci.
To podstawa analizy matematycznej / statystyka itp.
nie bardzo rozumiem, jak to przedstawić w kodzie, pewnie dlatego że matematyka nie jest moją mocną stroną, mogłbyś pokazać jakąś przykładową implementację na zmiennych?
Ja też nie wiem czy ci żle nie podpowiadam ale to tylko pomysł.
Przykład w kodzie ;)
private void normalizacjaMinMax(){
double Xn = (X3 - Xmin) / (Xmax - Xmin);
System.out.println("Wartość znormalizowana dla "+ X3 + " to: " + Xn);
}
double X1 = 8.0;
double X2 = 15.548;
double X3 = 25.0;
double Xmin = X1;
double Xmax = X3;
@damian21 - czy aby na pewno podane przez Ciebie wartości są poprawne? Gdzie masz zapisane wartości odpowiadające tym podanym? Masz do tego jakąś tabelkę? Podaj tutaj lub wklej do PasteBin.
wartośc 0,25-63,5 są to wpisy do rejestru, 2-500 jest to częstotliwość mierzona oscyloskopem.
damian21 napisał(a):
0,25-63,5 jest to zakres ustawień Timera, a wynik częstotliwość w hz
to powiedz co dokładnie przeliczasz, prawdopodobnie wzór znajdziesz w książkach i wikipedii
damian21 napisał(a)
2-500 jest to częstotliwość mierzona oscyloskopem.
Być może pomiary nie są najdokładniejsze;
Jedyne co przychodzi mi na myśl to mnożenie wartości przez stałą 0.125
:
function Calculate(const AValue: Double): Double;
begin
Result := AValue * 0.125;
end;
Wtedy wartości mniej więcej odpowiadają tym pomiarowym:
AValue [2 .. 500] | Result [0,25 .. 62,5] | Pomiar | Różnica |
---|---|---|---|
2 | 0,25 | 0,25 | 0 |
24 | 3 | 3 | 0 |
32,5 | 4,0625 | 4 | 0,0625 |
48 | 6 | 6 | 0 |
500 | 62,5 | 63,5 | -1 |
jednak dla 500 będzie to 62,5 , więc o 1 mniej niż wynika z pomiaru; Niestety odpowiednik dla 48 wychodzi 6 , a nie tak jak podałeś - 8 , co znacząco odbiega od wartości pomiarowej i tutaj nie wiem czy pomiar był niedokładny, czy po prostu mój wzór jest błędny, jednak nic innego nie przychodzi mi do głowy; |
Ciekaw jestem jak wygląda wykres pomiarów - czy układa się liniowo, czy parabolicznie, bo z podanych pomiarów wynika, że i jedno i drugie.
Wartości są dokładne do jednego miejsca po przecinku, w załączniku jest wykres , dokonałem kilku pomiarów.
Skoro już masz funkcję w Excelu to po prostu zrób interpolację i z głowy.
Coś w tym stylu
Niestety po użyciu tego wzoru w excelu dostaje jakies dziwne wartości 2.802075391
1.7068
-10.6012
-43.3967
-52.4172
72.6623
509.6668
1503.9213
3368.2508
6482.9803
11295.9348
18322.4393
28145.3188
41414.8983
44544.3988
47846.3309
51326.8692
53136.07477
A mój wykres próbowałem zinterpolować aczkolwiek nic to nie zmieniło.
Oczywiste jest, że dla Twoich danych wzór interpolacyjny będzie inny.
W Excelu to się nazywa linia trendu.