SymPy trigsimp函数化简二次型旋转判别式结果异常求助
问题:SymPy trigsimp化简失败,无法验证二次型判别式的旋转不变性
我尝试用SymPy验证二次型 (ax^2 + bxy + cy^2) 的判别式 (b^2 - ac) 在旋转变换下的不变性,但发现trigsimp函数化简含三角函数乘积和的表达式时出现错误。
编写的Python脚本如下:
import sympy as sp # 定义变量和参数 x, y, theta = sp.symbols('x y theta', real=True) a, b, c = sp.symbols('a b c', real=True) # 原二次型 Q_original = a*x**2 + 2*b*x*y + c*y**2 # 旋转变换公式 x_rot = x*sp.cos(theta) - y*sp.sin(theta) y_rot = x*sp.sin(theta) + y*sp.cos(theta) # 代入旋转后的坐标 Q_rotated = Q_original.subs({x: x_rot, y: y_rot}) # 展开旋转后的二次型 Q_rotated_expanded = sp.expand(Q_rotated) # 合并同类项以提取新系数 Q_rotated_collected = sp.collect(Q_rotated_expanded, [x**2, x*y, y**2]) # 提取旋转后的系数 a_rot = Q_rotated_collected.coeff(x**2, 1) b_rot = Q_rotated_collected.coeff(x*y, 1) / 2 # 因为原形式是2*b*x*y c_rot = Q_rotated_collected.coeff(y**2, 1) # 计算原形式和旋转形式的判别式 discriminant_original = b**2 - a*c discriminant_rotated = b_rot**2 - a_rot*c_rot print(f"discriminant_rotated: {discriminant_rotated}\n") # 用trigsimp化简旋转后的判别式 discriminant_rotated_simplified = sp.trigsimp(discriminant_rotated) print(f"discriminant_rotated_simplified: {discriminant_rotated_simplified}\n") # 检查判别式是否相等 are_equal = sp.trigsimp(discriminant_original - discriminant_rotated_simplified) == 0 print(f"are_equal: {are_equal}")
运行后,discriminant_rotated_simplified 的输出结果为:
(-a*c + b**2)*cos(theta)**4
但正确结果应该是 (b^2 - ac)(即 -a*c + b**2)。
解决方案
问题出在直接对未展开的discriminant_rotated使用trigsimp,SymPy无法识别其中可消去的三角函数项。需要先展开判别式,再进行化简,或者直接使用更通用的simplify函数:
修改后的化简代码
# 方式1:先展开判别式再用trigsimp discriminant_rotated_expanded = sp.expand(discriminant_rotated) discriminant_rotated_simplified = sp.trigsimp(discriminant_rotated_expanded) # 方式2:直接使用simplify函数(更通用) discriminant_rotated_simplified = sp.simplify(discriminant_rotated)
替换原代码中的化简步骤后,discriminant_rotated_simplified会正确输出 -a*c + b**2,此时are_equal也会返回True。
内容的提问来源于stack exchange,提问作者Klaus Rohe
相关产品推荐
相关产品推荐

