python使用的参数太多scipy.optimize.curve_-fi

2024-06-16 14:41:50 发布

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

我试图在一个类实例方法中进行一些曲线拟合,而曲线拟合函数给了我的类实例方法太多的参数。在

代码是

class HeatData(hx.HX):
    """Class for handling data from heat exchanger experiments."""

然后是几行工作正常的方法,那么我的功能是:

^{pr2}$

曲线拟合函数调用

    def set_flow_array(self):
        """Sets experimental flow rate through heat exchanger"""
        flow = self.flow_data.flow
        pressure_drop = self.flow_data.pressure_drop
        popt, pcov = spopt.curve_fit(self.get_flow, pressure_drop, flow)
        self.exh.flow_coeff = popt
        self.exh.flow_array = ( self.exh.flow_coeff * self.exh.pressure_drop**0.5 )

给出错误

get_flow() takes exactly 2 arguments (3 given)

我可以通过在类之外定义get_flow并这样调用它来实现它:

spopt.curve_fit(get_flow, pressure_drop, flow)   

但这并不好,因为它确实需要是类中的一个方法,才能像我所希望的那样通用。如何将此工作作为类实例方法获得?在

我也希望能够通过self得到_flow,给它更多的参数,而不是曲线拟合使用的拟合参数。这可能吗?在


Tags: 实例方法selfdata参数getflowarray
3条回答

如果在HeatData类中定义get_flow,则必须将self作为第一个参数:def get_flow(self, pressure_drop, coeff):

编辑:在寻找曲线拟合的定义后,ifound that the prototype iscurve_fit(f, xdata, ydata, p0=None, sigma=None, **kw),因此第一个参数必须是可调用的,它将以第一个参数作为自变量进行调用: 尝试关闭:

def set_flow_array(self):
        """Sets experimental flow rate through heat exchanger"""
        flow = self.flow_data.flow
        pressure_drop = self.flow_data.pressure_drop
        def get_flow((pressure_drop, coeff):
           """Sets flow based on coefficient and pressure drop.""" 
           #here you can use self.what_you_need
           # you can even call a self.get_flow(pressure_drop, coeff) method :)
           flow = coeff * pressure_drop**0.5
           return flow
        popt, pcov = spopt.curve_fit(get_flow, pressure_drop, flow)
        self.exh.flow_coeff = popt
        self.exh.flow_array = ( self.exh.flow_coeff * self.exh.pressure_drop**0.5 ) 

尝试删除“自我”并拨打电话:spopt.curve_fit(get_flow, pressure_drop, flow)

不幸的是,也许曲线拟合有缺陷。曲线拟合使用inspect来确定起始值的数目,如果有额外的self,那么这个值就会被混淆或误导。在

所以我想,给一个起始值应该可以避免这个问题。但是,在这种情况下也有一个isscalar(p0),我不知道为什么,我认为最好将其报告为问题或bug:

if p0 is None or isscalar(p0):
        # determine number of parameters by inspecting the function
        import inspect
        args, varargs, varkw, defaults = inspect.getargspec(f)

编辑:避免标量作为起始值

^{pr2}$

表示如果起始值定义为[…],则只有1个参数的示例有效,例如类似于下面的示例:

mc.optimize([2])

有两个参数和给定起始值的示例可以避免inspect调用,并且一切正常:

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)

编辑:这个错误已经被修复,所以如果你有一个新版本的scipy,那么绑定方法现在可以作为曲线拟合的第一个参数传递。
Commit of bug fix submission on github

相关问题 更多 >