使用 python 求方程的全局最大值

Find global maximum of an equation using python

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

这是我目前得到的。

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

然后我卡住了。我应该如何将 ans 替换回 f,我怎么知道那是最大值,而不是最小值还是鞍点?

如果您只是在寻找全局最大值而不是其他任何东西,那么已经有一个函数可以做到这一点。请参阅以下内容:

from sympy import *

x = symbols('x')
f = -x**4
print(maximum(f, x))  # 0

如果您需要更多信息,例如给出最大值或局部最大值的 x 值,您将需要做更多的手动工作。在下文中,我按照您在上面所做的那样找到临界值,然后将这些值显示为那些临界点。

diff_f = diff(f, x)
critical_points = solve(diff_f, x)
print(critical_points)  # x values
for point in critical_points:
    print(f.subs(x, point))  # f(x) values

这可以扩展为包括二阶导数测试,如下所示:

d_f = diff(f, x)
dd_f = diff(f, x, 2)
critical_points = solve(d_f, x)
for point in critical_points:
    if dd_f.subs(x, point) < 0:
        print(f"Local maximum at x={point} with f({point})={f.subs(x, point)}")
    elif dd_f.subs(x, point) > 0:
        print(f"Local minimum at x={point} with f({point})={f.subs(x, point)}")
    else:
        print(f"Inconclusive at x={point} with f({point})={f.subs(x, point)}")

要找到全局最大值,您需要获取所有临界点并评估这些点处的函数。然后从中选择最大值。

outputs = [f.subs(x, point) for point in critical_points]
optimal_x = [point for point in critical_points if f.subs(x, point) == max(outputs)]

print(f"The values x={optimal_x} all produce a global max at f(x)={max(outputs)}")

以上应该适用于大多数初等函数。对变量命名不一致表示歉意。

如果您在替换等简单的事情上遇到困难,我建议您 the docs 一两个小时。