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

如何强制scipy.optimize.minimize_scalar仅在指定区间寻优?

解决scipy.minimize_scalar解超出指定区间的问题

问题根源

method="Golden"(黄金分割法)的bracket参数只是初始搜索的起始区间,算法会根据函数特性自动扩展搜索范围,因此最终解可能落在[a,b]之外,它本身不做严格的区间约束。

解决方案

1. 改用method="bounded"(推荐)

这是scipy专门为有界区间优化设计的方法,通过bounds参数指定严格的区间[a,b],算法会强制在该区间内寻找最小值。

示例代码:

from scipy.optimize import minimize_scalar

def target_func(x):
    return x**2 - 4*x + 3  # 示例函数,全局最小值在x=2处

a, b = 0, 1  # 限定搜索区间[0,1]
result = minimize_scalar(target_func, method="bounded", bounds=(a, b))
print(result.x)  # 输出1.0,即区间内的最小值点

2. 包装函数强制约束(兼容Golden方法)

如果一定要使用黄金分割法,可以手动包装原函数,将区间外的函数值设为极大值,引导算法在区间内搜索:

示例代码:

from scipy.optimize import minimize_scalar

def target_func(x):
    return x**2 - 4*x + 3

def bounded_func(x, a, b):
    if x < a or x > b:
        return float('inf')  # 区间外返回无穷大,让算法自动避开
    return target_func(x)

a, b = 0, 1
result = minimize_scalar(lambda x: bounded_func(x, a, b), method="Golden", bracket=[a, b])
print(result.x)  # 输出接近1.0的数值

3. 使用scipy.optimize.fminbound

这是一个更简洁的专门用于区间最小值搜索的函数,直接传入函数和区间端点即可:

示例代码:

from scipy.optimize import fminbound

def target_func(x):
    return x**2 - 4*x + 3

a, b = 0, 1
min_x = fminbound(target_func, a, b)
print(min_x)  # 输出1.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 10:24:56