如何重新排列包含关系运算符的sympy表达式
发布时间:2020-12-20 13:49:45 所属栏目:Python 来源:网络整理
导读:我有包含关系运算符,符号和常量的表达式.我想重新排列表达式,以便(尽可能)所有常量项都在关系运算符的一侧,而剩下的项在另一侧.例如,我想重新排列: x-5 y – z 至: x – y z五 这样做有没有现成的同情方法?如果没有,我应该从哪里开始延伸同情? 解决方法
我有包含关系运算符,符号和常量的表达式.我想重新排列表达式,以便(尽可能)所有常量项都在关系运算符的一侧,而剩下的项在另一侧.例如,我想重新排列:
x-5> y – z 至: x – y z>五 这样做有没有现成的同情方法?如果没有,我应该从哪里开始延伸同情? 解决方法
有点令人惊讶的是,我无法找到一种“开箱即用”的方法.您可以使用
this question中的方法使任何一个变量成为不等式的左侧(LHS)的唯一主题,但我似乎无法使常数项成为主题.
所以,我写了自己的版本并在下面重现.我已经根据给出的示例和其他一些示例对其进行了测试.它试图使右侧(RHS)由零或仅基于可选参数的常数项组成.可能存在失败的极端情况 – 谨慎使用/修改. 码: import sympy from sympy.core.relational import Relational mult_by_minus_one_map = { None: '==','==': '==','eq': '==','!=': '!=','<>': '!=','ne': '!=','>=': '<=','ge': '<=','<=': '>=','le': '>=','>': '<','gt': '<','<': '>','lt': '>',} def move_inequality_constants(ineq,zero_on_right=False): l = ineq.lhs r = ineq.rhs op = ineq.rel_op all_on_left = l - r if zero_on_right: return Relational(all_on_left,sympy.sympify(0),op) else: coeff_dict = all_on_left.as_coefficients_dict() var_types = coeff_dict.keys() new_rhs = sympy.sympify(0) for s in var_types: if s == 1: all_on_left = all_on_left - coeff_dict[s] new_rhs = new_rhs - coeff_dict[s] if new_rhs < 0: all_on_left = all_on_left * -1 new_rhs = new_rhs * -1 op = mult_by_minus_one_map[op] return Relational(all_on_left,new_rhs,op) # test code to demo function below from sympy.abc import x,y,z test_ineqs = [ x - 5 > y - z,x**2 + x - 5 > y + x**2 - z,x + 5 > y - z,x**3 + y**2 >= x + 5*y - z - 15] for k in test_ineqs: print('Re-arranging '+ str(k)) kn = move_inequality_constants(k) print('Gives '+str(kn)) print('Or equivalently ' + str(move_inequality_constants(k,True))) print('====') 输出: Re-arranging x - 5 > y - z Gives x - y + z > 5 Or equivalently x - y + z - 5 > 0 ==== Re-arranging x**2 + x - 5 > x**2 + y - z Gives x - y + z > 5 Or equivalently x - y + z - 5 > 0 ==== Re-arranging x + 5 > y - z Gives -x + y - z < 5 Or equivalently x - y + z + 5 > 0 ==== Re-arranging x**3 + y**2 >= x + 5*y - z - 15 Gives -x**3 + x - y**2 + 5*y - z <= 15 Or equivalently x**3 - x + y**2 - 5*y + z + 15 >= 0 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |