二维插值最小值求解:优化器参数传递报错问题
解决scipy优化器传递二维插值函数的TypeError问题
我一眼就看出问题出在哪了——你给fmin的args参数传的是单个interp2d对象,但这个参数要求必须是元组类型,哪怕只有一个参数也得加个逗号凑成元组,不然fmin内部会把它当成单个元素去拼接,自然就报类型错误了。
修正后的代码
先把你的代码改对:
import numpy as np import scipy from scipy.interpolate import interp2d # 假设a、c_a、Energy是已经定义好的输入数据 a_ca_energy_interp = interp2d(a, c_a, Energy) def run_2d_params(params, func): a_val, b_val = params # 注意:interp2d返回的是一个数组,需要取[0]拿到*标量值*给优化器 return func(a_val, b_val)[0] # 关键:args要传元组,单个元素加逗号 result = scipy.optimize.fmin(run_2d_params, np.array([1.60,6.075]), args=(a_ca_energy_interp,)) print(result)
额外注意点
- 为什么要加
[0]?因为interp2d的返回值是一个长度为1的numpy数组(哪怕你传单个点),而优化器需要的是标量损失值,直接返回数组会导致后续计算出错,所以必须提取标量。 - 如果你用的是较新版本的scipy,更推荐用
scipy.optimize.minimize代替fmin,它的API更灵活,支持更多优化算法,比如:
from scipy.optimize import minimize result = minimize(run_2d_params, np.array([1.60,6.075]), args=(a_ca_energy_interp,)) print(result.x) # 直接拿到最优参数
错误根源再梳理
scipy.optimize.fmin的args参数定义是接收一个元组,用来传递目标函数(这里是run_2d_params)的额外参数。你之前直接传a_ca_energy_interp,它是interp2d类的实例,不是元组,当fmin内部尝试把这个参数和其他内部参数拼接时,就会触发can only concatenate tuple (not "interp2d") to tuple的错误——本质就是类型不匹配。
内容的提问来源于stack exchange,提问作者Daniel Marchand
相关产品推荐
相关产品推荐

