ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

熵债清偿相图扫描与解耦分析

熵债清偿相图扫描与解耦分析 # TAB013-G-003 熵债清偿动力学相图扫描 # 配置无量纲ODELSODA刚性求解m_debt后处理解耦度指标三区域分类 # 依赖numpy, scipy.integrate, matplotlib, scipy.stats import numpy as np from scipy.integrate import solve_ivp from scipy.stats import pearsonr import matplotlib.pyplot as plt # 【沙盘全局参数配置】 # 固定后处理参数 s_c 1.0 # 观测窗口 T_obs_list np.array([10, 50, 200]) # 相对衰减率阈值 r_th 1e-3 # 极小截断数值底噪 s_floor 1e-12 # 扫描网格 beta_list np.array([0.6, 0.8, 1.0, 1.2, 1.5, 2.0, 3.0]) g_list np.logspace(-4, 1, 40) s0_list np.logspace(-3, 2, 30) # ODE 右侧 def ode_rhs(tau_tilde, s, beta, g): ds/dt -s*(1/(1s)**beta g) rhs -s * (1.0 / ((1.0 s)**beta) g) return rhs # 【后处理函数库】 def mu_debt(s): 无量纲m_debt: mu m_debt/m_sat return s / (s s_c) def calc_r(s, dsdt): 瞬时相对衰减率 r |d ln s / dt| if s s_floor: return 0.0 return np.abs(dsdt / s) def calc_decoupling_index(s_trace, m0_const1.0): D_decouple 1 - Corr(m_debt(t), m0)/Corr(S_debt(t), m0) m0为常数时Corr(常数,任何序列)0 → D≈1验证台账独立 mu_trace mu_debt(s_trace) m0_series np.full_like(s_trace, m0_const) corr_mu, _ pearsonr(mu_trace, m0_series) corr_s, _ pearsonr(s_trace, m0_series) # 防除0 if np.isclose(corr_s, 0): return 1.0 D 1.0 - corr_mu / corr_s return D def solve_single_run(beta, g, s0, t_end, t_evalNone): 单次积分返回轨迹、末端指标、半衰时间 sol solve_ivp( funode_rhs, t_span(0, t_end), y0[s0], args(beta, g), t_evalt_eval, methodLSODA, atol1e-9, rtol1e-7 ) if not sol.success: return None s_traj sol.y[0, :] t_traj sol.t dsdt_traj np.array([ode_rhs(tt, ss, beta, g) for tt, ss in zip(t_traj, s_traj)]) r_traj np.array([calc_r(ss, ds) for ss, ds in zip(s_traj, dsdt_traj)]) # 半衰时间 T_half^S s_half s0 / 2 idx_half np.argmin(np.abs(s_traj - s_half)) T_half_S t_traj[idx_half] # m_debt半衰时间 T_half^m mu0 mu_debt(s0) mu_half mu0 / 2 mu_traj mu_debt(s_traj) idx_mu_half np.argmin(np.abs(mu_traj - mu_half)) T_half_m t_traj[idx_mu_half] # 解耦度 D_dec calc_decoupling_index(s_traj) out { t: t_traj, s: s_traj, mu: mu_traj, r: r_traj, T_half_S: T_half_S, T_half_m: T_half_m, D_decouple: D_dec, s_end: s_traj[-1], r_end: r_traj[-1], success: True } return out # 【批量扫描主循环】 def scan_phase_diagram(): # 存储分类标签维度 [nbeta, ng, ns0] nbeta len(beta_list) ng len(g_list) ns0 len(s0_list) # 标签编码0冻结自锁1慢清偿2有效清偿 phase_label np.zeros((nbeta, ng, ns0), dtypeint) # 存储关键指标 g_c_grid np.full((nbeta, ns0), np.nan) T_half_S_grid np.full((nbeta, ng, ns0), np.nan) T_half_m_grid np.full((nbeta, ng, ns0), np.nan) D_dec_grid np.full((nbeta, ng, ns0), np.nan) for i_beta, beta in enumerate(beta_list): print(f beta {beta} ) for i_s0, s0 in enumerate(s0_list): # 对固定beta,s0扫描g找临界梯度g_c for i_g, g in enumerate(g_list): obs_dict {} # 三层观测窗口独立计算 for T_obs in T_obs_list: t_eval np.linspace(0, T_obs, 200) run solve_single_run(beta, g, s0, T_obs, t_eval) if run is None: continue obs_dict[T_obs] run # 取最长窗口200作为分类判定基准 run200 obs_dict[200] s_res run200[s_end] r_end run200[r_end] T12 run200[T_half_S] # 三区域判据 if s_res s_floor: label 2 # 有效清偿 elif (T12 / 200 0.9) and (r_end r_th): label 0 # 自锁冻结 else: label 1 # 慢清偿 phase_label[i_beta, i_g, i_s0] label T_half_S_grid[i_beta, i_g, i_s0] run200[T_half_S] T_half_m_grid[i_beta, i_g, i_s0] run200[T_half_m] D_dec_grid[i_beta, i_g, i_s0] run200[D_decouple] # 求g_c最小g使得r_end r_th脱离自锁区 r_series np.array([obs_dict[200][r_end] for obs_dict in [obs_dict for _ in g_list]]) cross_idx np.argmax(r_series r_th) if cross_idx len(g_list): g_c_grid[i_beta, i_s0] g_list[cross_idx] # 保存结果 np.savez(phase_scan_result.npz, beta_listbeta_list, g_listg_list, s0_lists0_list, phase_labelphase_label, g_c_gridg_c_grid, T_half_S_gridT_half_S_grid, T_half_m_gridT_half_m_grid, D_dec_gridD_dec_grid) return phase_label, g_c_grid # 【绘图函数单β二维相图】 def plot_phase_slice(phase_label, beta_idx0): fig, ax plt.subplots(figsize(8,6)) data phase_label[beta_idx, :, :] im ax.pcolormesh(s0_list, g_list, data, shadingauto, cmapcoolwarm) ax.set_xscale(log) ax.set_yscale(log) ax.set_xlabel(r$\tilde S_0$) ax.set_ylabel(r$\tilde g$) ax.set_title(rfPhase diagram $\beta{beta_list[beta_idx]}$) plt.colorbar(im, axax, ticks[0,1,2], label0:Lock 1:Slow 2:Effective) plt.tight_layout() plt.savefig(fphase_beta_{beta_list[beta_idx]}.png) return fig if __name__ __main__: phase_label, g_c_grid scan_phase_diagram() plot_phase_slice(phase_label, beta_idx4)
返回列表