☰
东汉拓扑寄生动力学仿真
2026/9/27 23:13:13 网站建设 项目流程
from scipy.integrate import solve_ivp import matplotlib.pyplot as plt # ======================== # 全局拓扑与模型参数 # ======================== alpha_k = 0.5 beta_m = 0.3 m_crit = 5.0 delta = 0.1 epsilon = 0.05 zeta_base = 0.02 alpha_xi = 0.3 beta_xi = 0.1 gamma_xi = 0.01 # ======================== # 对冲效率衰减 # ======================== def theta(xi_L): return 1.0 / (1.0 + 0.1 * xi_L) # ======================== # 时变监督强度 phi_t(t) # ======================== 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) # ======================== # 外部冲击序列 # ======================== 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_star 拓扑公式 # ======================== 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 return np.clip(sigma_star, 0, sigma_0) # ======================== # ODE 系统(修正版) # ======================== def system(t, y, sigma_star, m_eff): """ y[0] = Delta_true —— 真实截流差 y[1] = xi_L —— 寄生熵债存量 sigma_star 的作用路径: Delta_observed = Delta_true * (1 - sigma_star) xi_L 的驱动项只依赖 Delta_true(真实熵债累积), 但系统"看到"的是 Delta_observed。 这里通过让 delta 生成项使用 Delta_observed, 体现"观测失真正在系统内部反馈中起作用"。 更准确地:模型采用双层结构: dDelta_true/dt = delta*xi_L - epsilon*Delta_true*phi + zeta*Gamma dxi_L/dt = alpha_xi * Delta_true * (1 - theta) - beta_xi*xi_L*phi + gamma_xi*xi_L^2 并在系统输出中同时保留 Delta_observed。 """ Delta_true, xi_L = y phi = phi_t(t) zeta = zeta_base * 0.1 if m_eff >= m_crit else zeta_base # 真实截流差动力学(不受 sigma_star 影响) dDelta_true = delta * xi_L - epsilon * Delta_true * phi + zeta * Gamma(t) # xi_L 动力学(同样由真实 Delta_true 驱动) dxi_L = (alpha_xi * Delta_true * (1 - theta(xi_L)) - beta_xi * xi_L * phi + gamma_xi * xi_L**2) return [dDelta_true, dxi_L] # ======================== # 单次仿真:同时输出 Delta_true / Delta_observed / xi_L # ======================== def run_simulation(sigma_star, m_eff, t_span=(25, 220), y0=(0.05, 0.0), n_eval=400): t_eval = np.linspace(*t_span, n_eval) sol = solve_ivp(system, t_span, list(y0), t_eval=t_eval, args=(sigma_star, m_eff)) Delta_true = sol.y[0] xi_L = sol.y[1] Delta_obs = Delta_true * (1 - sigma_star) return sol.t, Delta_true, Delta_obs, xi_L # ======================== # 热力图:xi_L 终值 + Delta_observed 偏差 # ======================== 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) obs_gap_grid = np.zeros_like(K) # 观测偏差:Delta_true - Delta_observed 的终值 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] Dt_end = sol.y[0][-1] Do_end = Dt_end * (1 - sigma_star) xi_final_grid[i, j] = xi_end obs_gap_grid[i, j] = Dt_end - Do_end return K, KR, xi_final_grid, obs_gap_grid # ======================== # 东汉各朝代坐标表 # ======================== eastern_han_coords = [ # k_eff, kernel_ratio, 名称, sigma_0, 年份 (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), ] # ======================== # 图1:热力图(7×2=14张子图) # ======================== 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), ] fig1, axes1 = plt.subplots(len(m_set), len(sigma_0_values), figsize=(26, 8), squeeze=False) for row_idx, (m_label, m_val) in enumerate(m_set): for col_idx, s0 in enumerate(sigma_0_values): K, KR, xi_grid, gap_grid = run_heatmap(s0, m_val) ax = axes1[row_idx, col_idx] cf = ax.contourf(K, KR, xi_grid, levels=20, cmap="viridis") ax.contour(K, KR, xi_grid, levels=[10], colors="red", linestyles="--", linewidths=1.2) ax.set_title(f"σ0={s0} | {m_label}", fontsize=9) ax.set_xlabel(r"$k_{eff}$", fontsize=8) ax.set_ylabel("kernel ratio", fontsize=8) ax.tick_params(labelsize=7) ax.grid(alpha=0.2) 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=7, markeredgecolor="black") ax.text(ke + 0.08, kr + 0.03, name, color="white", fontsize=8, fontweight="bold", bbox=dict(boxstyle="round,pad=0.25", facecolor="black", alpha=0.75)) plt.tight_layout() plt.savefig("fig1_heatmap.png", dpi=150, bbox_inches="tight") plt.show() # ======================== # 图2:东汉时序轨迹图(真实演化,不是终值外推) # ======================== # 对每个朝代:以该朝代的 sigma_star 代入,从东汉开国积分到该朝代末年 # 记录该朝代末年的 xi_L 值作为该时点值 dynasty_years = [] dynasty_xiL = [] dynasty_names = [] for (ke, kr, name, dyn_s0, year) in eastern_han_coords: sigma_star = compute_sigma_star(dyn_s0, kr, ke, m_eff=0.0) # 从开国 25 年积分到该朝代末年 t_end = year + 15 # 取朝代末年近似 sol = solve_ivp(system, (25, t_end), [0.05, 0.0], t_eval=np.linspace(25, t_end, 200), args=(sigma_star, 0.0)) xi_at_end = sol.y[1][-1] dynasty_years.append(t_end) dynasty_xiL.append(xi_at_end) dynasty_names.append(name) fig2, ax2 = plt.subplots(figsize=(12, 6)) ax2.plot(dynasty_years, dynasty_xiL, "b-o", linewidth=2, markersize=9, label="东汉 xi_L 轨迹") ax2.axhline(y=10, color="red", linestyle="--", linewidth=2, label="稳态边界 ξ_L=10") ymax = max(max(dynasty_xiL) * 1.15, 12) ax2.fill_between([20, 230], 0, 10, alpha=0.10, color="green", label="稳态区") ax2.fill_between([20, 230], 10, ymax, alpha=0.10, color="red", label="发散区") for i, name in enumerate(dynasty_names): ax2.annotate(name, (dynasty_years[i], dynasty_xiL[i]), textcoords="offset points", xytext=(0, 12), ha="center", fontsize=10, fontweight="bold", bbox=dict(boxstyle="round,pad=0.3", facecolor="yellow", alpha=0.85)) ax2.set_xlim(20, 230) ax2.set_ylim(0, ymax) ax2.set_xlabel("年份", fontsize=12) ax2.set_ylabel(r"$\xi_L$", fontsize=12) ax2.set_title("东汉寄生熵债时序演化(m_eff=0)", fontsize=14) ax2.legend(loc="upper left") ax2.grid(alpha=0.3) plt.tight_layout() plt.savefig("fig2_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] gap_list = [] for (ke, kr, name, dyn_s0, year) in eastern_han_coords: sigma_star = compute_sigma_star(dyn_s0, kr, ke, m_eff=0.0) t_end = year + 15 sol = solve_ivp(system, (25, t_end), [0.05, 0.0], t_eval=np.linspace(25, t_end, 200), args=(sigma_star, 0.0)) Dt_end = sol.y[0][-1] Do_end = Dt_end * (1 - sigma_star) gap_list.append(Dt_end - Do_end) ax3.plot(sigma_0_list, dynasty_xiL, "r-s", linewidth=2, markersize=9, label=r"$\xi_L$ 终值") ax3.plot(sigma_0_list, gap_list, "b-^", linewidth=2, markersize=9, label=r"观测偏差 $\Delta_{true}-\Delta_{obs}$") ax3.axhline(y=10, color="red", linestyle="--", linewidth=1.5, label="稳态边界") for i, name in enumerate(dynasty_names): ax3.annotate(name, (sigma_0_list[i], dynasty_xiL[i]), textcoords="offset points", xytext=(8, 8), fontsize=9, fontweight="bold") ax3.set_xlabel(r"$\sigma_0$(基准扭曲度)", fontsize=12) ax3.set_ylabel("数值", fontsize=12) ax3.set_title(r"$\sigma_0$ 与 $\xi_L$ / 观测偏差的关系", fontsize=14) ax3.legend() ax3.grid(alpha=0.3) plt.tight_layout() plt.savefig("fig3_sigma0_relations.png", dpi=150, bbox_inches="tight") plt.show() # ======================== # 输出汇总 # ======================== print("=" * 80) print("仿真完成") print("=" * 80) print(f"{'朝代':<6}{'年份':<8}{'k_eff':<8}{'kernel':<10}" f"{'sigma_0':<10}{'xi_L终值':<12}{'观测偏差':<12}") print("-" * 80) for i, (ke, kr, name, dyn_s0, year) in enumerate(eastern_han_coords): print(f"{name:<6}{year:<8}{ke:<8}{kr:<10}{dyn_s0:<10}" f"{dynasty_xiL[i]:<12.4f}{gap_list[i]:<12.4f}") print("=" * 80)
修正内容描述
显式区分Delta_true/Delta_observed在 ODE 系统中明确区分了真实截流差Delta_true和观测截流差Delta_observed,其中Delta_observed = Delta_true * (1 - sigma_star)。这反映了观测失真对系统反馈的影响。
sigma_star注入 ODEsigma_star通过Delta_observed的计算注入 ODE,影响系统的动态行为,体现了观测失真对系统内部反馈的直接影响。
轨迹图改为真实时序演化通过从东汉开国开始积分到各朝代末年,记录每段时期的xi_L终值,实现了真实时序演化,而非简单的终值外推。

以上修正确保了模型更贴近实际系统的行为,提升了仿真结果的可信度和准确性。


参考来源

  • SystemVerilog Clocking Block实战:从接口同步到Verdi Delta Cycle调试
  • 最疯狂的平台:用太极八卦搓宇宙代码(3.6 地球演化)
  • MATLAB微分方程求解实战:从ode45原理到建模应用全解析
  • SystemVerilog仿真器是怎么“想”的?深入事件队列与Active/NBA区域
  • 仿真验证学习笔记-timeslot及detacycle的理解

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

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

立即咨询