加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

如何重新排列包含关系运算符的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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读