>>21378063 Dziękuję bardzo za odpowiedź.
Udało mi się rozwiązać problem z uchybem 0.00x% obliczyć przepływ powietrza w [m³/h]. Już taką wartość można wyświetlać użytkownikowi, a nie jakieś magiczne liczby typu 4095.
Napisałem funkcję przy pomocy modułu użytkownika, która oblicza:
Przepływ = K * pierwiastek(z różnicy ciśnień),
gdzie K to współczynnik wentylatora z dokumentacji.
Obliczenia:
Dla symulacji przecinka obie części równania są mnożone przez 10 000:
100000 * Przepływ = K * pierwiastek(z różnicy ciśnień) * 10000.
Algorytm poszukiwania pierwiastka oraz obliczenia przepływu w [m³/h]:
Zakres czujnika różnicy ciśnień:
Przykład: znamy zakres 1000 Pa–4095. Pierwiastek(1000) = 31,6227 (przyda się później).
Skalowanie wartości:
Najpierw wartość 4095 skaluję do większego zakresu – 65535 – aby zmniejszyć uchyb.
Maksymalna wartość wynosi 65535, ponieważ później tę wartości trzeba podnieść do kwadratu, aby znaleźć najbliższy mniejszy kwadrat.
Cykl iteracyjny:
Operacje arytmetyczne są wykonywane w cyklu, zakładając, że X₁ = 1, a S to liczba, której szukamy pierwiastka.
Wzory:
Xₙ₊₁ = (Xₙ + S / Xₙ) / 2
Warunek sprawdzania:
Xₙ² - S ≤ 0
Jeśli warunek nie jest spełniony, powtarzamy cykl, aż zostanie spełniony.
Przykład:
Poszukujemy pierwiastka z 146.
X₁ = (1 + 146 / 1) / 2 = 73.
73² - 146 = 5227 (nie spełnia warunku).
X₂ = (73 + 146 / 73) / 2 = 37.
37² - 146 = 1223 (dalej nie).
X₃ = (37 + 146 / 37) / 2 = 20.
20² - 146 = 254 (dalej nie).
X₄ = (20 + 146 / 20) / 2 = 12.
12² - 146 = 0 (warunek spełniony).
Wynik: najbliższy mniejszy kwadrat to 12² = 144.
Ulepszenie precyzji:
Znamy kolejny kwadrat większy od 146: 13² = 169.
Sprawdzamy różnice:
169 - 146 = 23
146 - 144 = 2
Mniejszy kwadrat (144) jest bliższy.
Ostateczny etap:
Aby zmniejszyć uchyb obliczeniowy, obie strony równania są mnożone przez 10 000:
10000 * pierwiastek(S) = (12 * 10000 + 146 * 10000 / 12) / 2.
Skalowanie wyniku:
Pierwiastek z zakresu 65535 → 1000 Pa:
255,9980 * 10000 → 31,6227 * 10000.
Ostatecznie mogę obliczyć przepływ w [m³/h]:
Przepływ = K * 10000 * pierwiastek(S)./10000
Obliczając w taki sposób wynik jest dość precyzyjny