Python复合函数最小化报错求助:TypeError: fun()缺少3个必要位置参数q、ro和mi
解决你的复合函数最小化问题
嘿,我来帮你一步步搞定这个报错和代码里的问题~
首先,咱们先理清你遇到的TypeError: fun() missing 3 required positional arguments: 'q', 'ro', and 'mi'报错原因:scipy.optimize.minimize默认只会把x0里的参数作为第一个参数传给你的目标函数fun,但你的fun需要r(优化变量)+q/ro/mi(固定参数)四个参数,所以调用时没传后面三个,就触发了这个错误。
除此之外,你的代码还有几个逻辑小问题,我一起帮你修正:
1. 修复函数内部的变量未定义问题
velo函数里你用了r,但r并没有作为参数传入,而且你已经定义了参数a却没用到,结合你说的“Velo由area复合”,应该让velo接收r和q,内部调用area(r)计算面积后再算速度。fun函数里调用velo(q,a)时,a根本没定义,而且参数顺序也不对,得改成正确的参数传递。
2. 调整minimize的调用逻辑
x0是你要优化的变量的初始值,你要优化的是r(单个变量),所以x0应该是单元素列表,比如[2],而不是四个元素。- 固定参数
q/ro/mi需要通过minimize的args参数传递进去,这样fun就能拿到这些值了。
修正后的完整代码
from math import pi import scipy.optimize def area(r): return pi * r**2 # 修正velo函数:接收r和q,内部调用area计算面积 def velo(r, q): a = area(r) return q / a # fun函数:第一个参数是要优化的r,后面是固定参数 def fun(r, q, ro, mi): v = velo(r, q) # 修正velo的调用参数 result = (ro * v * r) / mi return result # 设定固定参数的值(你可以根据实际需求修改) q_val = 3 ro_val = 5 mi_val = 6 # x0是优化变量r的初始值 x0 = [2] # 通过args传递固定参数给fun res = scipy.optimize.minimize(fun, x0, args=(q_val, ro_val, mi_val)) print(res)
关键要点总结
- 目标函数的第一个参数必须是要优化的变量,其他固定参数通过
minimize的args参数传入 - 确保函数内部的变量都有定义,函数调用的参数顺序和个数要匹配
x0的长度要和你要优化的变量数量一致(这里只优化r,所以是1个元素)
内容的提问来源于stack exchange,提问作者Gabriely do Carmo da Silva




