2016-07-06 109 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') 
相关问题