2016-07-06 159 views
1

我正在尋找一種方法,使用Python將 parametric equations適合於一組數據點。如何擬合參數方程到Python中的數據點

作爲一個簡單的例子,給定的是下面的一組數據點:

import numpy as np 
x_data = np.array([1, 2, 3, 4, 5]) 
y_data = np.array([2, 0, 3, 7, 13]) 

使用t作爲參數時,我想以適應下列參數方程的數據點,

t = np.arange(0, 5, 0.1) 
x = a1*t + b1 
y = a2*t**2 + b2*t + c2 

也就是說,讓Python找到係數a1,,a2,b2,c2的值,該值適合(x,y)最佳t o數據點(x_data, y_data)

請注意,上面的y(t)x(t)函數僅用作參數方程的示例。我想要適合我的數據的實際功能要複雜得多,並且在這些功能中,將y作爲x的函數來表達並不是微不足道的。

幫助將不勝感激 - 謝謝!

+0

我曾嘗試使用'scipy.optimize.curve_fit'。問題是'scipy.optimize.curve_fit'需要(據我所知)'y'是'x'的一個函數。 在我的問題中,我有一個參數方程,其中'y'和'x'是't'的函數。 –

回答

0

由於xy之間的關係是二次方程,因此您可以使用np.polyfit來獲取係數。 根據你的方程,你xy關係是:

y = a2*((x-b1)/a1)**2 + b2*((x-b1)/a1) + c2

使用polyfit,我們得到

y_data = np.array([2, 0, 3, 7, 13]) 
x_data = np.array([1, 2, 3, 4, 5]) 
np.polyfit(x_data,y_data,2) 
[p2,p1,p0] = list(array([ 1.21428571, -4.38571429, 4.8  ])) 

a1, b1, a2, b2, c2值可以通過求解下列數學式

獲得p2 = a2/a1**2

p1 = -2b1*a2/a1**2 + b2/a1

p0 = a2*b1**2/a1**2 -b2*b1/a1 + c2

+0

非常感謝您的努力。然而,在我的實際問題中,找到'x'和'y'之間的關係並不是一件容易的方法,我想將一個參數方程擬合到我的數據點。我在這裏提供的'x'和'y'函數只是一個簡單的例子 - 對不起,如果不明確。 –

+0

那麼,假設你知道數組「t」的值是什麼,下面的答案是正確的。 –

2

您可以使用polyfit,但請注意使T的長度必須數據點的長度

import numpy as np 

tt = np.linspace(0, 5, len(x_data)) 

x_params = np.polyfit(tt, x_data, 1) 
y_params = np.polyfit(tt, y_data, 2) 

更改第三個參數,你認爲適合的匹配度你的數據。

要獲得功能,您可以使用

y = np.poly1d(y_params) 

t = np.arange(0, 5, 0.1) 

plot(t, y(t)) 
plot(tt, y_data, 'o')