估计参数值使用优化.curve.fi

2024-06-10 19:54:45 发布

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

我试图估算非线性方程的参数:

y(x1, x2) = x1 / A + Bx1 + Cx2 

使用this question答案中概述的方法,但是没有找到关于如何将多个自变量适当地传递给曲线拟合函数的文档。在

具体来说,我试图根据植物的密度(x1)和竞争对手的密度(x2)来估算植物生物量(y)。关于植物密度和植物生物量之间的关系,我有三个指数方程(形式为y=a[1-exp(-b*x1)]),三种竞争密度的参数值不同:

^{pr2}$

因此,我想按照以下思路编写代码:

def model_func(self, x_vals, A, B, C):
    return x_vals[0] / (A + B * x_vals[0] + C * x_vals[1])

def fit_nonlinear(self, d, y):
    opt_parms, parm_cov = sp.optimize.curve_fit(self.model_func, [x1, x2], y, p0 = (0.2, 0.004, 0.007), maxfev=10000)
    A, B, C = opt_parms
    return A, B, C

但是,我没有找到任何文档来说明如何格式化参数y(传递给fit_nonlinear)来捕捉x值的二维性质(the documentation for curve_fit状态y应该是一个N长度的序列)。我试图用curve_fit实现吗?在


Tags: 文档self参数modeldeffit植物密度
1条回答
网友
1楼 · 发布于 2024-06-10 19:54:45

根据您上面的评论,您需要考虑使用矩阵的平面版本。如果从X1和X2矩阵中取同一个元素,则这对值具有相应的y值。这里有一个最小的例子

import numpy as np
import scipy as sp
import scipy.optimize

x1 = np.linspace(-1, 1)
x2 = np.linspace(-1, 1)
X1, X2 = np.meshgrid(x1, x2)

def func(X, A, B, C):
    X1, X2 = X
    return X1 / (A + B * X1 + C * X2)

# generate some noisy points corresponding to a set of parameter values
p_ref = [0.15, 0.001, 0.05]
Yref = func([X1, X2], *p_ref)
std = Yref.std()
Y = Yref + np.random.normal(scale=0.1 * std, size=Yref.shape)

# fit a curve to the noisy points
p0 = (0.2, 0.004, 0.007)
p, cov = sp.optimize.curve_fit(func, [X1.flat, X2.flat], Y.flat, p0=p0)

# if the parameters from the fit are close to the ones used 
# to generate the noisy points, we succeeded
print p_ref
print p

相关问题 更多 >