You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:50:23