使用SymPy求解方程组时结果中出现未知量是什么原因
问题原因分析
- 代入你传入的参数
p=0、q=0、r=0以及Ixy=0、Iyz=0后,三个方程可化简为:9496*x - 982*z = 10e-955814*y = -45989-982*x + 63100*z = 10
- 第二个方程可以直接解出固定的y值,就是结果中的
-0.823968896692586,这部分输出正常。 - 剩余x、z的两个方程理论上是满秩的,本应存在唯一解,出现自由变量z的核心原因是系数矩阵病态+浮点精度误差:第一个方程的常数项
10e-9和第三个方程的常数项10差了10个数量级,linsolve处理浮点系数的高病态方程组时,误判两个方程线性相关,因此把z识别为自由变量,输出带z的通解。
修复方案
你可以任选以下一种方法解决问题:
- 将所有参数转换为sympy的精确有理数类型,避免浮点精度干扰判断,示例修改代码如下:
from sympy import symbols, linsolve, Rational def Kinematic_turn(L, M, N, p, q, r): Ix = 9496 Iy = 55814 Iz = 63100 Ixy = 0 Iyz = 0 Izx = 982 x, y, z = symbols('x, y, z') eq = [Ix * x + (Iz - Iy) * q * r + Iyz * (r ** 2 - q ** 2) + Ixy * ( r * p - y) - Izx * (p * q + z) - L, Iy * y + (Ix - Iz) * p * r + Izx * (p ** 2 - r ** 2) + Iyz * ( p * q - z) - Ixy * (q * r + x) - M, Iz * z + (Iy - Ix) * p * q + Ixy * (q ** 2 - p ** 2) + Izx * ( q * r - x) - Iyz * (r * p + y) - N] result = linsolve(eq, [x, y, z]) (p_dot, q_dot, r_dot) = next(iter(result)) return p_dot, q_dot, r_dot # 传入精确有理数参数避免浮点误差 p_dot, q_dot, r_dot = Kinematic_turn(Rational(10, 10**9), -45989, 10, 0, 0, 0)
- 改用numpy的数值线性代数工具求解,比如
numpy.linalg.solve,指定合适的求解精度也可以得到确定的数值解。
内容的提问来源于stack exchange,提问作者littlefirewooder
相关产品推荐
相关产品推荐

