☰
非线性项优化策略解析
2026/9/27 23:14:08 网站建设 项目流程
from scipy.integrate import solve_ivp import matplotlib.pyplot as plt # ======================== # 全局拓扑与模型参数 # ======================== alpha_k = 0.5 # 独立征候通道压制系数 beta_m = 0.3 # 连坐机制压制系数 m_crit = 5.0 # 僵死相变临界阈值 # ODE动力学参数(真实系统Delta_true, xi_L) delta = 0.1 epsilon = 0.05 zeta_base = 0.02 # 基础外部冲击响应系数,僵死时衰减 alpha_xi = 0.3 beta_xi = 0.1 gamma_xi = 0.01 # 对冲效率衰减函数 theta(xi_L) def theta(xi_L): return 1.0 / (1.0 + 0.1 * xi_L) # ======================== # 时变监督强度 phi_t(t) 【已嵌入73窦宪胜利,归入明章脉冲】 # ======================== def phi_t(t, phi_0=0.1): pulses = [ {'A': 1.0, 't': 41, 'sigma': 10}, # 光武中兴 {'A': 0.8, 't': 72, 'sigma': 8}, # 明章之治(包含73年窦宪破匈奴正向治理增益) {'A': 0.5, 't': 99, 'sigma': 5}, # 和帝亲政 {'A': 0.3, 't': 152, 'sigma': 3}, # 桓帝初年整顿 ] phi = phi_0 for p in pulses: phi += p['A'] * np.exp(-((t - p['t'])**2) / (2 * p['sigma']**2)) # 党锢之祸阶梯衰减 if t >= 169: phi -= 0.7 elif t >= 166: phi -= 0.4 if t >= 184: phi += 0.2 # 黄巾起义后短期强化监督 return max(phi, 0.01) # ======================== # Gamma(t):稀疏外部冲击脉冲(羌乱、黄巾;73事件移入phi_t) # ======================== def Gamma(t): shocks = [ {'t': 107, 'I': 3.0}, # 羌乱爆发(第一次) {'t': 140, 'I': 2.0}, # 羌乱再起 {'t': 184, 'I': 5.0}, # 黄巾起义 ] g = 0.0 for s in shocks: g += s['I'] * np.exp(-((t - s['t'])**2) / 2) return g # ======================== # sigma^* 拓扑公式 # ======================== def compute_sigma_star(sigma_0, kernel_ratio, k_eff, m_eff): suppression = 1.0 / (1.0 + alpha_k * k_eff + beta_m * m_eff) sigma_star = sigma_0 * kernel_ratio * suppression sigma_star = np.clip(sigma_star, 0, sigma_0) return sigma_star # ======================== # ODE系统(调用时变phi_t(t)) # ======================== def system(t, y, sigma_star, m_eff): Delta_true, xi_L = y phi = phi_t(t) if m_eff >= m_crit: zeta = zeta_base * 0.1 else: zeta = zeta_base dDelta_dt = delta * xi_L - epsilon * Delta_true * phi + zeta * Gamma(t) dxi_dt = alpha_xi * Delta_true * (1 - theta(xi_L)) - beta_xi * xi_L * phi + gamma_xi * xi_L**2 return [dDelta_dt, dxi_dt] # ======================== # 热力图批量仿真函数 # ======================== def run_heatmap(sigma_0, m_eff_fixed): k_eff_list = np.linspace(0, 6, 30) kernel_ratio_list = np.linspace(0, 1, 30) K, KR = np.meshgrid(k_eff_list, kernel_ratio_list) xi_final_grid = np.zeros_like(K) status_grid = np.zeros_like(K) t_span = (25, 220) y0 = [0.05, 0.0] t_eval = np.linspace(*t_span, 400) for i, kr in enumerate(kernel_ratio_list): for j, ke in enumerate(k_eff_list): sigma_star = compute_sigma_star(sigma_0, kr, ke, m_eff_fixed) sol = solve_ivp(system, t_span, y0, t_eval=t_eval, args=(sigma_star, m_eff_fixed)) xi_end = sol.y[1][-1] xi_final_grid[i,j] = xi_end if m_eff_fixed >= m_crit: status_grid[i,j] = 2 elif xi_end > 10: status_grid[i,j] = 1 else: status_grid[i,j] = 0 return K, KR, xi_final_grid, status_grid # ======================== # 【修正】东汉各朝代坐标表:k_eff, kernel_ratio, label, sigma0_per_dynasty, year # ======================== eastern_han_coords = [ (2.5, 0.40, "光武", 0.4, 25), (3.0, 0.33, "明章", 0.5, 57), (3.5, 0.29, "和帝", 0.6, 88), (2.0, 0.38, "安帝", 0.7, 106), (1.5, 0.44, "顺帝", 0.8, 125), (0.8, 0.50, "桓帝", 0.9, 146), (0.3, 0.58, "灵帝", 1.0, 168), ] # ======================== # 【修正】参数扫描配置:sigma_0 扩展为 7 个值,每个朝代一个 # ======================== sigma_0_values = [0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0] m_set = [ ("m_eff = 0 (无连坐)", 0.0), (f"m_eff = m_crit+0.1 = {m_crit+0.1}", m_crit + 0.1) ] # ======================== # 图1:热力图 + 东汉坐标点(14张子图:7个sigma_0 × 2组m_eff) # ======================== fig1, axes1 = plt.subplots(len(m_set), len(sigma_0_values), figsize=(24, 8)) for row_idx, (m_label, m_val) in enumerate(m_set): for col_idx, s0 in enumerate(sigma_0_values): K, KR, xi_grid, stat_grid = run_heatmap(s0, m_val) ax = axes1[row_idx, col_idx] contour = ax.contourf(K, KR, xi_grid, levels=20, cmap="viridis") ax.contour(K, KR, xi_grid, levels=[10], colors="red", linestyles="--") ax.set_title(f"$\sigma_0={s0}$ | {m_label}", fontsize=10) ax.set_xlabel("$k_{eff}$") ax.set_ylabel("kernel ratio") ax.grid(alpha=0.2) # 打点:仅绘制匹配当前子图 sigma_0 的朝代 for (ke, kr, name, dyn_s0, year) in eastern_han_coords: if np.isclose(dyn_s0, s0, atol=0.01): ax.plot(ke, kr, marker="o", color="white", markersize=8, markeredgecolor='black') ax.text(ke+0.1, kr+0.03, name, color="white", fontsize=9, fontweight='bold', bbox=dict(boxstyle="round,pad=0.3", facecolor='black', alpha=0.7)) plt.tight_layout() plt.savefig("topology_heatmap_7dynasties.png", dpi=150, bbox_inches="tight") plt.show() # ======================== # 图2:东汉轨迹图(按时间顺序连接各朝代点) # ======================== # 对每个朝代,用其 (k_eff, kernel_ratio, sigma_0) 代入 ODE 计算 xi_L 终值 dynasty_years = [] dynasty_xi_final = [] dynasty_names = [] for (ke, kr, name, dyn_s0, year) in eastern_han_coords: # 使用 m_eff=0(无连坐)作为基准 sigma_star = compute_sigma_star(dyn_s0, kr, ke, m_eff_fixed=0.0) sol = solve_ivp(system, (25, 220), [0.05, 0.0], t_eval=np.linspace(25, 220, 400), args=(sigma_star, 0.0)) xi_end = sol.y[1][-1] dynasty_years.append(year) dynasty_xi_final.append(xi_end) dynasty_names.append(name) fig2, ax2 = plt.subplots(figsize=(12, 6)) ax2.plot(dynasty_years, dynasty_xi_final, 'b-o', linewidth=2, markersize=8, label='东汉轨迹') ax2.axhline(y=10, color='red', linestyle='--', linewidth=2, label='稳态边界 ξ_L=10') ax2.fill_between(dynasty_years, 0, 10, alpha=0.1, color='green', label='稳态区') ax2.fill_between(dynasty_years, 10, max(dynasty_xi_final)*1.1, alpha=0.1, color='red', label='发散区') # 标注朝代名称 for i, name in enumerate(dynasty_names): ax2.annotate(name, (dynasty_years[i], dynasty_xi_final[i]), textcoords="offset points", xytext=(0, 12), fontsize=10, fontweight='bold', bbox=dict(boxstyle="round,pad=0.3", facecolor='yellow', alpha=0.8)) ax2.set_xlabel("年份", fontsize=12) ax2.set_ylabel("ξ_L 终值", fontsize=12) ax2.set_title("东汉王朝熵债演化轨迹(m_eff=0)", fontsize=14) ax2.legend() ax2.grid(alpha=0.3) plt.tight_layout() plt.savefig("eastern_han_trajectory.png", dpi=150, bbox_inches="tight") plt.show() # ======================== # 图3:sigma_0 与 xi_L 终值的关系 # ======================== fig3, ax3 = plt.subplots(figsize=(10, 6)) sigma_0_list = [item[3] for item in eastern_han_coords] ax3.plot(sigma_0_list, dynasty_xi_final, 'r-s', linewidth=2, markersize=8) ax3.axhline(y=10, color='red', linestyle='--', linewidth=2, label='稳态边界 ξ_L=10') for i, name in enumerate(dynasty_names): ax3.annotate(name, (sigma_0_list[i], dynasty_xi_final[i]), textcoords="offset points", xytext=(8, 8), fontsize=10, fontweight='bold') ax3.set_xlabel("$\sigma_0$(基准扭曲度)", fontsize=12) ax3.set_ylabel("ξ_L 终值", fontsize=12) ax3.set_title("基准扭曲度与熵债终值的关系", fontsize=14) ax3.legend() ax3.grid(alpha=0.3) plt.tight_layout() plt.savefig("sigma0_vs_xiL.png", dpi=150, bbox_inches="tight") plt.show() # ======================== # 输出汇总 # ======================== print("="*80) print("仿真完成") print("图1:热力图(7个sigma_0 × 2组m_eff = 14张子图)") print("图2:东汉轨迹图(按时间顺序连接)") print("图3:sigma_0 与 xi_L 终值关系图") print("="*80) print("东汉朝代坐标与xi_L终值:") print(f"{'朝代':<6} {'年份':<6} {'k_eff':<8} {'kernel_ratio':<12} {'sigma_0':<8} {'xi_L终值':<10}") print("-"*60) for i, (ke, kr, name, dyn_s0, year) in enumerate(eastern_han_coords): print(f"{name:<6} {year:<6} {ke:<8} {kr:<12} {dyn_s0:<8} {dynasty_xi_final[i]:<10.4f}") print("="*80)
优化策略描述
分段线性化将非线性项拆分为多个线性区间,通过分段函数近似非线性行为。例如,在电力市场建模中,将非线性成本函数分段处理以提升求解效率。
二进制扩展法引入二进制变量对非线性项进行离散逼近,适用于处理乘积项(如 $x \cdot y$)。此方法在能源调度等场景中被广泛应用,但需权衡精度与计算代价。
McCormick 包络通过构建非线性项的上下界包络,将其转化为线性约束,适用于处理乘积项或分数项。该方法在混合整数非线性规划中具有较高的适用性。
非线性项引入在模型中直接保留非线性项,通过高精度数值求解器(如solve_ivp)进行求解。适用于非线性程度较低或计算资源充足的情况。
迭代法处理对于强非线性问题,采用迭代法逐步逼近解。例如,在热网建模中,通过温度固定和迭代求解实现非线性项的收敛。
随机效应调整在统计模型中,通过引入随机效应或非线性项调整模型偏差,提高拟合效果。例如,在混合效应模型中,通过非线性项优化模型性能。
变量变换对非线性项进行变量替换(如对数变换、指数变换),使其更接近线性关系。例如,在Logistic回归中,通过变量变换优化模型校准度。

以上优化策略可根据具体模型特点和计算需求选择使用,以提升模型的稳定性、准确性和求解效率。


参考来源

  • 电力市场两级协同优化与可再生能源消纳模型
  • R语言混合效应模型诊断实战:如何在4步内发现并修正模型偏差
  • SPSSAU实战:如何用Hosmer-Lemeshow检验优化你的二元Logistic回归模型
  • 优化模型线性化避坑指南:二进制扩展法处理x*y项,什么时候用?什么时候慎用?
  • 多区域综合能源系统热网建模与Matlab运行优化复现实践

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询