Python 3.x 使用python查找方程的全局最大值

Python 3.x 使用python查找方程的全局最大值,python-3.x,max,sympy,maximize,Python 3.x,Max,Sympy,Maximize,我正试图编写一些代码来寻找方程的全局最大值,例如f=-x**4 这是我目前得到的 import sympy x = sympy.symbols('x') f = -x**4 df = sympy.diff(f,x) ans = sympy.solve(df,x) 那我就卡住了。我应该如何将ans替换回f,如何知道这是否是最大值,而不是最小值或鞍点?如果您只是寻找全局最大值,而没有其他值,那么已经有了一个函数。见下文: 来自sympy导入的* x=符号('x') f=-x**4 打印(最大(f,

我正试图编写一些代码来寻找方程的全局最大值,例如
f=-x**4

这是我目前得到的

import sympy
x = sympy.symbols('x')
f = -x**4
df = sympy.diff(f,x)
ans = sympy.solve(df,x)

那我就卡住了。我应该如何将
ans
替换回
f
,如何知道这是否是最大值,而不是最小值或鞍点?

如果您只是寻找全局最大值,而没有其他值,那么已经有了一个函数。见下文:

来自sympy导入的
*
x=符号('x')
f=-x**4
打印(最大(f,x))#0
如果你想要更多的信息,比如给出最大值或局部最大值的x值,你必须做更多的手工工作。在下面,我找到了临界值,正如您在上面所做的,然后我将这些值显示为这些临界点

diff_f=diff(f,x)
临界点=求解(差分f,x)
打印(临界点)#x值
对于关键点中的点:
打印(f.subs(x,点))#f(x)值
这可以扩展到包括二阶导数测试,如下所示:

d_f=diff(f,x)
dd_f=diff(f,x,2)
临界点=求解(d\u f,x)
对于关键点中的点:
如果dd_f.subs(x,点)<0:
打印(f“x={point}处的局部最大值与f({point})={f.subs(x,point)}”)
elif dd_f.subs(x,点)>0:
打印(f“x={point}处的局部最小值与f({point})={f.subs(x,point)}”)
其他:
打印(f“在x={point}处不确定,f({point})={f.subs(x,point)}”)
要找到全局最大值,您需要获取所有临界点,并在这些点上评估函数。然后从中选择最大值

outputs=[f.subs(x,点)表示临界点中的点]
最佳_x=[临界_点中的点对点,如果f.subs(x,点)=最大(输出)]
打印(f“值x={optimal_x}都在f(x)={max(outputs)}处产生一个全局最大值”)
以上内容适用于大多数基本函数。对变量命名不一致表示歉意


如果你正在为替换等简单的事情而挣扎,我建议你坚持一两个小时。

第二个问题的答案是。对于一个变量的函数,检查它在临界点的二阶导数是否严格为负。我知道应该使用二阶导数测试,但是它仍然会给出
f'(0)=0
,这是不确定的。实际上,二阶导数测试可能是不确定的。见: