curve_fit:在拟合前使用x进行计算

时间:2016-01-27 13:14:55

标签: python scipy

我正在使用scipy包的curve_fit函数来拟合一些实验数据。我写了这样的目标函数:

def binding21(G0, eps1, eps2, K1, K2):

    A = K1 * K2
    B = K1 * (2 * K2 * H0 - K2 * G0 + 1)
    C = K1 * (H0 - G0) + 1
    D = G0

    roots = np.roots([A, B, C, -D])
    roots = [value for value in roots if np.isreal(value)]
    G = max(roots)

    y = (eps1 * H0 * K1 * G + eps2 * H0 * K1 * K2 * G**2) / \
        (1 + K1 * G + K1 * K2 * G**2)

    return y

G0是我的x值数组。但是,我在目标函数中使用的模型没有定义为y = f(G0),而是y = f(G = f(G0))。

在计算y之前,我需要找到G = f(G0)的根:我必须选择返回的根的最小正值,并将其分配给G。

现在,前面的代码返回:

Traceback (most recent call last):
  File "/home/djipey/Working/Data_boss/21.py", line 80, in <module>
    result = mod.fit(y, G0=x)
  File "/usr/lib/python3.5/site-packages/lmfit/model.py", line 506, in fit
    output.fit(data=data, weights=weights)
  File "/usr/lib/python3.5/site-packages/lmfit/model.py", line 710, in fit
    self.init_fit    = self.model.eval(params=self.params, **self.userkws)
  File "/usr/lib/python3.5/site-packages/lmfit/model.py", line 372, in eval
    result = self.func(**self.make_funcargs(params, kwargs))
  File "/home/djipey/Working/Data_boss/21.py", line 38, in binding21
    roots = np.roots([A, B, C, -D])
  File "/usr/lib/python3.5/site-packages/numpy/lib/polynomial.py", line 207, in roots
    p = atleast_1d(p)
  File "/usr/lib/python3.5/site-packages/numpy/core/shape_base.py", line 50, in atleast_1d
    ary = asanyarray(ary)
  File "/usr/lib/python3.5/site-packages/numpy/core/numeric.py", line 525, in asanyarray
    return array(a, dtype, copy=False, order=order, subok=True)
ValueError: setting an array element with a sequence.

因为我试图使用G0找到根,这不是单个值而是数组。

你能帮我解决这个问题吗?

编辑:

我基本上试图适应这个等式: equation http://imagizer.imageshack.com/img911/2966/9LtHnS.png

使用:

explanation http://imagizer.imageshack.com/img911/9868/zYfP1B.png

Epsilon_HG,Epsilon_HG2,K1和K2是参数。 H0是已知常数。 G是此模型中的变量。 G取决于G0,这是我给模型的“x”值。

我有几个实验数据点,其中Y = f(G0)。但我需要适合Y = f(G)。 G只能通过求解上面的三次方程来获得。

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案,其实很简单:

G = []


def binding21(G0, eps1, eps2, K1, K2):

    global G

    G = []

    for value in G0:
        A = K1 * K2
        B = K1 * (2 * K2 * H0 - K2 * value + 1)
        C = K1 * (H0 - value) + 1
        D = value

        roots = np.roots([A, B, C, -D])

        roots = [float(value) for value in roots if np.isreal(value)]

        G.append(max(roots))

    G = np.array(G)

    y = (eps1 * H0 * K1 * G + eps2 * H0 * K1 * K2 * G**2) / \
        (1 + K1 * G + K1 * K2 * G**2)

    return y

我基本上在curve_fit的每次迭代中重新计算G.但是我必须为整个列表执行此操作,我无法使用一个特定值。所以,我只是为整个列表做到了这一点:)

因为我需要G的最终值,所以我不得不使用全局变量。我知道它是邪恶的,但在那种情况下我无法找到更好的解决方案。

对于那里的化学家来说,这个片段用于拟合结合实验的滴定(模型1:2)。