2017-10-18 22 views
1

どの数式が等しいかチェックしたいと思います。 私はこれをPythonを使ってやりたいと思います。私はそれをSympyで試しました。Sympyを使ってシンボリックな数式をPythonと比較する

私のアイデアは、同等のペアが同じ表現に縮小されるような表現を減らすためにsimplifyを使用することでした。 次に、2つのforループでそれらをすべて互いに引き離し、結果がゼロに等しいかどうかを確認します。

残念なことに、ゼロになることはありませんが、これは正しいとは思われません。 私はおそらく単純化機能は本当に私が必要としていないと思う。 2つの式が実際に数学的に等しいかどうかをチェックする関数が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:それはあなたが望むものであるように

sympy.core.relationalから)Eq機能が見えます。より複雑な引数が与えられている場合は、結果を得るためにはsimplifyにする必要があります(リンクの最後のコード例を参照)。

注:ループ用のものは正しく表示されません。最初のものはインデックス0から5まで、2番目のものはi + 1から6までしかないので、リストの最後のアイテムは完全にスキップされます。

+0

ありがとう、私はEqで動作させるようにしようとします!メモに関しては、私がポイントを得るかどうかはわかりません。限り、私の理解に行く私は最初のforループは0から6(例:x1からx7)とi + 1から7まで反復すると思います。リストの最後の要素は2番目のループでのみ発生する必要があります。これはダブルカウント防止の効果です。私はPythonで/間違ったループでインデックスが間違っていますか? – Piri

+0

'range'は2番目の引数には含まれていません(つまり' range(3)== [0,1,2] ') –

関連する問題