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