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

Python3.6使用scipy.optimize.brute触发TypeError问题求助

解决Scipy brute优化的参数传递问题

嘿,我来帮你搞定这个困扰你的问题,咱们一步步拆解错误原因,再给出正确的代码:

先理清核心问题

scipy.optimize.brute的参数规则和你的函数定义不匹配,导致了这一系列错误,咱们逐个分析:

错误1:TypeError: object of type 'int' has no len()

你第一次调用sop.brute(fo, (-10,10.1,5), (-10,10.1,5), finish=None)时,brute会把第二个参数(-10,10.1,5)当作所有变量的范围序列(ranges参数),第三个参数(-10,10.1,5)被当成了额外的args参数。内部处理时,brute会遍历ranges里的每个元素作为单个变量的范围,但这里的元素是数值(-10、10.1、5),尝试取长度len()自然会报错。

错误2:TypeError: object of type 'slice' has no len()

第二次你传了两个slice对象r1和r2,但brute要求ranges参数是包含所有变量范围的序列(元组/列表),你直接把单个slice传给ranges,它尝试取这个slice的长度,而slice没有len()方法,所以报错。

错误3:TypeError: fo() missing 1 required positional argument: 'y'

第三次你把两个slice放到元组里,但brute会把每个参数组合打包成单个元组(比如(x_val, y_val))传递给目标函数,而你的fo(x,y)期望两个独立的位置参数,所以它会把元组当成x,然后找不到y,导致参数缺失错误。


正确的解决方案

我们需要同时修正ranges的传参方式和目标函数的参数接收逻辑,这里给你两种可行方案:

方案1:修改目标函数,接收参数元组

把fo改成接收一个元组参数,再解构为x和y,同时修复未定义的output变量:

import numpy as np
import scipy.optimize as sop

def fo(params):
    x, y = params
    z = np.sin(x) + 0.05*x**2 + np.cos(y) + 0.05*y**2
    # 可选:添加打印开关,比如用默认参数控制
    # if output:
    #     print("%8.4f %8.4f %8.4f" % (x, y, z))
    return z

# 正确的ranges传参:把每个变量的范围放到一个元组里
result = sop.brute(fo, ((-10, 10.1, 5), (-10, 10.1, 5)), finish=None)
print("最优参数:", result)

方案2:用lambda包装原函数,不修改fo

如果你不想改动原来的fo函数,可以用lambda把brute传递的参数元组拆成独立的x和y:

import numpy as np
import scipy.optimize as sop

# 保留你原来的函数,同时修复output变量(比如加默认参数)
def fo(x, y, output=False):
    z = np.sin(x) + 0.05*x**2 + np.cos(y) + 0.05*y**2
    if output:
        print("%8.4f %8.4f %8.4f" % (x, y, z))
    return z

# 用lambda打包参数,传递给fo
result = sop.brute(lambda params: fo(*params, output=True), 
                   ((-10, 10.1, 5), (-10, 10.1, 5)), 
                   finish=None)
print("最优参数:", result)

内容的提问来源于stack exchange,提问作者Y.I

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:26:26