13.2 Nichtlineare Ausgleichsprobleme
Ein nichtlineares Ausgleichsproblem liegt vor, wenn die Parameter einer Funktion z. B. als höhere Potenzen oder als Exponenten in Exponentialfunktionen vorkommen. Nichtlineare Ausgleichsprobleme sind in der Regel nur mit einem sehr hohen numerischen Aufwand lösbar. Deshalb werden hier nur solche Probleme behandelt, die sich durch Logarithmieren linearisieren lassen.
13.2.1 Exponentialfunktion
Bei der exponentiellen Ausgleichsrechnung geht es darum, die Koeffizienten a und b der Exponentialfunktion

zu bestimmen. Der Koeffizient b hat eine besondere Bedeutung für die Beschreibung von Wachstumsprozessen. Er wird deshalb auch als Wachstumsrate bezeichnet. Dieses Ausgleichsproblem ist nichtlinear, weil der Parameter b als Faktor in einer Potenz vorkommt.
Um dieses nichtlineare Problem zu lösen, wird die nichtlineare e-Funktion durch Logarithmieren linearisiert:

Es entsteht eine Geradengleichung mit der Steigung b und dem Achsenabschnitt y0 = ln a. Nach der Lösung des linearen Gleichungssystems wird das Logarithmieren wieder rückgängig gemacht:

Tabelle 13.6 enthält Messwerte, von denen vermutet wird, dass sie einem exponentiellen Wachstumsgesetz gehorchen.
xi |
1 |
2 |
3 |
4 |
5 |
yi |
1 |
3 |
7 |
9 |
21 |
Tabelle 13.6 Messwerte für einen exponentiellen Ausgleich
Es sollen der Koeffizient a und die Wachstumsrate b bestimmt werden, um den zu erwartenden weiteren Verlauf des Wachstums voraussagen zu können.
Listing 13.7 zeigt, wie diese Aufgabe gelöst werden kann. Die Ausgleichskurve wird auch als Funktionsplot zusammen mit den diskreten Messwerten dargestellt.
01 #07_plot_exp_ausgleich.py
02 import numpy as np
03 from numpy.linalg import inv
04 import matplotlib.pyplot as plt
05 xi=np.array([1,2,3,4,5])
06 yi=np.array([1,3,7,9,21])
07 ln_y=np.log(yi)
08 n=len(xi)
09 A=np.array([xi,np.ones(n)]).T
10 y=np.array([xi*ln_y,ln_y])
11 L=inv(A.T@A)@A.T@ln_y
12 a,b=np.exp(L[1]),L[0]
13 print("a=%2.3f b=%2.3f" %(a,b))
14 xa=np.linspace(0,np.max(xi),500)
15 ya=a*np.exp(b*xa)
16 fig, ax = plt.subplots()
17 ax.set(xlabel="x",ylabel="y",title=r"$y=ae^{bx}$")
18 ax.plot(xi,yi,'r+')
19 ax.plot(xa,ya,'b')
20 plt.show()
Listing 13.7 Berechnung der Parameter für exponentielles Wachstum
Ausgabe
a=0.607 b=0.719
Abbildung 13.5 Ausgleichskurve für exponentielles Wachstum
Analyse
In Zeile 07 werden die y-Werte logarithmiert. In Zeile 11 löst die NumPy-Funktion inv(A.T@A)@A.T@ln_y das linearisierte Gleichungssystem. Das Ergebnis wird in die Objektvariable L als array gespeichert.
In Zeile 12 macht die Anweisung a,b=np.exp(L[1]),L[0] das Logarithmieren wieder rückgängig.
13.2.2 Potenzfunktion
Bei der potenzartigen Ausgleichsrechnung geht es darum, für die Funktion

die Parameter a und b zu bestimmen.
Durch Logarithmieren mit

kann die Gleichung linearisiert werden. Der Achsenabschnitt y0 = ln a und die Steigung b der linearen Funktion werden wie üblich durch Lösen des linearen Gleichungssystems bestimmt. Anschließend wird die logarithmische Transformation wieder rückgängig gemacht und man erhält:

Die Messwerte aus Tabelle 13.7 zeigen einen nichtlinearen Zusammenhang.
xi |
1 |
2 |
3 |
4 |
5 |
yi |
2 |
5 |
10 |
16,5 |
23,8 |
Tabelle 13.7 Wertetabelle für einen potenzartigen Ausgleich
Listing 13.8 berechnet aus den Messwerten der Tabelle 13.7 die Parameter a und b für die Parabel y = a ∙ xb.
01 #08_plot_potenzfunktion.py
02 import numpy as np
03 from numpy.linalg import inv
04 import matplotlib.pyplot as plt
05 xi=np.array([1,2,3,4,5])
06 yi=np.array([2,5,10,16.5,23.8])
07 ln_x=np.log(xi)
08 ln_y=np.log(yi)
09 n=len(xi)
10 A=np.array([ln_x, np.ones(n)]).T
11 y=np.array([ln_x*ln_y,ln_y])
12 L=inv(A.T@A)@A.T@ln_y
13 a,b=np.exp(L[1]),L[0]
14 print("a=%2.3f b=%2.3f" %(a,b))
15 xa=np.linspace(0,np.max(xi),500)
16 ya=a*xa**b
17 fig, ax = plt.subplots()
18 ax.set(xlabel="x",ylabel="y",title=r"$y=ax^{b}$")
19 ax.plot(xi,yi,'r+')
20 ax.plot(xa,ya,'b')
21 plt.show()
Listing 13.8 Berechnung der Koeffizienten für einen potenzartigen Ausgleich
Ausgabe
a=1.880 b=1.550
Abbildung 13.6 Ausgleichskurve für einen potenzartigen Ausgleich
Analyse
In den Zeilen 07 und 08 werden die x- und y-Werte logarithmiert. In Zeile 13 wird das Logarithmieren wieder rückgängig gemacht. Die Ausgleichskurve des potenzartigen Anstiegs steigt nicht so stark an wie bei der exponentiellen Ausgleichskurve.