题目:已知x2 + y2 + z2 = 1,求 x + y + z 的最小值
这个问题相当于在约束条件下的极值问题的求解,在高等数学里,通用的方法是用拉格朗日乘子,通过求导的方式解决,这里使用scipy中的optimize模块来解决这个问题。
from scipy.optimize import minimize
import numpy as np
e = 1e-10 # 非常接近0的值
fun = lambda x : x[0] + x[1] + x[2]
cons = ({'type': 'eq', 'fun': lambda x: x[0]**2 + x[1]**2 + x[2]**2 - 1}, # x^2 + y^2 + z^2 = 1
)
x0 = np.array((1.0, 0, 0)) # 设置初始值
res = minimize(fun, x0, method='SLSQP', constraints=cons)
print('最小值:',res.fun)
print('最优解:',res.x)
print('迭代终止是否成功:', res.success)
print('迭代终止原因:', res.message)
结果输出
最小值: -1.7320510374842677
最优解: [-0.57735549 -0.57734777 -0.57734777]
迭代终止是否成功: True
迭代终止原因: Optimization terminated successfully.
与期望输出一致。
Python——使用scipy求解带约束的最优化问题
python求解带约束目标优化问题(非线性规划,粒子群,遗传,差分进化)