求解双光模双机械模Lyapunov方程时遇局部绑定错误求助
问题分析与代码修复
错误原因
- 局部变量提前引用:
calculate_G函数中,第一行计算delta_1时用到了delta_rp1,但该变量直到函数后半段才被赋值,Python会触发“局部变量在赋值前引用”的错误。 - 依赖未传入的全局变量:函数内使用了
L1和omega_m两个全局变量,未作为参数传入,破坏了函数封装性,也容易引发作用域问题。
修复后的代码
import numpy as np from scipy import linalg import cmath import math def calculate_G(keppa, P, m, omega_L1, v1, t, hbar, L1, omega_m): # 初始化光频移为0,先计算初始失谐量 delta_rp1 = 0 delta_1 = v1 - delta_rp1 - omega_L1 G1 = (v1 / L1) * np.sqrt(hbar / (m * omega_m)) E1 = np.sqrt((2 * P * keppa) / (hbar * omega_L1)) * cmath.exp(complex(delta_1 * t)) q1s = ((G1 * abs(E1)**2) / omega_L1) # 更新光频移 delta_rp1 = G1 * q1s # 使用更新后的频移计算alpha_1s alpha_1s = abs(E1 / complex(v1 - delta_rp1 - omega_L1)) G = G1 * np.sqrt(2) * (alpha_1s**2) return G omega_m = 2 * np.pi * 30 * 10**6 gamma_m = 2 * np.pi * 50 t = 0 c = 3 * 10**8 v1 = 2 * np.pi * 30 * 10**15 L1 = 0.532 * 10**(-3) keppa = 2 * np.pi * 250 * 10**3 P = 0.05 * 10**(-3) hbar = 1.05 * 10**(-34) lmda_1 = 810 * 10**(-9) m = 5 * 10**(-9) k = 1.38 * 10**(-23) n_av = 500 omega_L1 = 2 * np.pi * c / lmda_1 antilog = math.exp((1 / n_av) + 1) T = (hbar * omega_m) / (k * antilog) gamma_c = 2 * np.pi * 1.6 * 10**6 gamma_a = 2 * np.pi * 1.4 * 10**6 # 调用函数时传入新增的L1和omega_m参数 G = calculate_G(keppa, P, m, omega_L1, v1, t, hbar, L1, omega_m) print(G)
关键修改说明
- 调整变量计算顺序:先初始化
delta_rp1为0,计算初始失谐量delta_1,后续再根据q1s更新delta_rp1,避免提前引用未定义变量。 - 补充函数参数:将
L1和omega_m作为参数传入函数,消除对全局变量的依赖,让函数逻辑更独立可控。 - 简化冗余代码:去掉不必要的
float()转换,清理注释掉的无关代码,提升代码整洁度。
内容的提问来源于stack exchange,提问作者Kashaf Toheed
相关产品推荐
相关产品推荐

