如何在scipy.minimize中使用固定常数?(含需求示例)
解决scipy.minimize中固定部分参数的问题
你遇到的核心问题是scipy.minimize要求目标函数的第一个参数必须是待优化的变量,而你希望把外部计算得到的a和b作为固定参数传入,只优化guess。下面是几种实用的解决方案:
方案1:调整函数参数顺序,用args传递固定参数
这是最标准的做法,只需把待优化的变量guess放在目标函数的第一个位置,然后用minimize的args参数传递固定的a和b:
import scipy.optimize def error(guess, a, b): target = 4 return abs(a*guess - b*target) # 假设a和b是主程序计算得到的 a = 2 b = 3 # x0是待优化变量guess的初始值,args传递固定参数a、b calculated = scipy.optimize.minimize(error, x0=0, args=(a, b)) print(calculated.x) # 输出接近[6.0],因为2*6=3*4=12
方案2:用functools.partial绑定固定参数
如果你不想修改原函数的参数顺序,可以用functools.partial把a和b预先绑定到目标函数上,生成一个只接受guess的新函数:
import scipy.optimize from functools import partial def error(a, b, guess): target = 4 return abs(a*guess - b*target) a = 2 b = 3 # 绑定a和b,生成仅需传入guess的函数 partial_error = partial(error, a, b) calculated = scipy.optimize.minimize(partial_error, x0=0) print(calculated.x)
方案3:将待优化变量包装为数组(适合多变量优化)
如果后续需要优化多个变量,可以把待优化变量放在一个数组里,固定参数依然通过args传递:
import scipy.optimize def error(params, a, b): guess = params[0] # 从数组中提取待优化变量 target = 4 return abs(a*guess - b*target) a = 2 b = 3 # x0是待优化变量数组的初始值 calculated = scipy.optimize.minimize(error, x0=[0], args=(a, b)) print(calculated.x)
为什么你的原代码无法运行?
你的原代码中,minimize把(a, b, 0)作为待优化变量数组传递给error的第一个参数a,导致error函数缺少b和guess参数,从而抛出参数不匹配的错误。
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

