
import numpy as np
import matplotlib.pyplot as plt
def logistic_growth(t, P, r, K, alpha=1.0):
""" 改进的Logistic阻滞增长模型微分方程 """
return r * P * (1 - (P / K) ** alpha)
def adaptive_rk4_step(f, t, y, h, params, tolerance=1e-6, max_iterations=100):
""" 变步长四阶龙格-库塔法单步计算,添加递归限制"""
r, K, alpha = params
k1 = h * f(t, y, r, K, alpha)
k2 = h * f(t + h / 2, y + k1 / 2, r, K, alpha)
k3 = h * f(t + h / 2, y + k2 / 2, r, K, alpha)
k4 = h * f(t + h, y + k3, r, K, alpha)
y_new = y + (k1 + 2 * k2 + 2 * k3 + k4) / 6
# 误差估计并调整步长
k5 = h * f(t + h / 2, y + (k1 + k4) / 4, r, K, alpha)
error = abs((k2 + k3 - k5 - k4/2)) / 30
# 添加递归限制,防止无限递归
if max_iterations <= 0:
return y_new, h
if error > tolerance:
return adaptive_rk4_step(f, t, y, h * 0.9, params, tolerance, max_iterations - 1)
elif error < tolerance / 10:
return y_new, h * 1.1
else:
return y_new, h
def solve_logistic_rk4_adaptive(f, t0, tf, y0, h0, params, tolerance=1e-6):
""" 使用变步长RK4求解人口增长模型 """
t_values = [t0]
y_values = [y0]
h = h0
t = t0
y = y0
while t < tf:
if t + h > tf:
h = tf - t
y_new, h_new = adaptive_rk4_step(f, t, y, h, params, tolerance)
t += h
y = y_new
t_values.append(t)
y_values.append(y)
h = h_new
return np.array(t_values), np.array(y_values)
# 参数设置
r = 0.0058 # 内禀增长率
K = 15475000 # 环境容纳量
alpha = 1.2 # 非线性调节因子
P0 = 15000000 # 初始人口数量(调整为小于K的值)
t0 = 2013 # 起始时间
tf = 2051 # 终止时间
h0 = 1 # 初始步长
params = (r, K, alpha)
t_sol, P_sol = solve_logistic_rk4_adaptive(logistic_growth, t0, tf, P0, h0, params)
# 绘图显示结果
plt.figure(figsize=(10, 6))
plt.plot(t_sol, P_sol, label="Population (Adaptive RK4)")
plt.title("Population Growth Prediction using Improved Logistic Model")
plt.xlabel("Time")
plt.ylabel("Population")
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
一直跑不出结果是陷入死循环了吗?且一直没有报错但就是跑不出结果,能否帮忙看看