使用curve_fit函数调用sympy函数时出错
我在使用curve_fit函数时遇到了问题。我的任务是解决一个符号的三次方程,然后将这个解用于拟合函数。
import numpy as np
import pylab
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from sympy import *
from sympy.utilities.lambdify import lambdify
a, b, c, d, L, k1, k2, E1, E2, x, C0, E0 = symbols("a b c d L k1 k2 E1 E2 x C0 E0", real=True)
sol = solve(Eq(a*L**3 + b*L**2 + c*L + d),L)
sol1 = sol[2].subs({a: k1*k2, b: (k1 + 2*k1*k2*x), c: (1 + k1*x - k1*C0), d: -C0,})
intensity = E0*L + E1*k1*L*x/(1 + k1*L + k1*k2*L**2) \
+ E2*k1*k2*L**2*x/(1 + k1*L + k1*k2*L**2)
E0r=1000.0
C0r=1E-4
function_sym = intensity.subs(L,sol1).subs(E0, E0r).subs(C0, C0r)
funct = lambdify([E1, E2, k1, k2, x],function_sym)
x_exp = np.array([0,1E-5,2E-5,3E-5,4E-5,6E-5,8E-5,1.3E-4])
y_exp = np.array([0,0.081,0.1936,0.264,0.297,0.3567,0.396,0.452])
popt, pcov = curve_fit(funct, x_exp, y_exp, (1000, 1000, 100000, 100000))
结果出现了错误:
ValueError: array must not contain infs or NaNs
我尝试通过获取function_sym的实部和另一种定义拟合函数的方法来解决这个问题:
function_re = re(function_sym)
def fit_func(E1r, E2r, k1r, k2r, xr):
return function_re.subs(E1, E1r).subs(E2, E2r).subs(k1, k1r).subs(k2,k2r).subs(x, xr).evalf()
popt, pcov = curve_fit(fit_func, x_exp, y_exp, (1000, 1000, 100000, 100000))
结果又出现了另一个错误:
TypeError: unhashable type: 'numpy.ndarray'
1 个回答
1
curve_fit() 这个函数需要你提供一个目标函数,也就是你所说的 'funct' 或者 'fit_funct'。这个目标函数的第一个参数必须是一个包含变量的 ndarray(多维数组)。简单来说,你需要把 E1、E2、k1 和 k2 这几个变量放到一个单独的 ndarray 里。