我正在使用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只能通过求解上面的三次方程来获得。
答案 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)。