Python二次规划实现:动态创建可运算变量向量的问题
二次规划变量向量构建与代数运算解决方案
用SymPy生成可运算的符号变量向量
你之前用字符串生成变量的思路行不通,因为字符串无法直接参与矩阵乘法、求导等数学运算。SymPy是Python专门用于符号代数运算的库,完美适配你的需求——它能生成真正的符号变量,直接支持后续的矩阵运算和梯度计算。
生成符号变量向量的代码示例
import sympy as sp def get_symbolic_x(N): # 根据维度N生成[x₁, x₂, ..., x_N]的符号向量 return sp.Matrix([sp.symbols(f'x_{i+1}') for i in range(N)])
这里sp.Matrix会把生成的符号变量包装成矩阵对象,天然支持转置(.T)、矩阵乘法(@)等操作,完全匹配你对x向量的需求。
构建目标函数并计算梯度
有了符号变量向量后,直接按公式构建Phi,再通过SymPy的求导方法计算梯度:
def compute_phi_and_gradient(x, c, G): # 将输入的c、G转换为SymPy矩阵(支持数值或符号输入) c_mat = sp.Matrix(c) G_mat = sp.Matrix(G) # 计算目标函数Phi phi = 0.5 * x.T @ G_mat @ x + c_mat.T @ x # 计算Phi对x每个元素的偏导,得到梯度向量 gradient = sp.Matrix([phi.diff(var) for var in x]) return phi, gradient
求解最小值点
二次规划的最小值点满足梯度为0,也就是解方程 ( Gx + c = 0 )。用SymPy可以直接求解这个线性方程组:
def find_minimizer(x, c, G): G_mat = sp.Matrix(G) c_mat = sp.Matrix(c) # 求解Gx + c = 0 solution = sp.solve(G_mat @ x + c_mat, x) # 将解转换为向量形式 minimizer = sp.Matrix([solution[var] for var in x]) return minimizer
额外说明
如果你的最终目标是数值求解而非符号推导,也可以先用SymPy完成代数推导(比如确认梯度表达式),再将公式转换为数值代码。如果直接做数值二次规划,也可以用scipy.optimize.minimize或cvxopt这类库,但你既然要自己实现算法,SymPy的符号运算阶段是绕不开的关键步骤。
内容的提问来源于stack exchange,提问作者Lalaaar
相关产品推荐
相关产品推荐

