scipy.optimize.minimize_scalar
scipy.optimize.minimize_scalar(fun, bracket=None, bounds=None, args=(), method=None, tol=None, options=None)
输入参数:
fun: 可调用的目标函数。标量函数,必须返回一个标量。
bracket: 顺序,可选。对于方法‘brent’ 和‘golden’, bracket 定义包围间隔并且是必需的。
bounds: 顺序,可选。对于方法‘bounded’,边界是强制性的,并且必须具有与优化边界相对应的两个有限项。
method: str 或可调用,可选。求解器的类型。应该是以下之一:Brent、Bounded、Golden、custom - a callable object (added in version 0.14.0), 如果提供了边界,则默认值为“Bounded”,否则为“Brent”。
tol: 浮点数,可选。容差。如需详细控制,请使用solver-specific 选项。
options: 字典,可选。求解器选项字典。
maxiter :正整数,最大迭代次数。
disp: bool,显示收敛信息。
返回:
res: 优化结果,表示为 OptimizeResult 对象。res.x:最优解,res.success: 指示优化器是否成功退出的布尔标志,res.message:说明终止原因的 。
import numpy as np
from scipy.optimize import minimize_scalar
def f(x):
return x ** 2 + 10 * np.sin(x) + 1
res = minimize_scalar(f, bounds = (-5, 0), method = 'bounded')
print( "区间(-5, 0)中", res.x)
res = minimize_scalar(f, bounds = (0, 5), method = 'bounded')
print( "区间(0, 5)中", res.x)
res = minimize_scalar(f, bounds = (-5, 5), method = 'bounded')
print( "区间(-5, 5)中", res.x)
print(res)
import matplotlib.pyplot as plt
plt.figure(figsize=(8,6))
x = np.linspace(-10,10,500)
y = f(x)
plt.plot(x,y,color="orange",label="$x^2 + 10 * sin(x) + 1$",linewidth=2)
plt.legend()
plt.show()
scipy.optimize.fminbound
scipy.optimize.fminbound(func, x1, x2, args=(), xtol=1e-05, maxfun=500, full_output=0, disp=1)
参数
func: 可调用 f(x,*args).要最小化的目标函数(必须接受并返回标量)。
x1, x2: 浮点数或数组标量.有限优化界限。
args: 元组,可选.传递给函数的额外参数。
xtol: 浮点数,可选.收敛容差。
maxfun: 整数,可选。允许的最大函数评估次数。
full_output: 布尔型,可选。如果为真,则返回可选输出。
disp: 整数,可选。如果非零,则打印消息。0:不打印消息。 1:仅非收敛通知消息。 2:打印一条关于收敛的消息。 3:打印迭代结果。
返回
xopt: ndarray。最小化目标函数的参数(在给定区间内)。
fval: 数字(可选输出)。在最小值处计算的函数值。
ierr: int(可选输出)。错误标志(如果收敛则为 0,如果达到函数调用的最大数量则为 1)。
numfunc: int(可选输出)。进行的函数调用的数量。
## fmin
import numpy as np
from scipy.optimize import fminbound
def f(x):
return np.exp(x)-4*np.sin(x)+5 #x ** 2 + 10 * np.sin(x) + 1
res=fminbound(f,-1,2,disp=3)
import matplotlib.pyplot as plt
plt.figure(figsize=(8,6))
X = np.linspace(-1,1.5,50)
Y = f(X)
plt.plot(X,Y,color="orange",label="$e^x -4 sin(x) + 5$",linewidth=2)
plt.scatter(x,f(x))
plt.text(x,f(x),'optimimal')
plt.legend()
plt.show()