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

二维插值最小值求解:优化器参数传递报错问题

解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:01:32