2016-11-16 3 views
-2

Ich möchte dies als y = ax passen. Der Code funktioniert jedoch nicht. Kann mir jemand helfen?Fit y = Axt in Python

def func(): 
    return a * x 

F1 = [0.55, 0.45, 0.50, 0.65, 0.75, 0.80] 
r1 = [18.2, 18.4, 18.8, 19.5, 20.0, 20.2] 

plt.plot(F1, r1) 
popt = curve_fit(func, r1, F) # I supose it only returns one value 
plt.plot(r1, popt * r1, 'g--') 

Der Fehler ist:

ValueError: Unable to determine number of fit parameters. 
+0

Es gibt so viele Fehler in diesem Code, dass es schwierig ist, überhaupt damit zu beginnen. Was ist F1, was ist r1? Welche davon ist eine, und welche sollte x sein? Genau was sind die Datenpunkte, die Sie kurven können? – SilverSlash

+0

Die Kurvenanpassung gibt keinen Wert zurück. Hast du überprüft, wie Popt aussieht? Du solltest F1 benutzen und nicht F – Moritz

Antwort

0

Etwas Ähnliches. Führen Sie den Code aus, um zu sehen, wie die Ergebnisse von curve_fit aussehen, und folgen Sie der Logik sorgfältig.

import matplotlib.pyplot as plt 
from scipy.optimize import curve_fit as curve_fit 

def f(x,a): 
    return a*x 

F1 = [ 0.55, 0.45, 0.50, 0.65, 0.75, 0.80 ] 
r1 = [ 18.2, 18.4, 18.8, 19.5, 20.0, 20.2 ] 

result = curve_fit(f, r1, F1) 
print (result) 

print ('F1 = %s * r1' % result[0][0]) 

plt.plot(r1, F1, 'b.') 

p = [ result[0][0] * _ for _ in r1 ] 
plt.plot(r1, p, 'g--') 
plt.show() 
1

Es gibt eine andere Art und Weise linear Anfälle tun (einen einfacheren Weg, IMO), die numpy.polyfit verwendet. Die Dokumentation finden Sie unter here.

import numpy as np 
import matplotlib.pyplot as plt 

F1 = [ 0.55, 0.45, 0.50, 0.65, 0.75, 0.80 ] 
r1 = [ 18.2, 18.4, 18.8, 19.5, 20.0, 20.2 ] 

z = np.polyfit(F1, r1, 1) # The 1 at the end denotes a linear fit. 
          # Change to 2,3 etc. for polynomial fitting 
zf = np.poly1d(z) 

plt.plot(F1,r1,'o') # plot data points 
plt.plot(F1, zf(F1)) # plot the fit 

plt.show() 

Dies erzeugt das zeigt dieses Diagramm:

enter image description here

+0

Ich kenne diese Art der Anpassung bereits. Und ich will sie nicht. Sie sind wie y = ax + b und ich möchte eine wie y = ax. Danke trotzdem – MatMorPau22

0

Das Hauptproblem mit Ihrem Code ist, dass Sie keine Eingaben Ihre Anpassungsfunktion haben. func weiß nicht, was a und x sind, kann also nicht a*x zurückgeben.

Auch dann, wenn curve_fit nicht nur popt zurück, sondern auch pcov, so dass Sie, dass in den zurückgegebenen Werten

Hier ist eine feste Version des Codes fangen müssen:

import matplotlib.pyplot as plt 
from scipy.optimize import curve_fit 

# func needs x and a as inputs 
def func(x, a): 
    return a*x 

F1=[0.55,0.45,0.50,0.65,0.75,0.80] 
r1=[18.2,18.4,18.8,19.5,20.0,20.2] 

plt.plot(r1,F1, 'bo') 
popt, pcov = curve_fit(func, r1, F1) 
plt.plot(r1,popt*r1,'g--') 
plt.show() 

enter image description here

Hinweis: Der Grund, warum die Anpassung nicht groß ist, ist, dass Ihre Linie durch den Ursprung gehen muss. Sie können eine bessere Anpassung mit a*x+b bekommen, aber das ist nicht, was Sie gefragt haben, wie zu tun ist.