【问题标题】:Minimizing a function scipy最小化函数 scipy
【发布时间】:2016-12-29 12:01:22
【问题描述】:

我得到了一个函数(类似错误),我必须最小化并获得新参数 alpha 和 r:

#!/usr/bin/env python
import numpy as np
from scipy.integrate import quad
import scipy.optimize as opt

def integrand(t, alpha, r):
    return np.exp(-alpha*(t-r))**2

def my_function(alpha, r):
    return quad(integrand, 0, 5.0, args=(alpha, r))[0]

alpha = np.arange(1.0, 2.0, 0.1)
r = np.arange(1.0, 2.0, 0.1)
x0 = np.array([1.3, 0.7, 0.8, 1.9, 1.2])
res = opt.minimize(my_function, x0, args=(alpha, r), method='CG', tol=1.e-2, options={'gtol': 0.01, 'maxiter': 5})

我的第一个问题是我是否选择了正确的最小化方法。如果是这样,谁能详细说明我必须将哪些参数传递给最小化方法?

目前返回错误信息:

File "./test.py", line 15, in <module>
    res = opt.minimize(my_function, x0, args=(alpha, r), method='CG', tol=1.e-2, options={'gtol': 0.01, 'maxiter': 5})
  File "/usr/local/lib/python2.7/site-packages/scipy/optimize/_minimize.py", line 439, in minimize
    return _minimize_cg(fun, x0, args, jac, callback, **options)
  File "/usr/local/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 1159, in _minimize_cg
    gfk = myfprime(x0)
  File "/usr/local/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 289, in function_wrapper
    return function(*(wrapper_args + args))
  File "/usr/local/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 622, in approx_fprime
    return _approx_fprime_helper(xk, f, epsilon, args=args)
  File "/usr/local/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 556, in _approx_fprime_helper
    f0 = f(*((xk,) + args))
  File "/usr/local/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 289, in function_wrapper
    return function(*(wrapper_args + args))
TypeError: my_function() takes exactly 2 arguments (3 given)

【问题讨论】:

  • 我不确定传递了哪些参数,但您可以使用my_function(*args, **kwargs): print(args, kwargs) 查看您实际传递给函数的内容。

标签: python scipy


【解决方案1】:

既然你想最小化关于r和alpha,那么,你必须传递一个起点,即初始值。

我的解决方案:

import numpy as np
from scipy.integrate import quad
import scipy.optimize as opt


def integrand(t, alpha, r):
    return np.exp(-alpha*(t-r))**2


def my_function(parameters):
    alpha = parameters[0]
    r = parameters[1]
    return quad(integrand, 0, 5.0, args=(alpha, r))[0]

alpha_0 = 1
r_0 = 1

res = opt.minimize(my_function, np.asarray([alpha_0, r_0]), method='CG', tol=1.e-2, options={'gtol': 0.01, 'maxiter': 5})
print(res)

输出:

fun: 0.0018415003336983448
     jac: array([-0.00523077,  0.00762011])
 message: 'Optimization terminated successfully.'
    nfev: 12
     nit: 2
    njev: 3
  status: 0
 success: True
       x: array([ 2.06899361, -1.1785839 ])

【讨论】:

  • 感谢您的帮助!我还有一个问题。我想将积分界限更改为变量。我尝试将其他参数传递给 my_function(parameters) 函数,例如:x = parameters[2] 并返回 quad(integrand, 0, x, args=(alpha, r))[0]。在这种情况下,x 也被最小化。我该如何绕过这个问题?
  • @eyllanesc ,我刚刚发现我的投票被推翻了。抱歉:meta.stackexchange.com/questions/289026/…
猜你喜欢
  • 2016-05-27
  • 2018-01-30
  • 2015-02-18
  • 1970-01-01
  • 2021-10-25
  • 2013-11-19
  • 2017-07-07
  • 1970-01-01
相关资源
最近更新 更多