将关键字参数传递给scipy中的四元积分函数

时间:2019-03-25 13:30:05

标签: python numpy scipy kwargs

我想将关键字参数传递给dblquad或nquad中的整数函数。

在这里可能根本没有关键字参数,还是应该只选择位置参数?

基本上,我尝试将字典作为普通参数传递。以下是我为此所做的尝试:

def foo(A, B, **kwargs):
    alpha = kwargs.get('alpha', 1.0)
    beta = kwargs.get('beta', 1.0)
    return A*alpha+B*beta
def integrator(**kwargs):
    alpha = kwargs.get('alpha', 1.0)
    beta = kwargs.get('beta', 1.0)
    a = dblquad(foo, 0, 2*pi, lambda x: 0, lambda x: 2*pi, args=(kwargs))
integrator(alpha = 1.0, beta = 2.0)

Python抱怨位置参数数量不正确。它将关键字字典视为许多位置参数。

2 个答案:

答案 0 :(得分:0)

简短的回答:不支持kwargs。

可能的解决方法包括将关键字args作为位置参数传递,将单个dict作为位置参数传递或将相关的关键字作为属性附加到要集成的函数中。

答案 1 :(得分:0)

我现在可以通过将一个函数对象传递给积分方法来解决此问题(我的示例使用RK45而不是正交的。)

基本上,您会创建一个像这样的类:

class MyFunction(object):
  def __init__(self, constant1, constant2, **kwargs):
    self.constant1 = constant1
    # ... and so on ...

  def __call__(self, t, y):
    # This is your 'fun' that gets passed.

设置积分器时,您可以这样做:

my_fun = MyFunction(c1, c2, other_arg = 'foo', bar = 10.0)
integ = RK45(my_fun, t0, y0, tf)
while integ.t < tf and integ.status != 'failed':
  integ.step()

当然,这不允许您在集成过程中将参数更改为my_fun。但这确实允许您将更可自定义的函数传递给集成方法。