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需要比较大小)时,就会触发该错误。
修改步骤
- 替换所有
math模块函数为Sympy对应函数:math.sqrt→sym.sqrtmath.atan→sym.atanmath.asin→sym.asin
- 替换普通
max/min为Sympy的sym.Max/sym.Min,这两个函数支持符号运算 - 确保所有涉及符号变量的运算均使用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
相关产品推荐
相关产品推荐

