Forums Neueste Beiträge
 

Numerische Lösung Gleichungssystem

15/03/2009 - 10:25 von cwalter | Report spam
Hallo,

Ich arbeite gerade an der Entwicklung eines Sensors und verwendete
zuerst ein lineares Model zur Beschreibung des physikalischen
Zusammenhanges zwischen Spannung und dem logratihmischen Messwert.
D.h.

E = E0 + Alpha + TK(T)*Beta*S0*log(c) mit

E = Potential [mV]
Alpha = Offsetspannung [mV]
TK(T) = Temperaturkoeffizient
Beta = Kalibrationskoeffizient Steigung
log(c) = Logartihmus der Konzentration
S0 = Steigung 59mV/Dekade

Ziel ist die Lösung nach log(c) was in obigem Fall einfach ist und die
Bestimmung der Koeffizienten Alpha und Beta wenn ein Istwert/Sollwert
bzw. ein Paar gegeben ist (Kalibration). D.h.

log(c) = ( E-E0-Alpha )/( TK(T)*Beta*S0 )

Nun ist es leider so, dass die Steigung S0 keine Funktion ist, sondern
S0 ein S0(log(c)) ist. S0 ist hierbei eine Kennlinie die ich
aufgenommen habe. Eine gute Funktion welche diese fittet habe ich
nicht gefunden. S0(log(c)) schaut z.B. in der Art aus:

log(c) | S0(log(c))
-4 | 40 mV/Dekade
-3 | 45 mV/Dekade
-2 | 50 mV/Dekade
-1,0,1 | 59mV/Dekade
2 | 50mV /Dekade

Ich berechne nun log(c) iterativ indem ich das wie folgt löse. Ich
schaue was mein Rohsignal E ist und starte mit meinem eigenen Wert von
E bei 0 und gehe Schrittweise in die Richtung von E. D.h. wàre
E=-190mV starte ich mit E=0,-10,-20,-30, wobei ich immer ein Delta
(E) verwende. (Den Offset und E0 kann man sich schenken für diese
Überlegung weil trivial).

Delta(log(c)) = Delta(E)/(TK(T)*Beta*S0(log(c)_Alt)
log(c)_Alt = log(c)_Alt + Delta(log(c))

Das mache ich solange bis ich bei meinem gemessen E bin.

Nun meine Fragen:

* Geht das irgendwie effizienter, da ich das auf einem Sensor mit
beschrànkter Leistung implementiere? Es funktioniert so, ist aber
nicht sehr schön.
* Ein anderes Problem ist, dass der Kalibrationskoeffizient Beta dann
schwerer zu berechnen ist.
* Das andere unschöne ist, dass es ungenau ist durch das aufsummieren
weil die Intervalschritte ja nicht unendlich klein sind. Integrieren
wie für sowas richtig kann ich ja auch nicht, weil das was ich
integrieren will ja von dem abhàngt was im Integral steckt.

Vielen Dank,
Christian Walter
 

Lesen sie die antworten

#1 Andreas Weishaupt
25/03/2009 - 17:48 | Warnen spam
Hallo Christian!

E = E0 + Alpha + TK(T)*Beta*S0*log(c) mit

E = Potential [mV]
Alpha = Offsetspannung [mV]
TK(T) = Temperaturkoeffizient
Beta = Kalibrationskoeffizient Steigung
log(c) = Logartihmus der Konzentration
S0 = Steigung 59mV/Dekade



Sonderbare Bezeichnungen, würde eher U oder V für Potential nehmen (E
ist für ein elektrisches Feld normalerweise). V0 oder Vdc für
Offsetspannung. E0 = Versorgungsspannung? Würde ich Vdd/Vcc nennen.

* Geht das irgendwie effizienter, da ich das auf einem Sensor mit
beschrànkter Leistung implementiere? Es funktioniert so, ist aber
nicht sehr schön.



Du hast eine nich-tlineare Gleichung, die du lösen musst (und nicht ein
Gleichungssytem, so wie ich das verstehe):

E = E0 + Alpha + TK(T)*Beta*S0*log(c)

Vor allem gilt S0 = S0(log(c)). So wie ich das verstehe, sind E0, Alpha,
Beta, TK mehr oder weniger gegebene oder ermittelte Konstanten. Machen
wir der Übersicht halber:

v = K1 + K2*f(x)*x

Was du suchst ist x bei gegebenen v, so wie ich das verstehe.

In dem Fall, kannst du g_v(x) := v - K1 - K2*f(x)*x = 0 setzen und die
Nullstellen von g_v(x) ermitteln. Siehe:
http://de.wikipedia.org/wiki/Newton-Verfahren.
Kannst Du rekursiv machen: x(n+1) := x(n) - g_v(x(n))/g_v'(x(n)).
Konvergiert sehr schnell, vor allem falls du geringe
Toleranz-Anforderungen hast. Siehe auch GNU Scientific Library (GSL):
http://www.gnu.org/software/gsl/man...nding.html
für eine effiziente C implementation (z.B. für auf einem Mikrokontroller).

Noch effizienter und einfacher - deine Sensibilitàtskurve scheint sehr
diskretisiert zu sein -, kannst Du sogar in Assembler, und bei sehr
geringer Auflösung von x mittels table lookup implementierbar:

Einfach f(x)*x für alle möglichen x ausrechnen (denn Du hast eine
vordefinierte Messgrösse mit unterer und oberer Grenze, begrenzte
Auflösung). Dann z.B. mittels bi-section method (oder eben Table-Lookup
für diskrete x) schauen für welches x du den Wert (v-K1)/K2 hast.

Hoffe ich konnte dir weiterhelfen.

Gruss,
Andreas.

Ähnliche fragen