SageMath中求解向量变换矩阵与向量的代码错误排查
错误原因分析
1. 矩阵与向量乘法的类型不匹配问题
你的代码里,t[i,:]是1×2的行矩阵,p[:,j]是2×1的列矩阵,二者相乘得到的是1×1的矩阵,而非标量。而q[i]是标量(来自向量q),p2[i,j]也是标量。当你尝试让标量和「标量+1×1矩阵」做相等判断时,Sage会直接返回False——因为类型不匹配,无法生成预期的符号等式。
2. 循环范围未覆盖全部输入输出对
你只遍历了j in range(2),仅处理前两个输入输出向量对,生成了4个方程,但需要求解的变量有6个(a、b、c、d、e、f)。你的需求是用3个输入输出对确定仿射变换,必须遍历j in range(3)才能生成完整的6个方程,这样才能得到唯一解(或判断是否存在解)。
修正后的代码
var('a b c d e f') # 输入向量:每一列对应一个输入向量(2行3列矩阵) p = matrix([[-3, 0, 6], [4, 8, 6]]) # 输出向量:每一列对应一个输出向量(2行3列矩阵) p2 = matrix([[1, 6, 8], [-4, -4, 2]]) q = vector([a, b]) t = matrix([[c, d], [e, f]]) # 使用点积确保结果为标量,同时遍历全部3组输入输出对 eqs = [p2[i,j] == q[i] + t[i,:].dot_product(p[:,j]) for i in range(2) for j in range(3)] show(eqs) solve(eqs, [a,b,c,d,e,f])
也可以通过转换为向量来实现标量乘法:
eqs = [p2[i,j] == q[i] + vector(t[i,:]) * vector(p[:,j]) for i in range(2) for j in range(3)]
修正效果验证
修改后,show(eqs)会输出6个符合预期的符号等式,例如:
1 == a - 3*c + 4*d, 6 == a + 8*d, 8 == a + 6*c + 6*d, -4 == b - 3*e + 4*f, -4 == b + 8*f, 2 == b + 6*e + 6*f
运行solve后会得到唯一解,满足你的变换需求。
内容的提问来源于stack exchange,提问作者Mauri Crespo
相关产品推荐
相关产品推荐

