Python 设置numpy曲线拟合的可能参数

Python 设置numpy曲线拟合的可能参数,python,numpy,curve-fitting,Python,Numpy,Curve Fitting,我想使用curve_fit函数在python中拟合数据。为此,我使用基本函数 def a(x): return x*x def b(x): return x*x*x 并将它们组合成多个功能: def fit_func(x, n1, n2, n3): return n1*a(x)+n2*b(x)+n3*a(x) 现在我想知道是否有一种方法可以编写这样一个函数: def fit_multi_func(x, n1, b1, n2, b2, n3, b3): tmp

我想使用curve_fit函数在python中拟合数据。为此,我使用基本函数

def a(x):
    return x*x

def b(x):
    return x*x*x
并将它们组合成多个功能:

def fit_func(x, n1, n2, n3):
    return n1*a(x)+n2*b(x)+n3*a(x)
现在我想知道是否有一种方法可以编写这样一个函数:

def fit_multi_func(x, n1, b1, n2, b2, n3, b3):
    tmp = 0
    if(b1 == 1):
        tmp += n1*a(x)
    else:
        tmp += n1*b(x)
    if(b2 == 1):
        tmp += n2*a(x)
    else:
        tmp += n2*b(x)
    if(b3 == 1):
        tmp += n3*a(x)
    else:
        tmp += n3*b(x)

我告诉curve_fit它可以将b1、b2和b3设置为1或0。当然,另一种可能性是为ax和bx的每个组合创建单独的函数,但如果我不仅有三个参数和两个函数,而且还有更多,那么这会很快发生。或者还有其他更简单的方法吗?

如上所述,您的数据中没有足够的信息来解决您感兴趣的所有参数。考虑一下你有

的简单情况。
n1*a(x) + n2*a(x)
假设输入为n1,n2=1,1。那么一个同样有效的输出是n1,n2=0,2或n1,n2=-1000000,1000002或沿n1+n2=2线的无限多个精确解中的任何其他


这被称为退化模型,最好的解决方法可能是将问题重新表示为,例如,fx=n1*ax+n2*bx,并求解n1和n2。它不会以您想要的形式为您提供解决方案,但您想要的形式有一个无限的等价解决方案空间,任何解算器都无法满足您的要求。

您的意思是,除了系数ni之外,还要拟合bi=0或1?或者你想在拟合之前设置bi,只浮动那些bi=1的ni?我想要的是:我想给curve_fit一个由几个子函数组成的函数。这些子函数可以交换,即可以是ax或bx,但curve_fit应该决定要在拟合函数中使用哪些子函数。我不确定curve_fit是否能为您做到这一点,即约束b为1或0。但是,您通常不会期望曲线的最佳拟合包含所有函数所有bi=1吗?根据我的代码,如果所有b值都为零,那么函数应该由n1*bx+n2*bx+n3*bx组成,如果所有b值都是包含混合结果的函数,那么函数应该由n1*ax+n2*ax+n3*ax组成。因此我不理解你的评论。问题是我的函数不像上面显示的那么简单,我有一个高斯函数和一个洛伦兹函数,它们不能像你的例子中那样互换。因此,我一直在寻找一个解决方案,由解算器决定是使用a还是b。我的意见与函数无关。无论fx是什么,n1*fx+n2*fx+n3*fx都不会有唯一的解决方案。