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

Curve fitting of Hyperbola and finding its parameters associated

假设双曲线的通式为y = 1 / (a*x + b),我们得到100个数据点,其中99个点完全符合一条双曲线,一个数据点不符合在其中(未知),根据这些信息,我们需要找到双曲线的 a 和 b 参数的近似值,该双曲线将从提供的正确数据点形成。

我采用的方法是使用 scipy.optimize.curve_fit 方法作为 "parameters, _ = optimize.curve_fit(test, x_data ,y_data) " 我的 "test" 函数是 "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

以上解决方案将不胜感激。

如果给定点 "exactly fit the hyperbola," 并且你只需要两个数据点,你的问题就很简单了。

你的等式y = 1 / (ax + b)可以转化为

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

这是ab中的一次方程。使用两个数据点找到 x * yy 的对应值,最终得到两个变量的两个线性方程(尽管在 ab 而不是 xy)。然后求解这两个线性方程。这很容易实现自动化。这也不取决于你给定的两个点的象限。

当然,如果您给定的点仅近似于双曲线,这将不起作用。


在上次编辑中,您添加了这样的陈述:只有 99 个点适合双曲线,一个不适合。这可以通过选择 三对 点(六个不同的点)并找到通过每对点的双曲线来处理。这意味着计算三个双曲线(相当于计算 ab 的三个值)。如果这三对 ab 都以小精度一致,则非匹配点不在所选的三对点样本中,并且您有双曲线。如果其中只有两个在精度上一致,则使用该双曲线。如果没有一对双曲线一致,则出现错误,您应该提出异常。