2017-10-18 82 views
1

我想檢查哪些數學表達式是相等的。 我想用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

回答

0

另一種方法來檢查,如果功能等於將很可能在評估他們幾個千分點,並檢查輸出。

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

0

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]')上 –