Scipy优化报错:TypeError: f1() takes 1 positional argument but 2 were given
Scipy优化报错:TypeError: f1() takes 1 positional argument but 2 were given
嘿,我来帮你搞定这个报错问题!你遇到的这个错误,核心原因是Scipy的minimize函数在调用目标函数时,会自动传递额外的参数,但你定义的f1函数只接受一个x参数,没法处理这些额外参数,所以就触发了参数不匹配的错误。
先拆解下你代码里的两个小问题:
- 你调用
optimize.minimize(f1, initial_x_1, [], 'COBYLA')时,第三个位置参数[]被Scipy当成了args参数——这个参数是用来给目标函数传递额外参数的,哪怕你传的是空列表,Scipy也会尝试把它unpack后传给f1,这就导致了参数数量不对;而且COBYLA作为优化方法,应该用关键字参数method='COBYLA'来指定,用位置参数很容易搞混顺序。 - 你的
f1函数里只有sum(x),没写return语句,这样函数默认返回None,后续优化过程也会因为拿不到有效的目标函数值而出问题。
这里给你两个简单的解决办法,选一个用就行:
办法一:修改目标函数,兼容额外参数
把f1改成能接受可变参数的形式,这样不管Scipy传多少额外参数,都能完美适配:
def f1(x, *args): return sum(x)
办法二:调整minimize的调用方式,规范传参
不用位置参数传递优化方法,改用关键字参数明确指定method;如果没有额外参数要传给目标函数,就不用写args(或者显式传args=()),同时把np.ndarray换成更常用的np.array来初始化数组:
import numpy as np from scipy import optimize def f1(x): return sum(x) initial_x_1 = np.array([1]) res = optimize.minimize(f1, initial_x_1, method='COBYLA')
这样调整后,你的代码就能正常运行啦!
备注:内容来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

