我有一个很长的表达式,我想简化它,但假设方程成立

问题描述

在 Mathematica 中,您可以使用函数 FullSimplify[expression,assumptions] 使用假设来简化表达式。例如,如果我这样做:

完全简化[x^2-y^2,x^2-y^2==1],

那么结果将是 1,因为这是“最简单的表达式,相当于我给软件提供的函数

现在我需要用 Python 做同样的事情,但我不知道该怎么做。我在此页面上看到了有关命令 sympy.refine 的文档:

https://docs.sympy.org/latest/modules/assumptions/refine.html

但是,我无法使用等式作为假设。似乎不可能用 Q 函数来假设这样的事情。

我曾尝试做这样的事情:

import sympy as sp
x,y=sp.symbols('x y')
sp.refine(x**2-y**2,x==y)

但是,这给了我以下错误:ValueError:不一致的假设

有人对此有任何想法吗?谢谢。

解决方法

如果没有关于您想要使用的表达式和假设的范围,这可能是一个无法解决的问题,所以我会做一些假设。

如果您想基于其他多项式表达式为零来简化多项式表达式,那么您可以使用 ratsimpmodprime 在 sympy 中执行此操作:

In [1]: x,y = symbols('x,y')

In [2]: assumptions = [x**2 + y**2 - 1]

In [3]: expression = x**2 + y**2

In [4]: ratsimpmodprime(expression,assumptions)
Out[4]: 1

https://docs.sympy.org/latest/modules/simplify/simplify.html#ratsimpmodprime

,

我尝试了两种方法来解决这个问题。

  1. 假设 Payee。这是我能找到的表达您想要做出的假设的唯一方法。不幸的是,它似乎不够聪明,没有注意到这个假设允许它用 x 代替 y。

     @Override
    public void onBindViewHolder(@NonNull ViewHolder holder,int position) {
    
        final Transaction transaction = tTransactions.get(holder.getAdapterPosition());
    
    
       holder.payee.setText( ????????? ) ;        
       holder.date.setText(date);
       holder.transAmount.setText(amount);
    

    这只是返回原始表达式。

  2. 请 sympy 替换表达式。这不是自动的 - 您要求它进行替换而不是给它进行替换的选项,但它确实适用于这个玩具示例。

    x - y = 0

    打印 1。