Ich habe hier eine Schaltung mit vier Widerständen in Ringanordnung. Ich würde gerne die Werte der Widerstände messen, ohne sie auszulöten. Ich dachte ich könnte einfach mal schnell über alle vier Widerstände den Wert messen und mit den vier Werten über den jeweiligen Ersatzwiderstand die einzelnen echten Rs berechnen. Aber jetzt wo ich die Gleichungen aufgestellt habe, scheint mir das Ganze doch nicht mehr so ganz trivial zu sein...
Von den vier Gleichungen ausgehend müsste ich jetzt nach und nach in einander einsetzen, aber das ergibt sehr schnell sehr unübersichtliche Terme höherer Ordnung...
Übersehe ich etwas, oder gibt es da leider keinen leichteren Weg, die einzelnen Widerstandswerte zu ermitteln? Auslöten würd ich aufgrund der Bauteilgröße sehr gerne vermeiden.
Da ja auch jede Widerstandsmessung eine kleine Spannung an die Widerstände anlegt, könnte man einfach eine Spannung über einen der Widerstände legen und dann an die Spannungen über den aus den anderen 3 Widerständen gebildeten "Teiler" messen. Dann hat man das Verhältnis dieser Widerstände zueinander. So kann man sich an die Bestimmung der Widerstände leicht herantasten.
Ich danke euch allen für den Input. Ich hab noch etwas versucht über die Verhältnisse zu gehen, aber im Endeffekt hab ich jetzt wirklich eine Leiterbahn durchtrennt und konnte damit alle Rs einzeln messen. Das war jetzt die schnellste Möglichkeit. Auch wenns mich etwas wurmt, das jetzt nicht geschickter gelöst zu haben...
Es wurden ja bereits sehr gute Vorschläge gemacht, wie du durch eine
geschickte Vorgehensweise bei den Messungen die anschließende Berechnung
stark vereinfachen kannst.
Aber auch mit deinen Messungen von Re[1..4] kann man zu einem Ergebnis
kommen.
Von den vier Gleichungen ausgehend müsste ich jetzt nach und nach in
einander einsetzen, aber das ergibt sehr schnell sehr unübersichtliche
Terme höherer Ordnung...
So ein nichtlineares Gleichungssystem löst man deswegen am besten
numerisch. In Python mit der Scipy-Bibliothek geht das ganz leicht:
1
from scipy.optimize import fsolve
2
3
m = ( 1971, 1716, 1056, 2379 ) # Messungen
4
5
print(fsolve(lambda r,m: (r-m)*sum(r)-r*r, m, (m,), xtol=1e-9))
Ausgabe:
1
[2700. 2200. 1200. 3900.]
Der Code funktioniert auch für Ringe aus 3, 5 oder mehr Widerständen.
In Python wollte ich mich eh schon ewig mal reinfuchsen, vielleicht nutze ich das mal als Motivation, mir das genauer anzuschauen ;)
Ich kann aber die Eingabe deiner Funktion nicht ganz nachvollziehen. Zum Teil vermutlich, weil ich die Python-Syntax noch nicht kenne.
Was bedeuten lamda und r? Wo kommt ganz generell die verwendete Funktion her?
Es wird die Nullstelle für die vier Messwerte x=1,2,3,4 gesucht:
1
print(fsolve(lambda r,m: (r-m)*sum(r)-r*r, m, (m,), xtol=1e-9))
Das Schlüsselwort "lambda" definiert eine anonyme Funktion mit den Parametern r und m (die in diesem Fall Vektoren (Liste bzw. Array) mit 4 Werten sind), die Funktion folgt auf den Doppelpunkt, das m bezeichnet den Startpunkt der Iteration (da man nichts Besseres weiß) und (m,) ist das zweite Argument für die Funktion (so ist halt die Syntax), xtol bestimmt die Genauigkeit, wann die Nullstellensuche abgebrochen wird.
Der Solver eiert dann die Zahlen durch, probiert ob es passt (im ersten Versuch natürlich noch nicht) und modifiziert die Startwerte solange, bis ein passend genaues Ergebnis herauskommt, das dann ausgegeben wird.
Das ist das ganze Hexenwerk.
Statt der anonymen Funktion könnte man auch eine benannte Funktion definieren und im Solver aufrufen:
1
def funktion(r, m):
2
return (r-m)*sum(r)-r*r
3
4
print(fsolve(lambda r,m: funktion(r, m), m, (m,), xtol=1e-9))
Statt der anonymen Funktion könnte man auch eine benannte Funktion
definieren und im Solver aufrufen:
def funktion(r, m):
return (r-m)sum(r)-rr
print(fsolve(lambda r,m: funktion(r, m), m, (m,), xtol=1e-9))
Wenn die Funktion einen Namen hat, lässt man das lambda natürlich weg
und übergibt die Funktion direkt als erstes Argument an fsolve:
1
print(fsolve(funktion, m, (m,), xtol=1e-9))
Den Lambda-Ausdruck habe ich nur verwendet, um die Anzahl der Codezeilen
zu verringern. Wenn der Funktionsrumpf kurz ist und die Funktion nur an
einer einzigen Stelle im Code verwendet wird, bietet sich das an, man
kann aber je nach Geschmack auch darauf verzichten.
Oh je, die Syntax von Python ist aber... gewöhnungsbedürftig^^
Der angehängte Code ist eine leichter nachvollziehbare und kommentierte
Version des Programms ohne Vektorarithmetik und Lambda für eine feste
Anzahl (4) von Widerständen.