Scipy.optimize.curve_fit findet optimale Parameter nicht.

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
iclickbuttons
User
Beiträge: 3
Registriert: Dienstag 22. Januar 2019, 12:57

Liebes Forum,

ich bin hier leider langsam am verzweifeln. Ich versuche seit einigen Tagen Messpunkte eines Experiments mit dem sogenannten "Carreau"-Ansatz zu fitten. Je nach Boundaries und Startparameter bekomme ich die folgende Fehlermeldung:

Code: Alles auswählen

RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 1000.
Die Daten sehen jedoch im Doppellogarithmischen Diagramm sehr gut aus (auch mit normaler Skalierung der Achsen):

Bild

Anbei der Code für das Script:

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

## Y-DATA
eta = np.array([7128.67, 6814, 6490, 6135.67, 5951.67,
        5753.67, 5350, 4929.33, 4499.33,4068.67, 3641.33,
        3225.33, 2827.33, 2451, 2104.67, 1788, 1503, 1251.33,
        1032.33, 434.199, 271.707, 134.532, 75.7034, 40.9144, 21.7112, 14.9206, 9.29772])


##X-DATA
gamma = np.array([0.1, 0.1426, 0.2034, 0.29, 0.4135, 0.5897, 0.8409, 1.199,
         1.71, 2.438, 3.477, 4.959, 7.071, 10.08, 14.38, 20.5,
         29.24, 41.7, 59.46, 135.438, 279.707, 772.93,
         1709.91, 3734.32, 8082.32, 12665.8, 22353.3])


carreaulaw = lambda x, eta_0, lam, a, n: eta_0 / (1 + (lam * x)**a)**((n-1)/a)

popt, pcov = sp.optimize.curve_fit(carreaulaw, gamma, eta, p0=[8000, 3000, 0.8, 0.1])

print(popt)

x = np.linspace(gamma.min(), gamma.max(), 500)
fig = plt.figure()
diagram = fig.add_axes([0.1, 0.1, 0.8, 0.8])
diagram.set_xlabel(r"$log\ \. \gamma_{true}\ (s^{-1})$", fontsize = 12)
diagram.set_ylabel(r"$log\ \eta_{true}\ (Pa*s)$",fontsize = 12)
#diagram.set_xscale("log")
#diagram.set_yscale("log")
diagram.plot(gamma, eta, "r*")
diagram.plot(x, carreaulaw(x, popt[0], popt[1], popt[2], popt[3]), "g-")
Ich habe bereits versucht Boundaries zu setzen:

Code: Alles auswählen

bounds = [(-np.inf, 0, 0, 0), [np.inf, np.inf, 1, 1]]   #upper np.inf or lower -np.inf means no bound
popt, pcov = curve_fit(carreaulaw, gamma, eta, p0=[8000, 3000, 0.8, 0.1], bounds=bounds)
Vielen Dank für die Hilfe,
liebe Grüße,
iclickbuttons
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Kann es sein, dass die Formel falsch ist? Zumindest sehen die, die ich durch kurzes googlen finde, leicht anders aus.
Mit der hier klappt es jedenfalls schon einmal besser:

Code: Alles auswählen

carreaulaw = lambda x, eta_0, lam, a: eta_0 / (1 + lam * x)**a
iclickbuttons
User
Beiträge: 3
Registriert: Dienstag 22. Januar 2019, 12:57

Vielen Dank für die Antwort ArtooDetoo.

Die Formel sollte eigentlich passen (ist aus der Originalliteratur - Bird-Carreau-Yasuda Formel).

Anbei ein Screenshot aus dem Buch "Polymer Rheology" (Tim A. Osswald und Natalie Rudolph):

https://prnt.sc/mao6t5
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Ich sehe da kein Bild hinter dem Link.
Benutzeravatar
__blackjack__
User
Beiträge: 14336
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das hier sollte da zu sehen sein: Bild
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
iclickbuttons
User
Beiträge: 3
Registriert: Dienstag 22. Januar 2019, 12:57

Niemand eine Idee? :/
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Hast du mal probiert, per Hand passende Parameter einzutragen und zu schauen, ob die Kurve das überhaupt abbilden kann?
Antworten