最小化多变量函数

时间:2018-01-18 20:54:59

标签: python python-3.x numpy scipy differentiation

import math
import numpy
import scipy

def chisq1a(a,b,NN):
return (NN/(a**2)*b**2*(1+3/(a**2))*(1+(math.tan((math.pi)/2*(a+b*math.log(b/0.45))))**2))

x0 = numpy.array([0,0,0])

from scipy.optimize import minimize
result = scipy.optimize.minimize(chisq1a, x0)

我正在尝试使用上面的代码最小化Python 3中的多变量函数,但是我得到了一个错误

  TypeError: chisq1a() missing 2 required positional arguments: 'b' and 'NN'

这是什么意思?之前在随后编写一个最初用n个参数定义的函数的情况下出现了这个错误,例如n-1个参数,因此存在不匹配,但这似乎不是问题。可能解决方案很简单,但我刚开始使用python几天前还在学习:)谢谢!

1 个答案:

答案 0 :(得分:0)

我不确定为什么minimize函数是以这种方式设计的,但似乎你必须解压缩你想要最小化的函数内部的参数。我无法以任何其他方式提供多个参数(例如,作为元组)。我从他们使用的底部示例in the docs中获取了我的提示:

fun = lambda x: (x[0] - 1)**2 + (x[1] - 2.5)**2

作为多个参数的示例,即单个参数x,然后它们在函数内部进行索引。他们使用lambda的事实并没有什么不同。

我必须更新[0, 0, 0]的初始猜测,以避免ZeroDivisionError。以下似乎有效:

import math
import numpy as np
import scipy

def chisq1a(x):
    a, b, NN = x
    return (NN/(a**2)*b**2*(1+3/(a**2))*(1+(math.tan((math.pi)/2*(a+b*math.log(b/0.45))))**2))

x0 = np.array([1, 1, 1])
result = scipy.optimize.minimize(chisq1a, x0)

至于访问结果,之前链接的文档状态为:

  

res:OptimizeResult

     

优化结果表示为OptimizeResult对象。   重要的属性是:x解决方案数组,成功一个布尔标志   指示优化器是否成功退出并且消息是哪个   描述了终止的原因。请参阅OptimizeResult获取   其他属性的描述。

因此,x是您可以再次解包的结果数组。

result = scipy.optimize.minimize(chisq1a, x0)
a, b, NN = result.x