Sympy.solve处理不等式无法分离目标变量b的解决方法
使用SymPy将不等式转换为指定变量形式的正确方法
问题场景
需要将不等式 a >= ((b-c)/2)*tan(d) 转换为以b为主体的形式,当前代码输出未达到预期:
用户原代码:
import numpy as np import math import sympy as sy a = sy.symbols('a') b = sy.symbols('b') c = sy.symbols('c') d = sy.symbols('d') eq = sy.Ge(a, ((b-c)/2)*sy.tan(d)) result = sy.solve(eq, 'b') print(result)
运行输出:
-b*tan(d)/2 >= -a - c*tan(d)/2
期望输出:
b >= (2*a + c*tan(d))/tan(d)
解决方法
SymPy的solve函数处理不等式时仅返回初步解,不会自动完成最终的移项化简。可以通过以下两种方式实现需求:
方法1:手动化简solve的结果
对solve返回的不等式进行移项和符号处理(注意乘以负数时不等号方向反转):
import sympy as sy a, b, c, d = sy.symbols('a b c d') # 定义不等式 ineq = sy.Ge(a, ((b - c)/2)*sy.tan(d)) # 求解得到初步结果 raw_result = sy.solve(ineq, b)[0] # 对初步不等式进行变形:两边乘以-2,反转不等号方向 processed_ineq = sy.Ge(-2 * raw_result.rhs, -2 * raw_result.lhs) # 化简得到最终形式 final_result = sy.simplify(processed_ineq) print(final_result)
方法2:使用reduce_inequalities直接求解
reduce_inequalities会自动完成更彻底的化简,直接得到变量单独在一侧的结果:
import sympy as sy a, b, c, d = sy.symbols('a b c d') ineq = sy.Ge(a, ((b - c)/2)*sy.tan(d)) # 直接求解并整理为以b为主体的形式 result = sy.reduce_inequalities(ineq, b) print(result)
两种方法运行后都会输出预期的:b >= (2*a + c*tan(d))/tan(d)
内容的提问来源于stack exchange,提问作者Razor
相关产品推荐
相关产品推荐

