Passende hyperbolische und harmonische Funktionen mit Kurve

Ich habe ein Problem mit der Kurvenfahrtfunktion. Hier habe ich einen Code mit zwei Funktionen zu arbeiten. Die erste ist eine hyperbolische Funktion. Die zweite ist die gleiche aber mit einem Parameter = 1. Mein Problem ist, dass das Ergebnis, um die erste Funktion mit Kurve passen funktioniert gut, aber mit dem zweiten doesn't. Ich habe ein kommerzielles Programm, das korrekte Lösungen für beide erzeugt. So ist es möglich, eine Lösung für die zweite Funktion zu finden (ein besonderer Fall des ersten, wie ich oben erwähnt habe) Gibt es jemanden, der mir eine Vorstellung davon geben könnte, was ich falsch mache? Vielen Dank !

Hier ist der Code zu laufen:

def hypRegress(ptp,pir): xData = np.arange(len(ptp)) yData = pir xData = np.array(xData, dtype=float) yData = np.array(yData, dtype= float) def funcHyp(x, qi, exp, di): return qi*(1+exp*di*x)**(-1/exp) def errfuncHyp(p): return funcHyp(xData, p[0], p[1], p[2]) - yData #print(xData.min(), xData.max()) #print(yData.min(), yData.max()) trialX = np.linspace(xData[0], xData[-1], 1000) # Fit an hyperbolic popt, pcov = optimize.curve_fit(funcHyp, xData, yData) print 'popt' #print(popt) yHYP = funcHyp(trialX, *popt) #optimization # initial values p1, success = optimize.leastsq(errfuncHyp, popt,maxfev=10000) print p1 aaaa = funcHyp(trialX, *p1) plt.figure() plt.plot(xData, yData, 'r+', label='Data', marker='o') plt.plot(trialX, yHYP, 'r-',ls='--', label="Hyp Fit") plt.plot(trialX, aaaa, 'y', label = 'Optimized') plt.legend() plt.show(block=False) return p1 def harRegress(ptp,pir): xData = np.arange(len(ptp)) yData = pir xData = np.array(xData, dtype=float) yData = np.array(yData, dtype=float) def funcHar(x, qi, di): return qi*(1+di*x)**(-1) def errfuncHar(p): return funcHar(xData, p[0], p[1]) - yData #print(xData.min(), xData.max()) #print(yData.min(), yData.max()) trialX = np.linspace(xData[0], xData[-1], 1000) # Fit an harmonic popt, pcov = optimize.curve_fit(funcHar, xData, yData) print 'popt' print(popt) yHAR = funcHar(trialX, *popt) #optimization # initial values p1, success = optimize.leastsq(errfuncHar, popt,maxfev=1000) print p1 aaaa = funcHar(trialX, *p1) plt.figure() plt.plot(xData, yData, 'r+', label='Data', marker='o') plt.plot(trialX, yHAR, 'r-',ls='--', label="Har Fit") plt.plot(trialX, aaaa, 'y', label = 'Optimized') plt.legend() plt.show(block=False) return p1 ptp = ([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]) pir = ([150,85,90,50,45,60,60,40,40,30,28,30,38,30,26]) hypRegress(ptp,pir) harRegress(ptp,pir) input('pause') 

  • Python-Pandas-Distanz-Matrix mit Hilfe von jaccard-Ähnlichkeit
  • Orthogonale Regression passend in scipy kleinste Quadrate Methode
  • Struktur der Eingänge zur Scipy-Funktion minimieren
  • Python lösen Verzögerungsdifferentialgleichungen bedingt
  • Vergleich von Fließkommazahlen mit numpy und scipy
  • Wie kann man die Umkehrung der normalen kumulativen Verteilungsfunktion in Python berechnen?
  • Multiplizieren von Spaltenelementen mit spärlicher Matrix
  • SyntaxError mit scipy.weave.inline
  • One Solution collect form web for “Passende hyperbolische und harmonische Funktionen mit Kurve”

    Es ist ein klassisches Problem. Der curve_fit Algorithmus beginnt von einer anfänglichen Vermutung für die zu optimierenden Argumente, die, wenn nicht geliefert, einfach alle sind.

    Das heißt, wenn du anrufst

     popt, pcov = optimize.curve_fit(funcHar, xData, yData) 

    Der erste Versuch für die Anpassungsroutine wird annehmen

     funcHar(xData, qi=1, di=1) 

    Wenn Sie keine der anderen Optionen angegeben haben, ist die Passung schlecht, wie die großen Abweichungen der Parameterschätzungen belegen (überprüfen Sie die Diagonale von pcov und vergleichen Sie sie mit den tatsächlichen Werten, die in popt ).

    In vielen Fällen wird die Situation durch eine intelligente Vermutung gelöst. Aus deinem HAR-Modell sammle ich, dass die Werte um x==0 gleich groß sind wie qi . So könntest du eine anfängliche Vermutung von p0 = (pir[0], 1) liefern, was bereits zu einer befriedigenden Lösung führt. Du kannst es auch mit anrufen

     popt, pcov = optimize.curve_fit(funcHar, ptp, pir, p0=(0, 1)) 

    Was zu dem gleichen Ergebnis führt. Also das Problem ist nur, dass der Algorithmus ein lokales Minimum findet.

    Eine Alternative wäre es gewesen, einen anderen factor zu liefern, der "Parameter, der den Anfangsschritt bestimmt":

     popt, pcov = optimize.curve_fit(funcHar, ptp, pir, p0=(1, 1), factor=1) 

    In diesem Fall ergibt sich auch bei der (Standard-) Anfangs-Vermutung von p0=(1,1) die gleiche resultierende Passung.

    Denken Sie daran: Anpassung ist eine Kunst, keine Wissenschaft. Oftmals, durch die Analyse des Modells, das du passen möchtest, könntest du schon eine gute erste Vermutung liefern.

    Ich kann nicht für den im kommerziellen Programm verwendeten Algorithmus sprechen. Wenn es Open-Source (unwahrscheinlich) ist, könnte man einen Blick sehen, was sie tun

    Python ist die beste Programmiersprache der Welt.