雅可比矩阵伪逆广播错误求解:带梯度变异的ε约束差分进化实现问题
带梯度变异的ε约束差分进化算法维度不匹配问题修复
根因定位
- 矩阵乘法运算符误用:numpy中
*为逐元素广播乘法,要求运算双方维度可广播,无法实现线性代数中的矩阵乘法逻辑,这是触发维度不匹配报错的直接原因。 - 雅可比计算逻辑错误:
Jacobian函数的外层循环引用了函数外的变量delta_C获取约束数量,会导致雅可比矩阵维度计算异常,需要替换为函数内部计算得到的约束数量。 - 输出维度适配问题:矩阵乘法得到的扰动向量为二维4×1结构,需要降维为一维数组才能和长度为4的
trial向量做运算。
修复代码
修正雅可比计算函数
def Jacobian(v,delta=0.01): C = calculate_C(v) Jc = np.zeros(shape=(len(C),len(v))) # 修正循环边界为当前函数内计算的约束数量 for i in range(len(C)): for j in range(len(v)): aux = np.copy(v) aux[j] = v[j]+delta C_plus = calculate_C(aux)[i] aux[j] = v[j]-delta C_minus = calculate_C(aux)[i] Jc[i,j] = ((C_plus-C_minus)/(2*delta)) return Jc
修正变异环节代码
trial = np.zeros(4) inv_Jc = np.linalg.pinv(Jacobian(trial)) delta_C = np.array(calculate_C(trial)) delta_C = delta_C.reshape(len(delta_C),1) # 替换为矩阵乘法@,并将结果降维为一维数组 trial = trial - (inv_Jc @ delta_C).flatten()
逻辑验证
你的场景下约束总数为2个不等式约束+3个等式约束共5个,试验向量维度为4,因此雅可比矩阵为5×4维度,伪逆后为4×5维度,和5×1的delta_C做矩阵乘法正好得到4×1的扰动向量,降维后和trial维度完全匹配,可正常运行。
内容的提问来源于stack exchange,提问作者Darrell Kartrip
相关产品推荐
相关产品推荐

