双曲线的曲线拟合并找到与之相关的参数

时间:2019-03-21 05:42:31

标签: python python-3.x numpy curve-fitting best-fit-curve

假设双曲线的一般公式为y = 1 /(a * x + b),我们将获得100个数据点,其中99个点完全适合双曲线,而一个数据点不适合(未知),我们需要从此信息中找到将由所提供的正确数据点形成的双曲线的a和b参数的近似值。

我采用的方法是使用scipy.optimize.curve_fit方法作为“参数,_ = optimize.curve_fit(test,x_data,y_data)” 我的“测试”函数是“ def test(x,a,b):return 1 /(a * x + b)”,使用此方法可以为我提供完美的解决方案,因为我的数据点都在第一象限,但是如果数据是分布在一个以上的象限中,则此方法失败,并且我得到了错误的a和b值。

代码:

import numpy as np 
from scipy import optimize

x_data = np.linspace(-5,1, num=99)
y_data = 1 / (5 * x_data + 4) # value of original value of a = 5 & b = 4 
np.random.seed(0)

# adding wrong point at 36th position
x_data = np.insert(x_data, 36 , 7)
y_data = np.insert(y_data, 36, 5)  

def test(x, a, b):
    return 1 / (a*x + b)

parameters, _ = optimize.curve_fit(test, x_data ,y_data)
[a,b] = parameters

a = 146.83956808191303
b = 148.78257639384725
# which is too wrong

上述解决方案一定会受到赞赏。

1 个答案:

答案 0 :(得分:0)

如果给定的点“完全适合双曲线”,那么您的问题就很容易了,而您只需要两个数据点即可。

您的方程y = 1 / (ax + b)可以转换为

(x*y) * a + (y) * b = 1

这是ab中的线性方程。使用两个数据点查找x * yy的对应值,最后得到两个变量为两个线性方程式(尽管在ab中而不是{{ 1}}和x)。然后求解这两个线性方程。这可以很容易地实现自动化。这也不取决于两个给定点的象限。

当然,如果给定的点仅近似双曲线,则此方法无效。


在上一次编辑中,您添加了以下语句:只有99个点适合双曲线,而另一个不适合。这可以通过选择三个点对(六个不同的点)并找到穿过每个点对的双曲线来解决。这意味着计算三个双曲线(等效地,计算ya的三个值)。如果这三对ba都以较低的精度达成一致,则不匹配的点不在三对点的所选样本中,您就拥有了双曲线。如果其中只有两个在精度范围内一致,请使用该双曲线。如果没有一对双曲线同意,则说明犯了一些错误,您应该提出一个例外。