2017-07-19 8 views
3

sympyを使用して、exp(C+anything)のすべての出現をC*exp(anything)に置き換える必要があります。 exp(C)は定数なので、私はちょうどCと書いています。パターンのパターン一致と式内の部分式のすべての出現の変更方法

私は式の中expの発生のためにこれを行うことができます。しかし、1つのインスタンスが存在する場合、それを行う方法はしないでください。例えば

、1つのインスタンスの、x+exp(C_0+3*x)+3*yのように、私は1つのインスタンスのx+C_0*exp(3*x)+3*y

にそれを変更する必要があり、これは

を与えるいくつかの試行錯誤

from sympy import * 
x,y,C_0 = symbols('x y C_0') 
expr=x+exp(C_0+3*x)+3*y 
#first check if exp is in the expression 
if any([isinstance(a, exp) for a in preorder_traversal(expr)]): 
    p_1=Wild('p1');p_2=Wild('p_2');p_3=Wild('p_3') 
    r=(p_1+exp(C_0+p_2)+p_3).matches(expr) 
    expr.subs(exp(C_0+r[p_2]),C_0*exp(r[p_2])) 

後に動作するようです

C_0*exp(3*x) + x + 3*y 

私はのように何かに変更する必要がありますx+C_0*exp(3*x)+3*y+C_0*exp(30*x+y)私はできません可能性のあるケースごとにパターンが一致します。私はを変更する方法を必要とするすべての

私は実際にちょうど変化にはPythonを伝えることを好む

Mathematica graphics

を与える

expr = x + Exp[c + 3*x]*3*y + 3*y + Exp[c + 30*x + y] 
expr /. Exp[c + any_] :> (c Exp[any]) 

を次のように私は上記の操作を行い、Mathematicaでは

をオカレンスexp(C+anything)C*exp(anything)のように、表現全体にパターンを与える必要はありません。これは、多くの点で変化する可能性があるためです。

これはpython/sympyでも可能です。どのようにそれを行うためのヒント?

+0

脇に:SymPy式は不変です: 'expr.subs'メソッドは' expr'を変更しないので、返される値は何かに代入する必要があります。 – FTP

+0

@Alexはい、私はそれを知っていました、私は今のところ結果を印刷していました。 – Nasser

答えて

1
私は表現の内部で機能 expを探します

は、その引数がAddあり、その後、C_0Addの引数の間にあるかどうかかどうかを確認します。その後、expをに置き換えるものを作ります。次の点を考慮

from sympy import * 
x, y, C_0 = symbols('x y C_0') 
expr = x + exp(C_0+3*x) + 3*y + exp(y+C_0+30*x) - exp(x+y-C_0) + exp(x*y) 

exp_sum = [(a, a.args[0].args) for a in preorder_traversal(expr) if a.func == exp and a.args[0].func == Add] 
exp_sum = [p for p in exp_sum if C_0 in p[1]] 

new_exp = [C_0*exp(Add(*[x for x in p[1] if x != C_0])) for p in exp_sum] 

for (old, new) in zip(exp_sum, new_exp): 
    expr = expr.subs(old[0], new) 

当初、exp_sumはフォームexp(Add(...))のすべての部分が含まれています。その後、それは合計がC_0を含むようにフィルタリングされます。新しい指数は、C_0でない合計被乗数を取って加算し、expを適用して、C_0を掛けることによって形成されます。その後、置換が行われます。

プロセスを明確にするために、ここでexp_sumは上記の例にあるものです:タプル(指数及び内部加数)のリスト:

[(exp(C_0 + 3*x), (C_0, 3*x)), (exp(C_0 + 30*x + y), (C_0, y, 30*x))] 

そして、これはnew_exp最後に

[C_0*exp(3*x), C_0*exp(30*x + y)] 

です、最後にexpr

C_0*exp(3*x) + C_0*exp(30*x + y) + x + 3*y + exp(x*y) - exp(-C_0 + x + y) 

Notic eそのexp(-C_0 ...)は変更の影響を受けません。パターンの一部ではありません。

関連する問題