如何在mpmath.findroot中使用**kwargs参数?

2024-07-05 09:18:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用mpmath中的findroot找到一个有很多参数的函数的根,但在这个问题上,我将使用一个简单的函数

from mpmath import mp


def func(x, **parameters):

 return parameters["a"]*x*x + 1
   

solution = mp.findroot(f = func, x0 = 0.955j, solver = 'muller', **kwargs = (a = 1))

输出:

SyntaxError: invalid syntax

代码中的func函数在给定$a$值的情况下,以$x$值返回$f(x)=ax^2+1$。例如,$a=1$f(1)$的值是2。为了找到$f$的根,我使用了findroot。由于我的函数有参数,我需要在findroot中使用**kwargs。然而,我正在努力使用它。我不断地遇到语法错误


Tags: 函数fromimport参数returndefmpkwargs
1条回答
网友
1楼 · 发布于 2024-07-05 09:18:53

语法错误

语法错误出现在分配**kwargs = 中。变量kwargs是一个字典,并且**解压该字典。表达式**kwargs = (a = 1)本质上是试图解包一个字典,同时还将该字典赋值给另一个变量赋值

关键字参数

函数的**kwargs参数允许您传递任意数量的附加关键字参数。参数a=1是一个关键字参数。kwargs本身是要“打包在一起”的关键字参数的集合

快速演示:

In [1]: def print_kwargs(**kwargs):
   ...:     for key, value in kwargs.items():
   ...:         print(key, value)
   ...:

In [2]: print_kwargs(a=1, b=2, c=3)
a 1
b 2
c 3

In [3]: params = dict(a=1, b=2, c=3)

In [4]: print_kwargs(**params)
a 1
b 2
c 3

实际问题

查看文档,似乎解算器可以接受您传递的任何内容。换句话说,kwargs不会传递给函数,func,它们会传递给求解器,'muller'

就我所知,{}所使用的文档和kwargs根本没有解释,所以我不知道它对其关键字参数做了什么,但问题是kwargs并没有像您所期望的那样被传递给您的函数

不幸的是,如果您希望函数func是一个动态多项式,它可以接受参数参数,那么您需要对它做更多的工作

解决方案

以下是您可以做的:

def function_builder(**params):
    def func(x):
        return params["a"] * x**2 + 1  # or whatever function
    return func

然后你会做:

>>> params = dict(a=1)
>>> func = function_builder(**params)
>>> mp.findroot(f=func, x0=0.955j, solver='muller')
mpc(real='0.0', imag='1.0')

您可以通过以下方式来实现function_builder(),即返回一个新的函数对象,它只是x的函数。然后,当你想找到一个特定多项式的根时,你可以用你想要的任何参数调用function_builder(),它将返回你想要的函数,然后mp.findroot可以使用它

注释

下面是一个如何实现通用二次方程生成器的示例:

def quadratic_builder(**params):
    a, b, c = params["a"], params["b"], params["c"]
    def f(x):
        return a * x**2 + b * x + c
    return f

当然,对于像二次方程这样的特殊情况,最好显式调用关键字参数:

def quadratic_builder(*, a, b, c):
    def f(x):
        return a * x**2 + b * x + c
    return f

然后你可以把系数的“集合”打包在一起:

coefs_1 = dict(a=1, b=3, c=-5)
coefs_2 = dict(a=-2, b=1, c=0)
coefs_3 = dict(a=-6, b=8, c=3)

f1 = quadratic_builder(**coefs_1)
f2 = quardatic_builder(**coefs_2)
f3 = quardatic_builder(**coefs_3)

等等

相关问题 更多 >