You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sympy求解非线性方程组遇TypeError问题求助

Sympy求解非线性方程组报错求助

问题背景

我是Sympy新手,正尝试求解一组非线性方程组,运行时出现错误:TypeError: cannot determine truth value of Relational

常量

(注:原始常量为图片内容,此处省略)

依赖值函数

def v_ego(self,ego_vel_x,ego_a_ini_x,t):
    v_ego = ego_vel_x + ego_a_ini_x * t
    return v_ego

def x_obj(self,x_obj_ini,obj_vel_x,obj_a_ini_x,t):
    x_obj = x_obj_ini + obj_vel_x * t + 0.5 * obj_a_ini_x * t ** 2
    return x_obj

def x_ego(self,x_ego_ini,ego_vel_x,ego_a_ini_x,t):
    x_ego = x_ego_ini + ego_vel_x * t + 0.5 * ego_a_ini_x * t ** 2
    return x_ego

def y_obj(self,y_obj_ini,obj_vel_y,obj_a_ini_y,t):
    y_obj = y_obj_ini + obj_vel_y * t + 0.5 * obj_a_ini_y * t ** 2
    return y_obj

def y_t(self):
    y_t = math.sqrt(self._r_t ** 2 - self._l_f ** 2) - (self._w_ego / 2)
    return y_t

def y_r(self,ego_vel_x,ego_a_ini_x,t):
    y_r = math.sqrt(max(0, ((self.v_ego(ego_vel_x,ego_a_ini_x,t) ** 2 / (self._Mu_rt * self._g)) ** 2 - self._l_c ** 2)))
    return y_r

def y_min(self,ego_vel_x,ego_a_ini_x,t):
    y_min = max(self.y_t(), self.y_r(ego_vel_x,ego_a_ini_x,t))
    return y_min

def r_min(self,ego_vel_x,ego_a_ini_x,t):
    r_min = max(self._r_t, math.sqrt(self._l_f ** 2 + (self.y_min(ego_vel_x,ego_a_ini_x,t) + self._w_ego / 2) ** 2))
    return r_min

方程组代码

tts, delta_t = sym.symbols('tts,delta_t')

e_10 = sym.Eq(math.atan((self.x_obj(x_obj_ini, obj_vel_x, obj_a_ini_x, tts + delta_t) - self.x_ego(x_ego_ini,ego_vel_x,ego_a_ini_x,tts)+ self._l_f) / (self.y_min(ego_vel_x, ego_a_ini_x, tts) - self.y_obj(y_obj_ini, obj_vel_y, obj_a_ini_y,tts + delta_t))) - ((self.v_ego(ego_vel_x, ego_a_ini_x, tts) * delta_t) / self.r_min(ego_vel_x, ego_a_ini_x, tts) - (math.asin(min(1.0, self._l_f / self.r_min(ego_vel_x, ego_a_ini_x, tts))))), 0)

e_11 = sym.Eq((self.x_obj(x_obj_ini, obj_vel_x, obj_a_ini_x, tts + delta_t) - self.x_ego(x_ego_ini, ego_vel_x,ego_a_ini_x,tts)+ self._l_f) ** 2 + (self.y_min(ego_vel_x, ego_a_ini_x, tts) - self.y_obj(y_obj_ini, obj_vel_y, obj_a_ini_y,tts + delta_t)) ** 2 - (self.r_min(ego_vel_x, ego_a_ini_x, tts)) ** 2, 0)
print(sym.solve([e_10, e_11], (tts, delta_t)))

错误原因及解决方法

报错核心原因是在Sympy符号运算中混用了Python内置math模块函数和普通max/min函数——这些函数仅能处理数值,无法识别Sympy符号变量,当尝试对符号变量做真值判断(比如max需要比较大小)时,就会触发该错误。

修改步骤

  1. 替换所有math模块函数为Sympy对应函数:
    • math.sqrt → sym.sqrt
    • math.atan → sym.atan
    • math.asin → sym.asin
  2. 替换普通max/min为Sympy的sym.Max/sym.Min,这两个函数支持符号运算
  3. 确保所有涉及符号变量的运算均使用Sympy函数

修改后代码示例

依赖值函数修改部分

import sym as sym

def y_t(self):
    y_t = sym.sqrt(self._r_t ** 2 - self._l_f ** 2) - (self._w_ego / 2)
    return y_t

def y_r(self,ego_vel_x,ego_a_ini_x,t):
    expr = ((self.v_ego(ego_vel_x,ego_a_ini_x,t) ** 2 / (self._Mu_rt * self._g)) ** 2 - self._l_c ** 2)
    y_r = sym.sqrt(sym.Max(0, expr))
    return y_r

def y_min(self,ego_vel_x,ego_a_ini_x,t):
    y_min = sym.Max(self.y_t(), self.y_r(ego_vel_x,ego_a_ini_x,t))
    return y_min

def r_min(self,ego_vel_x,ego_a_ini_x,t):
    expr = sym.sqrt(self._l_f ** 2 + (self.y_min(ego_vel_x,ego_a_ini_x,t) + self._w_ego / 2) ** 2)
    r_min = sym.Max(self._r_t, expr)
    return r_min

方程组代码修改部分

tts, delta_t = sym.symbols('tts,delta_t')

e_10 = sym.Eq(
    sym.atan(
        (self.x_obj(x_obj_ini, obj_vel_x, obj_a_ini_x, tts + delta_t) - self.x_ego(x_ego_ini,ego_vel_x,ego_a_ini_x,tts)+ self._l_f) / 
        (self.y_min(ego_vel_x, ego_a_ini_x, tts) - self.y_obj(y_obj_ini, obj_vel_y, obj_a_ini_y,tts + delta_t)
    ) - (
        (self.v_ego(ego_vel_x, ego_a_ini_x, tts) * delta_t) / self.r_min(ego_vel_x, ego_a_ini_x, tts) - 
        sym.asin(sym.Min(1.0, self._l_f / self.r_min(ego_vel_x, ego_a_ini_x, tts)))
    ), 
    0
)

e_11 = sym.Eq(
    (self.x_obj(x_obj_ini, obj_vel_x, obj_a_ini_x, tts + delta_t) - self.x_ego(x_ego_ini, ego_vel_x,ego_a_ini_x,tts)+ self._l_f) ** 2 + 
    (self.y_min(ego_vel_x, ego_a_ini_x, tts) - self.y_obj(y_obj_ini, obj_vel_y, obj_a_ini_y,tts + delta_t)) ** 2 - 
    (self.r_min(ego_vel_x, ego_a_ini_x, tts)) ** 2, 
    0
)
print(sym.solve([e_10, e_11], (tts, delta_t)))

额外提示

  • 若方程组过于复杂,sym.solve可能无法找到解析解,可尝试sym.nsolve进行数值求解,但需提供初始猜测值
  • 确保所有常量(如_r_t、_l_f等)已正确定义为数值或Sympy符号

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:05:20