双曲线的曲线拟合及其相关参数的求取

2024-04-25 08:16:01 发布

您现在位置:Python中文网/ 问答频道 /正文

假设双曲线的通式为y=1/(a*x+b),我们得到了100个数据点,其中99个点正好拟合了一条双曲线,有一个数据点不适合它(未知),我们需要从这些信息中找出由正确的数据点组成的双曲线的a和b参数的近似值提供的。在

我采取的方法是scipy.optimize.curve U拟合方法作为“参数”优化曲线拟合(测试,x\U数据,y\U数据)” 我的“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

如能解决上述问题,我们将不胜感激。在


Tags: 数据方法testimportdata参数returnvalue
1条回答
网友
1楼 · 发布于 2024-04-25 08:16:01

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

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

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

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

当然,如果给定点只近似于双曲线,这是行不通的。在


在上一次编辑中,您添加了这样一个语句:只有99个点适合双曲线,一个不适合。这可以通过选择三对点(六个不同点)的来处理,并找到穿过每对点的双曲线。这意味着要计算三个双曲线(相当于计算a和{}的三个值)。如果这三对a和{}都以很小的精度一致,那么非匹配点不在三对点的选定样本中,你就得到了双曲线。如果其中只有两个在精度范围内一致,则使用双曲线。若并没有一对双曲线一致,那个么就犯了一些错误,您应该提出一个例外。在

相关问题 更多 >