จะทำให้สมการซิมปีง่ายขึ้นได้อย่างไร?

พิจารณาสมการเมทริกซ์อย่างง่ายนี้:

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

ฉันพยายามลดความซับซ้อนมาระยะหนึ่งแล้วโดยไม่ประสบความสำเร็จ... อย่างที่คุณเห็นว่ามีการแยกตัวประกอบที่เป็นไปได้มากมาย (เช่น: k_1*(c_a-1), k_4(1-c_a), ...) ฉันได้ลองใช้วิธีการที่มีอยู่หลายวิธีแล้วที่ Sympy ต้องลดความซับซ้อนของ https://docs.sympy.org/latest/tutorial/simplification.html แต่ไม่มีโชค... ปัจจัย, ลดความซับซ้อน, รวบรวม, Applyfuncs(factor), simplifiy(force=True) เป็นต้น

ฉันเป็นมือใหม่ที่มีความเห็นอกเห็นใจ ดังนั้นอาจมีวิธีที่ชัดเจนในการทำให้สมการประเภทนี้ง่ายขึ้น หากเป็นเช่นนั้น ทำอย่างไร

นอกจากนี้ ฉันแค่สนใจที่จะทำให้ rhs ของสมการง่ายขึ้น ไม่ใช่ lhs เป็นไปได้ไหมที่จะลดความซับซ้อนของสิ่งใดสิ่งหนึ่งหรือทั้งสองอย่าง?


person BPL    schedule 01.05.2020    source แหล่งที่มา
comment
อาจจะเป็นปัญหาทางคณิตศาสตร์มากกว่านั้น?   -  person Torxed    schedule 01.05.2020
comment
ฉันมาที่นี่แล้วก็แบบว่า ฮะ ฉันจะพยายามตอบให้ได้! เห็นสมการแล้วตกใจ ;-)   -  person xilpex    schedule 01.05.2020
comment
@Torxed ตอนแรกฉันคิดว่ามันจะเป็นเว็บไซต์แลกเปลี่ยนสแต็คคณิตศาสตร์หรือเปล่า แต่แล้วฉันก็ตัดสินใจว่าไม่ใช่ เรื่องนี้เป็นเรื่องของผมที่ไม่สามารถใช้ Sympy ได้อย่างเหมาะสม... ซึ่งผมค่อนข้างมั่นใจว่าจะสามารถแก้ปัญหาง่ายๆ นี้ได้สบายๆ ครับ... :/   -  person BPL    schedule 01.05.2020


คำตอบ (1)


นี่คือกรณี DIY สิ่งต่อไปนี้อาจใช้ได้ผลสำหรับคุณ:

>>> 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
ขอบคุณท่าน! คำตอบที่ดีจริงๆ มันใช้ได้ผลสำหรับฉันแน่นอน... อย่างไรก็ตาม ฉันคิดว่าคุณเป็นนินจาจอมขี้สงสาร ดังนั้น... ฉันขอถามเมื่อคุณตัดสินใจว่าเป็นเวลาที่ดีที่จะทำเคส DIY หรือไม่ ในฐานะมือใหม่ ฉันเริ่มต้นด้วยการใช้ simplify (ซึ่งฉันอ่านเจอว่าใช้การวิเคราะห์พฤติกรรมบางอย่าง) จากนั้นก็แค่ใช้ฟังก์ชันบิวท์อิน... สำหรับสูตรง่ายๆ นี้ เห็นได้ชัดว่าเราสามารถทำได้ดีกว่าสำหรับสูตรที่ซับซ้อนกว่านี้... คุณรู้ได้อย่างไร คุณไม่ได้รับสิ่งที่ดีที่สุดจากความเห็นอกเห็นใจเหรอ? ยังไงซะ... คำถามนอกประเด็น แต่มีวิธีง่ายๆ ในการแยกสัญลักษณ์ที่มีอยู่ออกจากสมการเดียวหรือไม่? - person BPL; 01.05.2020
comment
เมทริกซ์คือชุดของนิพจน์ และในกรณีของคุณ แต่ละนิพจน์จะมีรูปแบบ ซึ่งเป็นสัญลักษณ์ที่ปรากฏในคำศัพท์มากกว่าหนึ่งคำ ซึ่งไม่เกี่ยวข้องกับสัญลักษณ์เดียวกันในแต่ละครั้ง ดังนั้นจึงไม่ใช่สถานการณ์ทั่วไป คุณรู้ว่าคุณไม่ได้สิ่งที่ดีที่สุดเมื่อคุณไม่ชอบสิ่งที่คุณได้รับ ;-) สำหรับการแยกสัญลักษณ์ที่มีอยู่: ดูการใช้ฟังก์ชันของ eq.free_symbols; คุณลักษณะนั้นให้ชุดของสัญลักษณ์ที่ไม่ผูกมัดทั้งหมดที่ใช้ - person smichr; 01.05.2020