<p>不幸的是,也许曲线拟合有缺陷。曲线拟合使用inspect来确定起始值的数目,如果有额外的<code>self</code>,那么这个值就会被混淆或误导。在</p>
<p>所以我想,给一个起始值应该可以避免这个问题。但是,在这种情况下也有一个isscalar(p0),我不知道为什么,我认为最好将其报告为问题或bug:</p>
<pre><code>if p0 is None or isscalar(p0):
# determine number of parameters by inspecting the function
import inspect
args, varargs, varkw, defaults = inspect.getargspec(f)
</code></pre>
<p>编辑:避免标量作为起始值</p>
^{pr2}$
<p>表示如果起始值定义为[…],则只有1个参数的示例有效,例如类似于下面的示例:</p>
<pre><code>mc.optimize([2])
</code></pre>
<p>有两个参数和给定起始值的示例可以避免inspect调用,并且一切正常:</p>
<pre><code>import numpy as np
from scipy.optimize import curve_fit
class MyClass(object):
def get_flow(self, pressure_drop, coeff, coeff2):
"""Sets flow based on coefficient and pressure drop."""
flow = coeff * pressure_drop**0.5 + coeff2
return flow
def optimize(self, start_value=None):
coeff = 1
pressure_drop = np.arange(20.)
flow = coeff * pressure_drop**0.5 + np.random.randn(20)
return curve_fit(self.get_flow, pressure_drop, flow, p0=start_value)
mc = MyClass()
print mc.optimize([2,1])
import inspect
args, varargs, varkw, defaults = inspect.getargspec(mc.get_flow)
print args, len(args)
</code></pre>
<p>编辑:这个错误已经被修复,所以如果你有一个新版本的scipy,那么绑定方法现在可以作为曲线拟合的第一个参数传递。<br/>
<a href="https://github.com/scipy/scipy/commit/2fdf5ce" rel="nofollow">Commit of bug fix submission on github</a></p>