Symfit调用sf.Ei触发NameError,求指数积分符号函数解决方案
问题解决:Symfit中指数积分Ei的使用及代码修正
核心问题原因
Symfit本身未将指数积分Ei纳入自身命名空间,直接调用sf.Ei会触发名称错误。由于Symfit基于Sympy构建,直接使用Sympy的Ei即可实现符号化的指数积分计算。
具体修正步骤
- 导入Sympy的Ei函数:在导入部分添加
from sympy import Ei - 替换
sf.Ei为Ei:所有原本写sf.Ei的地方,直接改成Ei - 修正语法错误:删除代码中多余的闭括号,将
return语句缩进(否则会触发语法错误)
修正后的完整代码
import numpy as np import scipy.optimize from scipy.special import expi import symfit as sf from sympy import Ei # 新增导入 # 假设data1、ydata3、xdata1、xdata3是已定义的数据集 y1 = np.array(data1) y3 = np.array(ydata3) x1 = np.array(xdata1) x3 = np.array(xdata3) t1 = 50 # AOM 1st OFF Time t2 = 100 # AOM 2nd ON Time t3 = 150 # AOM 2nd OFF Time t4 = 450 def mod1(data, a_decay, b_decay, constant, on1_a_amplitude, on1_b_amplitude, ARE_A, ARE_B): first_term_a = Ei(-data/a_decay) second_term_a = Ei(-data*(1+ARE_A*a_decay)/a_decay) first_term_b = Ei(-data/b_decay) second_term_b = Ei(-data*(1+ARE_B*b_decay)/b_decay) return constant + on1_a_amplitude*(first_term_a - second_term_a + sf.log(1+ARE_A*a_decay)) + on1_b_amplitude*(first_term_b - second_term_b + sf.log(1+ARE_B*b_decay)) def mod2(data, a_decay, b_decay, constant, on2_a_amplitude, on2_b_amplitude, ARE_A, ARE_B): first_term_a = Ei((t2-t1-data)/a_decay) - Ei((t2-data)/a_decay) second_term_a = Ei((t2-data)*(1+ARE_A*a_decay)/a_decay) - Ei((t2-t1-data)*(1+ARE_A*a_decay)/a_decay) third_term_a = Ei((t2-data)/a_decay) - Ei((t2-data)*(1+ARE_A*a_decay)/a_decay) + sf.log(ARE_A*a_decay) first_term_b = Ei((t2-t1-data)/b_decay) - Ei((t2-data)/b_decay) second_term_b = Ei((t2-data)*(1+ARE_B*b_decay)/b_decay) - Ei((t2-t1-data)*(1+ARE_B*b_decay)/a_decay) third_term_b = Ei((t2-data)/b_decay) - Ei((t2-data)*(1+ARE_B*b_decay)/b_decay) + sf.log(ARE_B*b_decay) return constant + on2_a_amplitude*(sf.exp((t1-t2)/a_decay)*(first_term_a+second_term_a)+third_term_a) + on2_b_amplitude*(sf.exp((t1-t2)/b_decay)*(first_term_b+second_term_b)+third_term_b) x_1, x_3, y_1, y_3 = sf.variables('x_1, x_3, y_1, y_3') a_dec = sf.Parameter(value=64.32, min=0.0, max=100) b_dec = sf.Parameter(value=53.88, min=0.0, max=100) con = sf.Parameter(value=2.911E-4, min=0.0, max=1) off1_a_amp = sf.Parameter(value=0.015, min=0.0, max=1) off1_b_amp = sf.Parameter(value=0.015, min=0.0, max=1) off2_a_amp = sf.Parameter(value=0.015, min=0.0, max=1) off2_b_amp = sf.Parameter(value=0.015, min=0.0, max=1) AR_A = sf.Parameter(value=0.032, min=0.0, max=1) AR_B = sf.Parameter(value=0.1, min=0.0, max=1) model = sf.Model({ y_1: mod1(x_1, a_dec, b_dec, con, off1_a_amp, off1_b_amp, AR_A, AR_B), y_3: mod2(x_3, a_dec, b_dec, con, off2_a_amp, off2_b_amp, AR_A, AR_B ), }) fit = sf.Fit(model, x_1=x1, x_3=x3, y_1=y1, y_3=y3) fit_result = fit.execute() print(fit_result)
内容的提问来源于stack exchange,提问作者luiz_iniciante
相关产品推荐
相关产品推荐

