Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将具有多个自变量和多个参数的函数传递给scipy optimize最小化_Python_Scipy_Keyword Argument_Scipy Optimize_Scipy Optimize Minimize - Fatal编程技术网

Python 将具有多个自变量和多个参数的函数传递给scipy optimize最小化

Python 将具有多个自变量和多个参数的函数传递给scipy optimize最小化,python,scipy,keyword-argument,scipy-optimize,scipy-optimize-minimize,Python,Scipy,Keyword Argument,Scipy Optimize,Scipy Optimize Minimize,接下来,我想让我的问题尽可能具体,集中在我无法解决的部分。考虑一个非常简单的函数: def foo(x,y,a,b,c): 返回a*x**4+b*y**2+c 现在我想使用scipy.optimize.minimize或任何其他现有函数来查找x和y(即参数)以最小化foo,给定常量a、b和c(即args)。如果我只有一个参数和多个参数,那么我可以: def foo(x,*args): a、 b,c=args 返回a*x**4+b*x**2+c #X0=某个标量 #ARGS=标量的元组(a、B、

接下来,我想让我的问题尽可能具体,集中在我无法解决的部分。考虑一个非常简单的函数:

def foo(x,y,a,b,c):
返回a*x**4+b*y**2+c
现在我想使用
scipy.optimize.minimize
或任何其他现有函数来查找
x
y
(即参数)以最小化
foo
,给定常量
a
b
c
(即args)。如果我只有一个参数和多个参数,那么我可以:

def foo(x,*args):
a、 b,c=args
返回a*x**4+b*x**2+c
#X0=某个标量
#ARGS=标量的元组(a、B、C)
x_min=scipy.optimize.minimize(foo,x0=x0,args=args)
如果我只有自变量,没有常数args,那么我可以:

def foo(*参数):
x、 y=参数
返回4*x**4+2*y**2+1
#P0=标量列表[X0,Y0]
x_min=scipy.optimize.minimize(foo,x0=P0)
但是,我不能使用上述任何语法。我认为我必须将我的功能定义为:

def foo(*args,**kwargs):
x、 y=args
a、 b,c=元组(kwargs.values())
返回a*x**4+b*y**2+c

但是我不知道如何将
args
kwargs
传递给
scipy.optimize
函数。如果您能帮助我了解定义
foo
函数的最佳方法是什么,并为
scipy.optimize
函数提供多个独立参数和常量参数,我将不胜感激。提前感谢您的支持。

您可以使用
lambda
functools自己绑定常量参数,而不是传递
foo
并让scipy传递常量参数。partial

A, B, C = some_const_values
foo1 = lambda x, y: foo(x, y, A, B, C)
或:

然后:


啊哈,很酷的解决办法。非常感谢。因此,没有办法将带有
*args、**kwargs
的函数直接传递到
scipy。在不定义lambda或中间函数的情况下优化
函数?我将在几小时内对此进行测试,然后回来批准答案。我尝试了您的代码。我不确定它是否能像现在这样工作。我认为,
x,y
参数需要分解成一个类似于
foo\ux0=lambda P:foo(P[0],P[1],A,B,C)
,然后
最小化(foo\ux0=[x0,Y0])
。我不会将此编辑应用于你的帖子,你不会收到任何通知。你最好自己看一下。你看一个例子
import functools
foo1 = functools.partial(foo, a=A, b=B, c=C)
x_min = scipy.optimize.minimize(foo1, ...)