from scipy.optimize import fsolve # Messungen m1 = 1971 m2 = 1716 m3 = 1056 m4 = 2379 # Parallelschaltung zweier Widerstände def par(ra, rb): return ra * rb / (ra + rb) # Funktion, deren Nullstelle bestimmt werden soll # rs: Tupel der gesuchten Variablen r1, r2, r3 und r4 # m1, m2, m3, m4: gegebene Variablen # return: Tupel aus 4 Werten, die für eine richtige Lösung # (r1, r2, r3, r4) alle zu 0 werden def f(rs, m1, m2, m3, m4): # Zerlegung des Tupels rs in seine Bestandteile r1, r2, r3, r4 = rs # Gleichungssystem repräsentiert durch 4 Terme. Eine Lösung ist # gefunden, wenn alle 4 Terme zu 0 werden. t1 = par(r1, r2 + r3 + r4) - m1 t2 = par(r2, r1 + r3 + r4) - m2 t3 = par(r3, r1 + r2 + r4) - m3 t4 = par(r4, r1 + r2 + r3) - m4 # Der Rückgabewert der Funktion ist das aus den Ergebnissen der # 4 Terme gebildete Tupel return (t1, t2, t3, t4) # fsolve sucht iterativ eine Nullstelle von f, d.h. ein Tupel # (r1, r2, r3, r4), für das f((r1, r2, r3, r4), m1, m2, m3, m4) # das Ergebnis (0, 0, 0, 0) liefert # # Das zweite Argument von fsolve ist der Startwert für die Iteration. # (m1, m2, m3, m4) hat sich dafür als günstig erwiesen. # # Das dritte Argument (m1, m2, m3, m4) ist ein Tupel von Werten, # die als konstante Argumente an f übergeben werden. # # Die Nullstellensuche wird beendet, wenn die relative Abweichung # von r1, r2, r3, r4 zwischen zwei aufeinanderfolgenden Iterationen # höchstens xtol ist. result = fsolve(f, (m1, m2, m3, m4), (m1, m2, m3, m4), xtol=1e-10) # Ausgabe der Lösung (Liste mit den gefundenen Werten für # r1, r2, r3 und r4) print(result)