Seite 1 von 1

Scipy.optimize.curve_fit findet optimale Parameter nicht.

Verfasst: Dienstag 22. Januar 2019, 13:05
von iclickbuttons
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

Re: Scipy.optimize.curve_fit findet optimale Parameter nicht.

Verfasst: Dienstag 22. Januar 2019, 17:32
von ArtooDetoo
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

Re: Scipy.optimize.curve_fit findet optimale Parameter nicht.

Verfasst: Dienstag 22. Januar 2019, 18:17
von iclickbuttons
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

Re: Scipy.optimize.curve_fit findet optimale Parameter nicht.

Verfasst: Dienstag 22. Januar 2019, 21:53
von ArtooDetoo
Ich sehe da kein Bild hinter dem Link.

Re: Scipy.optimize.curve_fit findet optimale Parameter nicht.

Verfasst: Dienstag 22. Januar 2019, 23:52
von __blackjack__
Das hier sollte da zu sehen sein: Bild

Re: Scipy.optimize.curve_fit findet optimale Parameter nicht.

Verfasst: Donnerstag 31. Januar 2019, 12:30
von iclickbuttons
Niemand eine Idee? :/

Re: Scipy.optimize.curve_fit findet optimale Parameter nicht.

Verfasst: Donnerstag 31. Januar 2019, 12:33
von ArtooDetoo
Hast du mal probiert, per Hand passende Parameter einzutragen und zu schauen, ob die Kurve das überhaupt abbilden kann?