2016-07-03 5 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']]] ]] 

Что я в основном хочу сделать и алгебраическое сокращение.

А1 В1 Кс Ка + A1 B1 D2 Кс Ка -A1 В1 Д1 Кс Ка + A1 B1 D1 КД Ка - В1 С1 D1 Кс Ка KF + B1 D1 F1 Кс Кз Кл

= А1В1 [D1 [- KcKa + KDKa] + D2KcKa + KcKa] + B1D1 [-C1 [KcKaKF] + F1 [KcKzKl]]

Единственное требование упрощения состоит в том, что все упрощенные члены должны зависеть от суммы или остатка K. Другими словами, все должно быть функцией линейной комбинации K; [-KcKa + KDKa]; [KcKaKF] = [[ '- 1', 'Кс', 'Ка'], [ '+ 1', 'КД', 'Ка']]; ['+1', 'Kc', 'Ka', 'KF']

Я пытаюсь использовать Sympy, но проблема заключается в том, что условия для сокращения исходят от оборудования, поэтому я никогда не знаю, что означают символы быть и использовать sympy, вам нужно объявить символы. Любая идея, как я могу решить эту проблему?

+0

Очень интересный вопрос. У вас есть какие-либо требования к тому, чтобы решение было каким-то образом оптимальным, или любое хорошее упрощение работает? –

+0

Ваша проблема не имеет уникального решения: подвыражения могут быть учтены более чем одним эквивалентным образом. –

+0

Единственное требование состоит в том, что все упрощения должны зависеть от суммы или остатка K. Другими словами, все должно быть функцией линейной комбинации K's – 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 

Теперь выражение это выражение 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)), command Я получил: имя 'Ka' не определено – user3671704

+0

Вам нужно определить все переменные, которые вы собираетесь использовать. Я обновил ответ. –

0

Я думаю, вы знаете, что алгебраические манипуляции вы хотите сделать, но вы вешали на получение символов «K» из симпы? 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 

А затем получить список символов:

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] 

После того, как у вас есть список символов, это тривиально, чтобы захватить те, которые начинаются с «K» , или нет:

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))