使用Sympy比较符号数学表达式和Python

使用Sympy比较符号数学表达式和Python

问题描述:

我想检查哪些数学表达式是相等的。 我想用Python来做这件事,我用Sympy试了一下。使用Sympy比较符号数学表达式和Python

我的想法是使用简化来减少表达式,使得相等的一对将被简化为相同的表达式。 然后,我将它们全部放在我的两个for循环中,并检查结果是否等于零。

不幸的是,没有减法不会导致零,这是非常不可能是正确的。 我认为这可能是简化函数并不真正做我所需要的。 在sympy中有一个函数来检查两个表达式在数学上是否确实相等?

这是我到目前为止的代码:

from sympy import * 

a = symbols ('a') 
b = symbols ('b') 
n = symbols ('n') 
m = symbols ('m') 

x1=simplify(log(a,n**(log(b,a)))) 
x2=simplify(((a**n)/(b**m))**(1/b)) 
x3=simplify(b**(n*log(a))) 
x4=simplify(log(b,n)) 
x5=simplify(a**((n-m)/b)) 
x6=simplify(n*(log(a)+log(b))) 
x7=simplify(log((a**n)*(b**n))) 
x8=simplify(a**(log(b**n))) 

L=[x1,x2,x3,x4,x5,x6,x7,x8] 



for i in range (0 , 6): 

    for k in range (i+1 , 7): 

     print(L[i]-L[k]) 
+0

这些表达式中的任何一个实际上是否相等?我没有看到这些。 –

+0

应该有一些通过进行各种转换而在数学上相等的例如基地转移等。 – Piri

另一种方法来检查,如果功能等于将很可能在评估他们几个千分点,并检查输出。

from sympy import * 

def generateOutput(L, x): 
    # x -> list of points to evaluate functions at (maybe randomly generated?) 
    # L -> input list of functions 
    # returns list of outputs of L[i] applied to x 



a = symbols ('a') 
b = symbols ('b') 
n = symbols ('n') 
m = symbols ('m') 

x1=simplify(log(a,n**(log(b,a)))) 
x2=simplify(((a**n)/(b**m))**(1/b)) 
x3=simplify(b**(n*log(a))) 
x4=simplify(log(b,n)) 
x5=simplify(a**((n-m)/b)) 
x6=simplify(n*(log(a)+log(b))) 
x7=simplify(log((a**n)*(b**n))) 
x8=simplify(a**(log(b**n))) 

L=[x1,x2,x3,x4,x5,x6,x7,x8] 

outputs = generateOutput(L) 
# Compare outputs 
+0

谢谢你的想法!这确实会简化任务。为函数使用大量随机生成的参数应该提供足够的准确性来互相检查它们 – Piri

From the docs

Eq功能(从sympy.core.relational)看起来是你想要的。请注意,如果给出更复杂的参数,您将必须simplify才能获得结果(请参阅链接中的最后一个代码示例)。

注意:那些for循环看起来不正确。第一个仅通过索引0-5,第二个仅通过i + 1到6,因此列表中的最后一个项目将被完全跳过。

+0

谢谢,我会尽力使它与Eq一起工作!关于说明,我不确定我是否明白这一点。据我的理解,我认为第一个for循环从0到6(例如x1到x7)迭代,第二个从i + 1到7迭代。列表中的最后一个元素应该只出现在第二个循环中。这是防止重复计数的效果。我在Python中/在foor循环中得到错误的索引吗? – Piri

+0

'range'不包含在第二个参数(即'range(3)== [0,1,2]')上 –