Python Scipy最小化-无法最小化目标函数

Python Scipy最小化-无法最小化目标函数,python,optimization,scipy,minimize,Python,Optimization,Scipy,Minimize,我正在尝试优化函数,以使用scipy最小化找到rev_tot的最大值。这里,obj_data是一个概率列表,prem是一个常数,inc可以取任何实际值。以下是我为目标函数编写的代码: import numpy as np import pandas as pd import scipy from scipy.optimize import minimize def objective(x,*args): prem = args[0] prob = args[1] in

我正在尝试优化函数,以使用scipy最小化找到
rev_tot
的最大值。这里,
obj_data
是一个概率列表,
prem
是一个常数,
inc
可以取任何实际值。以下是我为目标函数编写的代码:

import numpy as np
import pandas as pd
import scipy
from scipy.optimize import minimize

def objective(x,*args):

    prem = args[0]
    prob = args[1]
    inc = x[0]


    rev_tot = 0
    rev = 0
    del_p = 0.2*(1-np.exp(-2*(1-np.exp(-inc/400))))
    for i in range(len(prob)):
        rev = (prob[i]*(1+del_p)*prem) - inc
        rev_tot = rev_tot + rev
    return 1/rev_tot


prem = 3300
par = [0.9,0.1,0.5,0.4]
x0 = np.array([3]) # initial guess
solve = minimize(objective,x0,args=(prem,par),method='SLSQP')
solve.x
我想找到
inc
值,它将
1/rev_tot
(从而最大化
rev_tot
)。 当我打电话时:

minimize(objective,x0,args=(prem,par),method='SLSQP')

函数运行,但
solve.x
显示初始值没有变化。我无法理解为什么没有发生最小化。

您的问题是,由于您的
返回1/rev_tot
,解算器必须处理微小的数字。因此,x轴上的变化不会很好地反映在y值和解算器e的变化中估计它已经收敛:

import numpy as np
import pandas as pd
import scipy
from scipy.optimize import minimize

def objective(x,*args):

    prem = args[0]
    prob = args[1]
    inc = x[0]

    rev_tot = 0
    rev = 0
    del_p = 0.2*(1-np.exp(-2*(1-np.exp(-inc/400))))
    for i in range(len(prob)):
        rev = (prob[i]*(1+del_p)*prem) - inc
        rev_tot = rev_tot + rev
    return 1/rev_tot

prem = 3300
par = [0.9,0.1,0.5,0.4]
x0 = np.array([2]) # initial guess
solve = minimize(objective,x0,args=(prem,par),method='SLSQP')
x_min = solve.x
print(x_min)
#plot your function to visualize the outcome
x_func = np.linspace(1, 100, 1000)
y_func = []
for item in x_func:
    y_func.append((objective(np.asarray([item]), prem, par)))

y_min = objective(np.asarray([x_min]), prem, par)

plt.plot(x_func, y_func)
plt.plot(x_min, y_min, "ro")
plt.show()
输出:

[2.]

解决方案1)
将解算器更改为“Nelder Mead”。输出:

解决方案2)
使用解算器“SLSQP”的
return1000000/rev_tot
放大返回值。输出:


这不是一个缩进,而且缩进明显不符合预期。请编辑您的问题。T给出了一个链接,指向一个最小的、完整的和可验证的示例的描述。您已经向我们展示了您的目标函数,但您的示例并不完整且可验证。如果可以在不进行编辑的情况下复制和运行代码来重现问题,那么有人会更容易帮助您。从:“要最小化的目标函数。
fun(x,*args)->float
,其中x是具有形状(n,)的一维数组,args是完全指定函数所需的固定参数的元组。”
objective
的参数不符合此格式。谢谢,Shreyas,但还不完全符合。如果现在运行代码,
minimize
将引发异常
TypeError:objective()缺少两个必需的位置参数:“inc”和“prem”
。我怀疑您缺少
args=(inc,prem)
。另外,
minimize
的第二个参数是
x0
,它是minimize代码要使用的初始猜测。您通过了
inc
,这几乎肯定是不正确的——可能您认为这样做可以代替使用
args
。再看一眼,了解更多信息。你的代码适合我
[63.07910156]
[63.07110511]