You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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接收rq,内部调用area(r)计算面积后再算速度。
  • fun函数里调用velo(q,a)时,a根本没定义,而且参数顺序也不对,得改成正确的参数传递。

2. 调整minimize的调用逻辑

  • x0是你要优化的变量的初始值,你要优化的是r(单个变量),所以x0应该是单元素列表,比如[2],而不是四个元素。
  • 固定参数q/ro/mi需要通过minimizeargs参数传递进去,这样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)

关键要点总结

  • 目标函数的第一个参数必须是要优化的变量,其他固定参数通过minimizeargs参数传入
  • 确保函数内部的变量都有定义,函数调用的参数顺序和个数要匹配
  • x0的长度要和你要优化的变量数量一致(这里只优化r,所以是1个元素)

内容的提问来源于stack exchange,提问作者Gabriely do Carmo da Silva

火山引擎 最新活动