簡體   English   中英

使用 Sympy 將符號數學表達式與 Python 進行比較

[英]Comparing symbolic mathematical expressions with Python using Sympy

我想檢查哪些數學表達式是相等的。 我想用 Python 來做到這一點,我用 Sympy 試過了。

我的想法是使用simple來減少表達式,這樣一對相等的將被簡化為相同的表達式。 然后我在我的兩個 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])

a.equals(b)方法會非常努力地(包括對變量使用隨機值)來證明a == b 但請注意,兩個表達式可能僅對給定的值范圍相等。 因此,最好指出您的符號是positiveinteger ,例如Symbol('n', integer=True)Symbol('a', positive=True) 如果你這樣做,那么a.equals(b) simplify(a - b)a.equals(b)將更可能減少到0。

posify是一個函數,可以用具有正假設的符號替換符號; 當符號為正時,請參閱下面的 x6 和 x7 如何簡化:

>>> from sympy import posify
>>> dif = x6 - x7
>>> dif.simplify() == 0
Ealse
>>> posify(dif)[0].simplify()  # [0] gets the the positive-symbol expression

您也可以使用x._random(lo,LO,hi,HI)自己進行數值替換x._random(lo,LO,hi,HI)其中(lo, hi)是數字實部的下限和上限, (LO, HI)是相同的虛部,例如x._random(0,0,1,0)將給出一個介於 0 和 1 之間的實數隨機值。創建一個替換字典並替換值並檢查ab差值的絕對值。 像這樣(使用上面介紹的循環):

for i in range (0 , 6):
  for k in range (i+1 , 7):
    v = L[i]-(L[k])
    reps = {i: i._random(0,0,1,0) for i in v.free_symbols}
    v = v.xreplace(reps).n()
    if abs(v) < 1e-9:
      print(L[i],L[k],abs(v))

檢查功能是否相等的另一種方法是在大約幾千點評估它們並檢查輸出。

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

從文檔

Eq函數(來自sympy.core.relational )看起來像是您想要的。 請注意,如果給它更復雜的參數,則必須simplify以獲得結果(請參閱鏈接中的最后一個代碼示例)。

注意:那些for循環看起來不正確。 第一個僅通過索引0-5,第二個僅通過i + 1至6,因此列表中的最后一項將被完全跳過。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM