在大函数中传递多个函数作为参数

-1 投票
1 回答
42 浏览
提问于 2025-04-14 17:00

我正在尝试为一个多变量函数运行一个收敛算法。这组函数是这样的:

def f(x,r,d): 
if r**2 - x**2 < 1e-15:
    return w0 + 2*d
else: return w0 + 2*d - 2*sqrt(r**2 - x**2)

def g(x,r,d): return 1/f(x,r,d)

def simpsons(function,size,lower_bound,upper_bound, **vars):
delta_x = (upper_bound - lower_bound)/(size - 1)
x = np.linspace(lower_bound,upper_bound,size)
points = (function(x, **vars))

result = (delta_x/3)*(points[0] + points[-1] + 2*sum(points[2:size - 2:2]) + 4*sum(points[1:size - 1:2]))
return result

def H(function,size,lower_bound,upper_bound, **vars): return simpsons(function,size,lower_bound,upper_bound, **vars)/V(**vars) - K

这是我的收敛算法:

def find_zero(function,eps,alpha, **vars):
error = 1
k = 1
result = init_value

while abs(error) > eps:
    error = function(**vars)
    result -= alpha/k*error
    k += 1

return result

稍后我会描述一个r的列表,用来传递给这些函数,最后求解d。我是这样做的:

for i in range(len(R)):
    d[i] = find_zero(H, eps, alpha, function = g, size = size, lower_bound = x0, upper_bound = xf, r = R[i], d = init_value)

但是我遇到了这个错误:

TypeError: find_zero() 收到了多个 'function' 参数的值

我该如何解决这个问题呢?

1 个回答

0

当你调用 find_zero(H, eps, alpha, function = g, size = size, ...) 时,你把 H 作为第一个位置参数传入,而在 find_zero 的定义中,这个参数叫做 function。同时,你又把 g 作为一个名为 function 的关键字参数传入。这两个参数的传递方式不兼容!

如果你不想让一个关键字参数错误地绑定到你打算按位置传递的参数上,你可以在定义时把这个参数设置为仅限位置传递。

def find_zero(function, eps, alpha, /, **vars):
   ...

在这个定义中,functionepsalpha 都是仅限位置的参数,因为它们在函数签名中的 / 之前。调用这个函数时,你必须按位置传递这三个参数,而那些恰好与位置参数名称匹配的关键字参数仍然会被放入 vars 中。

仅限位置的参数从 Python 3.8 版本开始就有了(可以查看 PEP 570)。如果你使用的是更早的版本,那就没办法了,你需要重命名位置参数或关键字参数中的一个。

撰写回答