使用 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 一两个小时。
我正在尝试编写一些代码来找到方程的全局最大值,例如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 一两个小时。