You need to enable JavaScript to run this app. 使用SymPy求解方程组时结果中出现未知量是什么原因
优惠活动
大模型
产品
解决方案
定价
更多

使用SymPy求解方程组时结果中出现未知量是什么原因

问题原因分析
  • 代入你传入的参数p=0、q=0、r=0以及Ixy=0、Iyz=0后,三个方程可化简为:
    1. 9496*x - 982*z = 10e-9
    2. 55814*y = -45989
    3. -982*x + 63100*z = 10
  • 第二个方程可以直接解出固定的y值,就是结果中的-0.823968896692586,这部分输出正常。
  • 剩余x、z的两个方程理论上是满秩的,本应存在唯一解,出现自由变量z的核心原因是系数矩阵病态+浮点精度误差:第一个方程的常数项10e-9和第三个方程的常数项10差了10个数量级,linsolve处理浮点系数的高病态方程组时,误判两个方程线性相关,因此把z识别为自由变量,输出带z的通解。
修复方案

你可以任选以下一种方法解决问题:

  1. 将所有参数转换为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)
  1. 改用numpy的数值线性代数工具求解,比如numpy.linalg.solve,指定合适的求解精度也可以得到确定的数值解。

内容的提问来源于stack exchange,提问作者littlefirewooder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 08:24:01