【问题标题】:Find global maximum of an equation using python使用python查找方程的全局最大值
【发布时间】:2020-11-04 10:18:47
【问题描述】:

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

这是我目前得到的。

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

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

【问题讨论】:

  • 第二个问题的答案是the second partial derivative test。对于一个变量的函数,检查它在临界点的二阶导数是否严格为负。
  • 我知道应该使用二阶导数测试,但是它仍然会给出f''(0) = 0,这是不确定的。
  • 其实是的,二阶导数测试可能没有定论。见:en.wikipedia.org/wiki/…

标签: python-3.x max sympy maximize


【解决方案1】:

如果您只是在寻找全局最大值而没有别的,那么已经有一个函数可以解决这个问题。请参阅以下内容:

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

【讨论】:

    猜你喜欢
    • 2016-09-10
    • 2017-11-30
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2018-04-25
    • 2012-11-21
    相关资源
    最近更新 更多