2016-07-03 10 views
6

こんにちは、私は私が持っているリストである場合、例えば、それを単純化するために、リストの一般的な用語を取得しようとしています:Pythonの:リスト代数の簡素化

List=[['1','A1','B1','Kc','Ka'],['1','A1','B1','D2','Kc','Ka'],['-1','A1','B1','D1','Kc','Ka'],['1','A1','B1','D1','KD','Ka'],['-1','B1','D1','C1','Kc','Ka','KF'],['1','B1','D1','F1','Kc','Kz','Kl']]  

結果として私を与えることができる任意の関数があります:

List_output=[['A1','B1',[['D1',['ka',[['-1','Kc'],['1','KD']]]],['1','Kc','Ka'],['-1','D2','Kc','Ka']]],['B1,D1'[[ 'C1',[-1,'Kc','Ka','kF']],['F1',['1','Kz','Kl','Kc']]] ]] 

私が基本的にやりたいことは、代数的な削減です。

A1 B1 Kcをカ+ A1 B1 D2 Kcをカ-A1 B1 D1 Kcをカ+ A1 B1 D1 KDカ - B1 D1 C1 KcをカKF + B1 D1 F1 KcをKzをのKI

= A1B1 [D1 [ - KcKa] + [D1Kca + KcKa] + B1D1 [-C1 [KcKaKF] + F1 [KcKzKl]]

簡略化のための唯一の要件は、単純化されたすべての用語がKの和または残りに依存する必要があることです。つまり、すべてがKの線形結合の関数である必要があります。 [-KcKa + KDKa]; [KcKaKF] = [[ - 1 '、' Kc '、' Ka ']、[' + 1 '、' KD '、' Ka ']]; ['+1'、 'KC'、 'Ka'、 'KF']

私はSympyを使用しようとしていますが、私が持っている問題は、シンボルを宣言する必要があるsympyを使用してください。どのように私はこの問題に取り組むことができる任意のアイデア?すべての

+0

非常に興味深い質問。ソリューションが何らかの形で最適であるという要件がありますか、あるいは良い簡素化が機能しますか? –

+0

問題に固有の解決策はありません。サブ式は、複数の等価な方法で因数分解することができます。 –

+0

唯一の要件は、すべての単純化がKの和または残りに依存する必要があることです。つまり、すべてがKの – user3671704

答えて

0

まず、SymPy式にあなたのリストを変換:

In [1]: List=[['1','A1','B1','Kc','Ka'],['1','A1','B1','D2','Kc','Ka'],['-1','A1','B1','D1','Kc','Ka'],['1','A1','B1','D1','KD','Ka'],['-1','B1','D1','C1','Kc','Ka','KF'],['1','B1','D1','F1','Kc','Kz','Kl']] 

In [2]: list_add_mul = sympify(List) 

In [4]: expr = Add(*map(lambda x: Mul(*x), list_add_mul)) 

In [5]: expr 
Out[5]: 
A₁⋅B₁⋅D₁⋅KD⋅Ka - A₁⋅B₁⋅D₁⋅Ka⋅Kc + A₁⋅B₁⋅D₂⋅Ka⋅Kc + A₁⋅B₁⋅Ka⋅Kc - B₁⋅C₁⋅D₁⋅KF⋅K 
a⋅Kc + B₁⋅D₁⋅F₁⋅Kc⋅Kl⋅Kz 

exprのはあなたと仕事をしたいSymPy式です。あなたは、単にいくつかの値を置き換えたい場合は、.subsを使用します。次に、置き換えることができる

>>> var("Ka, Kc, Kz") 

In [6]: expr.subs({Ka: 25.0, Kc: 7.0, Kz: 3.5}) 
Out[6]: 
25.0⋅A₁⋅B₁⋅D₁⋅KD - 175.0⋅A₁⋅B₁⋅D₁ + 175.0⋅A₁⋅B₁⋅D₂ + 175.0⋅A₁⋅B₁ - 175.0⋅B₁⋅C₁ 
⋅D₁⋅KF + 24.5⋅B₁⋅D₁⋅F₁⋅Kl 

は、使用しようとしているシンボルを定義することを忘れないでくださいそれ以外の場合は、変数の置換ルールを定義することができます。例えば、辞書に入れ:

{ 
    Ka: ... , 
    Kc: ... , 
    KD: ... , 
    KF: ... , 
} 

をあなたは新しい変数を含む適切な表現でドットを交換する必要があります。これらの新しい変数は、K定数の組み合わせを表す必要があります。

例:c1 = -Kc * Ka + KD * Ka、_c2 = ... _これらの式を逆にします。あなたのケースでは

、あなたの表現が適切に反転させることができないと表示されます。

>>> solve([Eq(-Kc*Ka + KD*Ka, c1), Eq(Kc*Ka*KF, c2), Eq(-Kc*Ka + KD*Ka, c3), Eq(Kc*Ka*KF, c4)], Ka, Kc, KD, KF) 
[] 
+0

私はすべてのステップを行いましたが、expr.subs({Ka:25.0、Kc:7.0、Kz:3.5}コマンドを取得しました:名前 'Ka'は定義されていません – user3671704

+0

あなたは使用するすべての変数を定義する必要があります。私は答えを更新しました。 –

0

私はあなたが代数的操作は、あなたが何をしたいのかを知っていると思いますが、あなたが「K」の記号を抜け出すにハングアップしていますsympyの? sympyは変数名を推測するのにはかなり良いです。あなただけの式構築することができます。

In [1]: import sympy 

In [2]: List=[['1','A1','B1','Kc','Ka'],['1','A1','B1','D2','Kc','Ka'],['-1','A 
    ...: 1','B1','D1','Kc','Ka'],['1','A1','B1','D1','KD','Ka'],['-1','B1','D1', 
    ...: 'C1','Kc','Ka','KF'],['1','B1','D1','F1','Kc','Kz','Kl']]  

In [3]: expression = sympy.Add(*[sympy.Mul(*[sympy.S(y) for y in x]) for x in L 
    ...: ist]) 

In [4]: expression 
Out[4]: A1*B1*D1*KD*Ka - A1*B1*D1*Ka*Kc + A1*B1*D2*Ka*Kc + A1*B1*Ka*Kc - B1*C1*D1*KF*Ka*Kc + B1*D1*F1*Kc*Kl*Kz 

をそしてシンボルのリストを取得:あなたはシンボルのリストを持っていたら、「K」で始まるものをつかむために簡単です

In [5]: all_symbols = [x for x in expression.atoms() if type(x)==sympy.Symbol] 

In [6]: all_symbols 
Out[6]: [Kc, B1, KF, A1, Kz, Ka, D1, C1, F1, D2, KD, Kl] 

を、またはしないでください:

In [7]: solvefor = [x for x in all_symbols if str(x)[0]!="K"] 

In [8]: solvefor 
Out[8]: [B1, A1, D1, C1, F1, D2] 

In [9]: sympy.horner(expression, wrt=solvefor) 
Out[9]: B1*(A1*(D1*(KD*Ka - Ka*Kc) + D2*Ka*Kc + Ka*Kc) + D1*(-C1*KF*Ka*Kc + F1*Kc*Kl*Kz))