You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用scipy.optimize.minimize求解种群模型参数失败(success: False)

谢弗种群模型参数优化失败问题求助

已实现谢弗种群模型(Schaefer Population Model)的spm微分方程方法及目标函数objective,调用scipy.optimize.minimize进行参数(增长率r、环境容纳量K)优化时,返回success: False,无法定位问题原因。相关代码及运行结果如下:

import numpy as np
from scipy.integrate import solve_ivp
from scipy.interpolate import interp1d
from scipy.optimize import minimize

biomass_obs = [7049, 6536, 5886, 5585, 5826]
years = [1961, 1962, 1963, 1964, 1965]
f_obs = [0.22 , 0.269, 0.227, 0.135, 0.129]

def spm(t, B, r, K, f_func):
    """
    t: 时间
    B: 生物量
    r: 增长率
    K: 环境容纳量(原拼写为karrying kapacity)
    f_func: F的插值函数
    """
    b_val = B[0]
    current_F = f_func(t)
    
    # 微分方程
    dBdT = r * b_val * (1 - b_val / K) - current_F * b_val
    return dBdT

# 目标函数
def objective(params, t, B, f_func):
    r, K = params
    sol = solve_ivp(spm, (t[0], t[-1]), [B[0]], args=(r,K,f_func,), t_eval=t)
    # 计算平方和
    return np.sum((sol.y[0] - B)**2)

# r和K的初始猜测值
initial_guess = [0.9, 9500]

# 插值函数
f_interp = interp1d(years, f_obs, kind='previous', fill_value="extrapolate")

result = minimize(objective, initial_guess, args=(years, biomass_obs, f_interp))
result

运行结果

[ins] In [32]: result
Out[32]:
  message: Desired error not necessarily achieved due to precision loss.
  success: False
   status: 2
      fun: 16142.459294231905
        x: [ 3.678e-01  1.058e+04]
      nit: 11
      jac: [-1.797e+06 -8.096e+01]
 hess_inv: [[ 1.954e-08 -4.690e-04]
            [-4.690e-04  1.407e+01]]
     nfev: 254
     njev: 82

可能原因及解决思路

  • 数值精度损失
    优化器提示精度损失,可尝试:

    • 调整优化参数,比如设置tol=1e-8降低容忍度,或添加options={'maxiter': 1000}允许更多迭代;
    • 对生物量和K做归一化处理(如除以1000),缩小数值范围,减少计算精度损耗。
  • 微分方程求解稳定性
    默认RK45求解器可能不适用于当前模型:

    • 更换为更稳定的求解器,比如method='Radau'或method='BDF';
    • 给solve_ivp设置更高精度,如rtol=1e-8, atol=1e-10,提升数值解准确性。
  • 参数约束缺失
    r和K应为正数,当前无约束可能导致不合理参数:

    • 添加边界约束,比如bounds=((1e-5, None), (1e3, None)),并使用支持约束的优化器(如method='L-BFGS-B')。
  • 插值函数合理性
    kind='previous'的外推可能产生异常F值:

    • 限制插值外推范围,或改用kind='linear'等平滑插值方式,避免F值突变影响微分方程解。
  • 梯度计算异常
    jac值量级差异过大,说明目标函数对r和K敏感度悬殊:

    • 手动实现梯度计算并传入minimize,替代数值梯度;
    • 对参数做缩放(如r乘以100),让参数量级更接近,帮助优化器找到正确方向。

内容的提问来源于stack exchange,提问作者GuyMatz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 16:34:54