用轴心点 Python 拟合曲线

Fitting a curve with a pivot point Python

我有下面的图,我想用 2 行来拟合它。使用 python 我设法适合上半部分:

def func(x,a,b):
    x=np.array(x)
    return a*(x**b)
popt,pcov=curve_fit(func,up_x,up_y)

而且我想用另一条线来拟合下部,但是我希望这条线穿过红色星星的点,所以我可以有一个连续的功能。所以我的问题是如何通过给出函数必须通过的点来使用 curve_fit,但让直线的斜率由 python 计算? (或任何其他 python 能够做到这一点的软件包)

您的模型在 log-space 中可能的逐步参数化类似于:

(x>q)*((x-q)*a)+(x<q)*((x-q)*c)+b

其中 q 是扭结的位置,ac 是两个部分的斜率,b 是全局 y 偏移。由于模型具有不连续性,基于梯度的最小化器可能不是找到最佳拟合的最佳选择。尽管如此,我还是尝试了 scipy.optimize.leastsqscipy.odr 并取得了不错的效果。

你可以看看piecewise and pwlf。下面是一个使用分段的例子,它可以自动适应多个段。

from piecewise.regressor import piecewise
import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12, 13, 14, 15,16,17,18], dtype=float)
y = np.array([5, 7, 9, 11, 13, 15, 28.92, 42.81, 56.7, 70.59, 84.47, 98.36, 112.25, 126.14, 140.03,120,112,110])

model = piecewise(x, y)

评估“模型”以获得以下输出:

FittedModel with segments:
* FittedSegment(start_t=1.0, end_t=7.0, coeffs=(2.9999999999999996, 2.0000000000000004))
* FittedSegment(start_t=7.0, end_t=16.0, coeffs=(-68.2972222222222, 13.888333333333332))
* FittedSegment(start_t=16.0, end_t=18.0, coeffs=(198.99999999999997, -5.000000000000001))