0

令 (cos(x)exp(x)) 为任何简单函数。我想将 sympy 函数更改为函数 (a*cos(x) exp(x)+b) 并将参数 (a,b) 拟合到数据中。

如果有直接的方法,我现在不适合 sympy 函数。pip 包 symfit 0.2.3 不工作 ( https://symfit.readthedocs.io/en/stable/tutorial.html ) - 尝试导入部分包时出错。

可以使用 sympy 函数 lambdify 创建一个像这样的 numpy 函数

from sympy import symbols
from sympy import cos, exp
from sympy import lambdify
x      = symbols('x')
python_formula = lambdify(x,cos(x)*exp(x), 'numpy')

我现在将我的参数相乘

def function(x,a,b,python_formula):
    return a*python_formula(x) +b 

不幸的是,如果我使用 scipy.optimize.curve_fit 之类的

optimizedParameters, pcov = opt.curve_fit(function, x_data, y_data);

它会将我函数中的“python_formula”参数作为可优化参数并会崩溃。我也没有找到方法来指定 fit 参数(https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curve_fit.html)。

如果您有一个想法,如何通常适合 sympy 函数或修复代码的方法,我会很感激听到它。

4

1 回答 1

2

您需要使用函数工厂,以便在定义时绑定lambdified函数,而不是在获取脚本时绑定

from sympy import symbols
from sympy import cos, exp
from sympy import lambdify
from scipy.optimize import curve_fit

### ### ### ### ### ### ### ### ### ### ### ### ### ### ###
def make_f2opt(lambdified):
    return lambda x, a, b: a*lambdified(x)+b
### ### ### ### ### ### ### ### ### ### ### ### ### ### ###

x      = symbols('x')
python_formula = lambdify(x,cos(x)*exp(x), 'numpy')

### ### ### ### ### ### ### ### ### ### ### ### ### ### ###
f2opt = make_f2opt(python_formula)
### ### ### ### ### ### ### ### ### ### ### ### ### ### ###

parameter, covariance = curve_fit(f2opt, x_data, y_data)
于 2019-07-04T19:44:41.983 回答