You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 09:28:16