簡體   English   中英

使用scipy python中的curve_fit函數

[英]using curve_fit function from scipy python

我很困惑這個功能應該如何工作。 我試圖擬合最適合xdata和ydata數據集的一行。 這段代碼會產生錯誤,但我不明白curve_fit函數應該如何工作,或者我是否使用了正確的術語來表達我想做的事情。 在圖表上繪制的xdata和ydata會產生彎曲的圖案,然后上升,然后下降。 任何幫助非常感謝。

#define xdata dnd ydata 
xdata = np.array([-2,-1.64,-1.33,-0.7,0,0.45,1.2,1.64,2.32,2.9])
ydata = np.array([0.699369,0.700462,0.695354,1.03905,1.97389,2.41143,1.91091,0.919576,-0.730975,-
1.42001]) 



# get the curve fit funtion 
from scipy.optimize import curve_fit
def func(xdata, p1, p2):
    return p1*np.cos(p2*xdata) + p2*np.sin(p1*xdata)


popt, pcov = curve_fit(func, xdata, ydata)


#plot code for data points 
plot.plot(xdata,ydata,"bo",label="Xdata and Ydata")
plot.plot(popt,pcov,"r--",label="Curve of Best Fit")
plot.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plot.show()

這當前產生的直線不是最適合數據的曲線。 我試圖盡可能地鏡像數據模式,目前我無處接近。

你錯過了什么:

  1. 正如我在評論中所說,你需要np.cosnp.sin 原因是因為xdataydata(10,)形狀的numpy數組。 因此Python無法識別,它需要(10,1)
  2. 您需要為數據定義一個linspace ,在下面的示例中稱為xfine

這是一個有效的例子:

import numpy as np
import matplotlib.pyplot as qt
from scipy.optimize import curve_fit

#define xdata dnd ydata 
xdata = np.array([-2,-1.64,-1.33,-0.7,0,0.45,1.2,1.64,2.32,2.9])
ydata = np.array([0.699369,0.700462,0.695354,1.03905,1.97389,2.41143,1.91091,0.919576,-0.730975,-
1.42001]) 

def func(xdata, p1, p2):
    return p1*np.cos(p2*xdata) + p2*np.sin(p1*xdata)

xfine = np.linspace(xdata.min(), xdata.max(), 100)

popt, pcov = curve_fit(func, xdata, ydata)

plt.plot(xdata, ydata, '.');
plt.plot(xfine, func(xfine, popt[0], popt[1]),'r-')

在此輸入圖像描述

您需要使用numpy.cos而不是math.cos來處理向量:

def func(xdata, p1, p2):
    return p1*np.cos(p2*xdata) + p2*np.sin(p1*xdata)

你需要生成這樣的擬合曲線:

xfit = np.linspace(xdata[0], xdata[-1], 100)
yfit = func(xfit, *popt)
plt.plot(xdata, ydata)
plt.plot(xfit, yfit)
plt.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM