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

如何在Scipy目标函数中纳入ODE平衡值的20%不确定性区间?

调整目标函数以纳入不确定性区间的方案

原来的目标函数是让感染数平衡值尽可能贴近300,现在要实现「平衡值落在240-360之间即视为合格,仅超出区间时计算惩罚项」的需求,可通过以下两种方式修改目标函数:

方法1:显式分段判断

直接通过条件分支处理不同区间的残差计算:

import numpy as np

def residual(x):
    eq_val = infections(x)  # 获取ODE求解的平衡值
    lower_bound = 240
    upper_bound = 360
    
    if lower_bound <= eq_val <= upper_bound:
        # 落在允许区间内,残差设为0
        return 0.0
    elif eq_val < lower_bound:
        # 低于下限,计算与下限的差的平方
        return (eq_val - lower_bound) ** 2
    else:
        # 高于上限,计算与上限的差的平方
        return (eq_val - upper_bound) ** 2

方法2:用Numpy clip 函数简化

如果需要处理批量参数或更简洁的代码,可利用np.clip截断平衡值后计算残差:

import numpy as np

def residual(x):
    eq_val = infections(x)
    lower_bound = 240
    upper_bound = 360
    
    # 将平衡值截断到[240, 360]区间内
    clipped_val = np.clip(eq_val, lower_bound, upper_bound)
    # 仅计算超出区间部分的平方和
    return np.sum((eq_val - clipped_val) ** 2)

核心逻辑说明

  • 当平衡值处于240-360区间内时,残差为0,不会对优化过程产生惩罚;
  • 当平衡值低于240或高于360时,残差为平衡值与区间边界的差的平方,会推动优化过程将参数调整至让平衡值回到区间内。

修改后的目标函数完全兼容Scipy的minimize和leastsq方法,无需调整优化器的调用逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:10:05