Python Scipy最小化-无法最小化目标函数
我正在尝试优化函数,以使用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
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]