2017-03-22 5 views
2

三角関数の度数を使用するデータがあります。三角法が使用されているかどうかを調べ、シンボル変数を追跡する

私はsympyを使用し、三角関数にはラジアンを使用するので、度を変換して使用できるようにしたい。

しかし、どのシンボル変数が三角関数の入力として使用されたのかわかりません。

だから、私のようなものを持っています:

import sympy 
from sympy import mpmath 

a = 2 
b = 30 
a,b = sympy.symbols('a b') 
expr = 'sqrt(a + cos(b))' 
expres = sympy.sympify(expr) 

print(expres.atoms(sympy.cos)) 

b30であり、(sympyが期待するように、cos(b)計算で、それは、ラジアン度であってはならないこと)度です。

しかし、私が言ったように、プログラムが実行される別の時間は、三角法のための別のシンボル変数を使用します。または、複数の三角関数。

atomsを使用すると、三角関数があるかどうかを調べることができました。そして、どういうわけか、対応する記号変数が使用されている場所であればどこでもラジアンの代わりに度を使用します。

これを行う方法はありますか?

答えて

2

この問題を回避するための最もきれいな方法は、カスタム定義を使用するようにsympifyを伝えることですたとえば、次のような記号/文字列を選択した場合:

from sympy.abc import * 
from sympy import sin, pi, Lambda, sympify 

sin_degree = Lambda(x, sin(x*pi/180)) 
degree_trigs = {"sin": sin_degree} 

expr_string = "sin(a) + sin(b**d + exp(c))" 
expr = sympify(expr_string, locals=degree_trigs) 
print(expr) 

返信:

sin(pi*a/180) + sin(pi*(b**d/180 + exp(c)/180)) 
+0

ありがとうございます!それはうまく動作します(upvoted) – George

1

あなたはこのように、例えば、関数でsubsを使用することができます。

from sympy.abc import * 
from sympy import sin, exp, pi, Lambda 

sin_degree = Lambda(x, sin(x*pi/180)) 

expr = sin(a) + sin(b**d + exp(c)) 
print(expr.subs(sin,sin_degree)) 

これが返されます。おそらく

sin(pi*a/180) + sin(pi*(b**d/180 + exp(c)/180)) 
関連する問題