-1

假设双曲线的一般公式为 y = 1 / (a*x + b),我们提供了 100 个数据点,其中 99 个点完全符合双曲线,1 个数据点不符合(未知) ,从这些信息中,我们需要找到将由提供的正确数据点形成的双曲线的 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

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

4

1 回答 1

0

如果给定点“完全符合双曲线”,那么您的问题就很简单,并且您只需要两个数据点。

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

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

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

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


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

于 2019-03-21T10:07:52.603 回答