尝试用 scipy.optimize.minize 求解有约束的最优化问题,但在构建目标函数的时候遇到麻烦。
场景:一系列散点(xi, yi),每个散点有一个范围约束,相邻的两个散点构成向量vi,要求出散点坐标值使得向量模的总和 ∑||vi|| 的值最小
问题:如何构建符合scipy语法的目标函数?对于数量不定的散点,如何用循环一类的方法描述目标函数?同样对于约束,能否用循环一类的方法写出约束?,是否存在其他方法完成这一目标?
尝试用 scipy.optimize.minize 求解有约束的最优化问题,但在构建目标函数的时候遇到麻烦。
场景:一系列散点(xi, yi),每个散点有一个范围约束,相邻的两个散点构成向量vi,要求出散点坐标值使得向量模的总和 ∑||vi|| 的值最小
问题:如何构建符合scipy语法的目标函数?对于数量不定的散点,如何用循环一类的方法描述目标函数?同样对于约束,能否用循环一类的方法写出约束?,是否存在其他方法完成这一目标?
以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
在Python中,我们可以使用scipy.optimize.minimize来解决带有约束的非线性优化问题。但是,在构建目标函数时,我们需要确保它满足所有约束条件。以下是一个例子:
import numpy as np
from scipy import optimize
# 假设我们有两个变量x1和x2,它们都有一个范围限制
def objective_function(x):
# 计算向量vi的平方和
return sum([vi**2 for vi in x])
# 假设我们的约束是x1 >= 0且x2 >= 0
def constraint_function(x):
# 计算向量vi的平方和
return [vi[0]**2 + vi[1]**2 for vi in x]
# 定义我们的目标函数和约束函数
bounds = [(0, None), (0, None)] # 每个变量的最大值为None表示没有上限
cons = ({'type': 'ineq', 'fun': constraint_function}) # 约束条件
# 使用scipy.optimize.minimize来求解
result = optimize.minimize(objective_function, np.array([0, 0]), bounds=bounds, constraints=cons)
print(result.x) # 输出结果
在这个例子中,我们首先定义了目标函数objective_function,然后定义了约束函数constraint_function。接下来,我们定义了一个bounds列表,其中包含两个元素,分别对应于x1和x2的上下界。最后,我们定义了一个constraints字典,其中包含了两个项,分别是目标函数和约束函数。
注意:这个例子中的约束条件是基于向量的长度之和的最小化,而不是基于向量的模的最小化。如果你的问题是关于向量的模的最小化,你需要修改你的目标函数和约束函数以适应这一点。