Bagaimana cara menyederhanakan persamaan simpy?

Pertimbangkan persamaan matriks sederhana ini:

from sympy import *

c_a, s_a = symbols('c_a s_a')
k_1, k_2, k_3, k_4, k_5, k_6 = symbols('k_1 k_2 k_3 k_4 k_5 k_6')
x,y,z = symbols('x y z')

equation = Eq(MatrixSymbol('R',4,4), Matrix([
[     c_a*k_1 - k_1 + 1, -c_a*k_4 + k_4 - s_a*z, -c_a*k_5 + k_5 + s_a*y,         0],
[-c_a*k_4 + k_4 + s_a*z,      c_a*k_2 - k_2 + 1, -c_a*k_6 + k_6 - s_a*x,         0],
[-c_a*k_5 + k_5 - s_a*y, -c_a*k_6 + k_6 + s_a*x,      c_a*k_3 - k_3 + 1,         0],
[                     0,                      0,                      0, c_a + s_a]]))

Saya telah mencoba menyederhanakan untuk sementara waktu tetapi tidak berhasil... seperti yang Anda lihat ada banyak kemungkinan faktorisasi (yaitu: k_1*(c_a-1), k_4(1-c_a), ...). Saya telah mencoba banyak metode yang tersedia yang dimiliki sympy untuk menyederhanakan https://docs.sympy.org/latest/tutorial/simplification.html tetapi tidak berhasil... memfaktorkan, menyederhanakan, mengumpulkan, menerapkan fungsi(faktor), menyederhanakan(force=True) dll.

Saya seorang pemula dengan sympy jadi mungkin ada cara yang jelas untuk menyederhanakan lebih lanjut persamaan jenis ini, jika ya, bagaimana caranya?

Selain itu, saya hanya tertarik untuk menyederhanakan rhs persamaan tersebut, bukan lhs. Apakah mungkin untuk menyederhanakan salah satu dari keduanya atau keduanya?


person BPL    schedule 01.05.2020    source sumber
comment
Mungkin lebih ke soal matematika?   -  person Torxed    schedule 01.05.2020
comment
Saya datang ke sini dan berkata, ya, saya akan mencoba menjawab! Lalu saya melihat persamaannya dan ketakutan ;-)   -  person xilpex    schedule 01.05.2020
comment
@Torxed Pada awalnya saya berpikir apakah itu untuk situs pertukaran tumpukan matematika tetapi kemudian saya memutuskan tidak. Ini tentang saya yang tidak bisa menggunakan sympy dengan benar... yang saya yakin bisa menyelesaikan masalah sederhana ini tanpa susah payah... :/   -  person BPL    schedule 01.05.2020


Jawaban (1)


Ini adalah kasus DIY. Sesuatu seperti berikut ini mungkin cocok untuk Anda:

>>> def most_collect(eq):
...     f = eq.free_symbols
...     if not f: return eq
...     F = sorted(f, key=lambda x: eq.count(x))
...     return collect(eq, F[-1])
>>> equation.rhs.applyfunc(most_collect)
Matrix([
[    k_1*(c_a - 1) + 1, k_4*(1 - c_a) - s_a*z, k_5*(1 - c_a) + s_a*y,         0],
[k_4*(1 - c_a) + s_a*z,     k_2*(c_a - 1) + 1, k_6*(1 - c_a) - s_a*x,         0],
[k_5*(1 - c_a) - s_a*y, k_6*(1 - c_a) + s_a*x,     k_3*(c_a - 1) + 1,         0],
[                    0,                     0,                     0, c_a + s_a]])
person smichr    schedule 01.05.2020
comment
Terima kasih tuan! Jawaban yang sangat bagus, pasti berhasil untuk saya... btw, saya berasumsi Anda adalah seorang ninja yang simpatik jadi... bolehkah saya bertanya kapan Anda memutuskan ini saat yang tepat untuk menangani kasus DIY? Sebagai seorang pemula yang simpatik, saya mulai dengan menggunakan penyederhanaan (yang saya baca menggunakan beberapa heuristik) dan kemudian hanya menggunakan fungsi bawaan... Untuk rumus sederhana ini jelas kita bisa melakukan lebih baik untuk rumus yang lebih kompleks... bagaimana kamu tahu kamu tidak mendapatkan yang terbaik dari sympy? Ngomong-ngomong... pertanyaan di luar topik tapi, apakah ada cara mudah untuk mengekstrak simbol yang tersedia dari satu persamaan? - person BPL; 01.05.2020
comment
Matriks adalah kumpulan ekspresi dan dalam kasus Anda masing-masing memiliki pola -- simbol yang muncul di lebih dari satu suku -- yang tidak selalu melibatkan simbol yang sama. Jadi ini bukan situasi umum. Anda tahu Anda tidak mendapatkan yang terbaik ketika Anda tidak menyukai apa yang Anda dapatkan ;-) Adapun mengekstraksi simbol yang tersedia: lihat penggunaan fungsi eq.free_symbols; atribut itu memberikan sekumpulan semua simbol tidak terikat yang digunakan. - person smichr; 01.05.2020