Phương trình con lắc đôi python

Mô phỏng con lắc đôi. SymPy

nhập numpy as np nhập matplotlib. pyplot as plt nhập sympy . from matplotlib. hoạt ảnh nhập FFMpegWriter từ matplotlib . . bản vá nhập Vòng kết nối

Tạo phương trình Euler-Lagrange qua SymPy

# Tham số con lắc. m_1 = 1 # kg . 8 = 1 # kg l_1 = 1 # m l_2 = 1 # m g = 9.8 # m/s^2 # Tạo ký hiệu cho thời gian. t = sympy . Biểu tượng (không') # Creates symbolic variable t # Create Generalized Coordinates as a function of time: q = [theta_1, theta_2] th1 = sympy . Hàm ('th1')(t) th2 = sympy. Hàm ('th2') . t) # Position Equation: r = [x, y] r1 = np . mảng ([ l_1 * . sympy. tội lỗi ( th1 ), . -l_1 * sympy. cos ( th1 )] . ) # Position of first pendulum r2 = np. mảng ([ l_2 * . sympy. tội lỗi ( th2 ) + . r1[0], -l_2 * sympy. cos ( th2 ) + . d/dt(r) = [dx/dt, dy/dt] r1[1]]) # Position of second pendulum # Velocity Equation: d/dt(r) = [dx/dt, dy/dt] v1 = np . mảng ([ r1 [ . 0]. khác ( t ), . r1[1]. khác ( t )] . ) # Velocity of first pendulum v2 = np. mảng ([ r2 [ . 0]. khác ( t ), . r2[1]. khác ( t )] . ) # Velocity of second pendulum # Energy Equations: T = 1/2 . * m_1 * np. chấm ( v1 , v1 . ) + 1/2 * m_2 * np. chấm ( v2 , v2 . ) # Kinetic Energy V = m_1 * g * r1[1] + m_2 * g * r2[1] # Potential Energy L = T - V # Lagrangian # Lagrange Terms: dL_dth1 = L . khác ( th1 ) dL_dth1_dt . = L. khác ( th1 . khác ( t )) . . khác ( t ) dL_dth2 . = L. khác ( th2 ) dL_dth2_dt . = L. khác ( th2 . khác ( t )) . . khác ( t ) # . dL/dq - d/dt(dL/ddq) = 0 th1_eqn = dL_dth1 - dL_dth1_dt th2_eqn = dL_dth2 - dL_dth2_dt # Replace Time Derivatives and Functions with Symbolic Variables: thay thế = [( th1 . . khác ( t ). khác ( t ), . sympy. Ký hiệu ('ddth1')), (th1. khác ( t ), . sympy. Ký hiệu ('dth1')), (th1, sympy. Ký hiệu ('th1')), (th2. khác ( t ). khác ( t ), . sympy. Ký hiệu ('ddth2')), (th2. khác ( t ), . sympy. Ký hiệu ('dth2')), (th2, sympy. Ký hiệu ('th2'))] th1_eqn = th1_eqn. người thay thế ( người thay thế ) th2_eqn . = th2_eqn. người thay thế ( người thay thế ) r1 . = r1[0]. người thay thế ( người thay thế ), . r1[1]. người thay thế ( người thay thế ) r2 . = r2[0]. người thay thế ( người thay thế ), . r2[1]. người thay thế ( người thay thế ) # . [Đôi khi cần sử dụng. coeff()] th1_eqn = sympy . đơn giản hóa ( th1_eqn ) th2_eqn . = sympy. đơn giản hóa ( th2_eqn ) th1_eqn . = th1_eqn. hủy () th2_eqn = . th2_eqn. cancel () # Giải hệ số cho A * x = B trong đó . A1 = th1_eqn. coeff ( sympy . Ký hiệu ('ddth1')) A2 = th1_eqn. coeff ( sympy . Ký hiệu ('ddth2')) A3 = th2_eqn. coeff ( sympy . Ký hiệu ('ddth1')) A4 = th2_eqn. coeff ( sympy . Ký hiệu ('ddth2') A * x = B # Multiply remaining terms by -1 to switch to other side of equation: A * x - B = 0 -> A * x = B= [(sympy. Ký hiệu ('ddth1'), 0), (sympy. Ký hiệu ('ddth2'), 0)] B1 = -1 * th1_eqn. số người đăng ký ( số dư ) B2 . = -1 * th2_eqn. số người đăng ký ( số dư ) # . thay thế = ( sympy . Ký hiệu ('th1'), sympy. Ký hiệu ('dth1'), sympy. Ký hiệu ('th2'), sympy. Ký hiệu ('dth2')) A1 = sympy. tiện ích . lambdify ( thay thế , A1 . , "numpy") A2 = sympy. tiện ích . lambdify ( thay thế , A2 . , "numpy") A3 = sympy. tiện ích . lambdify ( thay thế , A3 . , "numpy") A4 = sympy. tiện ích . lambdify ( thay thế , A4 . , "numpy") B1 = sympy. tiện ích . lambdify ( thay thế , B1 . , "numpy") B2 = sympy. tiện ích . lambdify ( thay thế , B2 . , "numpy") r1 = sympy. tiện ích . lambdify ( thay thế , r1 . , "numpy") r2 = sympy. tiện ích . lambdify ( thay thế , r2 , "numpy")

Mô phỏng con lắc đôi

# Mô phỏng hệ thống. x0 = 1, 0 . 001, 0, 1 # th1, dth1, th2, dth2 dt = 0.001 sim_time = 10 thời gian . np. dải (0, sim_time . , dt) sim_length = len(time) # Initialize Arrays: th1_vec = np . số không ( sim_length ) dth1_vec . = np. số không ( sim_length ) th2_vec . = np. số không ( sim_length ) dth2_vec . = np. số không ( sim_length ) x1_vec . = np. số không ( sim_length ) y1_vec . = np. số không ( sim_length ) x2_vec . = np. số không ( sim_length ) y2_vec . = np. số không ( sim_length ) # . th1_vec [0] = . x0[0] dth1_vec[0] = x0[1] th2_vec[0] = x0[2] dth2_vec[0] = x0[3] x1_vec[0], y1_vec[0] = r1(x0[0], x0[1], x0[2], x0[3]) x2_vec[0], y2_vec[0] = r2(x0[0], x0[1], x0[2], x0[3]) # Initialize A and B: A = np . mảng ([[0 . , 0], [0, 0]]) B = np. mảng ([0, . 0]) # Euler Integration: cho tôi trong phạm vi( . 1, sim_length): # Đánh giá động lực học. A [0, 0 . ] = A1(th1_vec[i-1], dth1_vec[i-1], th2_vec[i-1], dth2_vec[i-1]) A[0, 1] = A2(th1_vec[i-1], dth1_vec[i-1], th2_vec[i-1], dth2_vec[i-1]) A[1, 0] = A3(th1_vec[i-1], dth1_vec[i-1], th2_vec[i-1], dth2_vec[i-1]) A[1, 1] = A4(th1_vec[i-1], dth1_vec[i-1], th2_vec[i-1], dth2_vec[i-1]) B[0] = B1(th1_vec[i-1], dth1_vec[i-1], th2_vec[i-1], dth2_vec[i-1]) B[1] = B2(th1_vec[i-1], dth1_vec[i-1], th2_vec[i-1], dth2_vec[i-1]) [ddth1, ddth2] = np. linalg . giải quyết ( A , B . ) # Euler Step Integration: th1_vec [ i ] = . th1_vec[i-1] + dth1_vec[i-1] * dt dth1_vec[i] = dth1_vec[i-1] + ddth1 * dt th2_vec[i] = th2_vec[i-1] + dth2_vec[i-1] * dt dth2_vec[i] = dth2_vec[i-1] + ddth2 * dt # Animation States: x1_vec [ i ], y1_vec[i] = r1(th1_vec[i-1], dth1_vec[i-1], th2_vec[i-1], dth2_vec[i-1]) x2_vec[i], y2_vec[i] = r2(th1_vec[i-1], dth1_vec[i-1], th2_vec[i-1], dth2_vec[i-1])

Hoạt hình con lắc đôi

# Tạo Hoạt ảnh. # Hình cài đặt. Khởi tạo Tay cầm Hình / Rìu fig , ax = plt. ô con () p1 , . = ax. cốt truyện ([], . [], color='black', linewidth=2) p2, = ax. cốt truyện ([], . [], color='black', linewidth=2) lb, ub = -5, 5 ax. trục ('bằng') ax. set_xlim ([ lb , . ub]) ax. set_xlabel ('X') # X Label ax. set_ylabel ('Y') # Y Label ax. set_title ('Mô phỏng con lắc đôi. ') video_title = "mô phỏng" # Setup Animation Writer: FPS = 20 sample_rate = . Con lắc 1 và 2 int(1 / (dt * FPS)) dpi = 300 writerObj = FFMpegWriter(fps=FPS) # Initialize Patch: Pendulum 1 and 2 con lắc_1 = Hình tròn ((0, 0), radius=0.1, màu ='cornflowerblue', zorder=10) pendulum_2 = Circle((0, 0), radius=0.1, màu ='cornflowerblue', zorder=10) ax. add_patch ( pendulum_1 ) ax . . add_patch ( pendulum_2 ) # . pin_joint = Vòng tròn (( . 050, 0), radius=0.05, màu ='đen', zorder=10) ax. add_patch ( pin_joint ) # . với writerObj . tiết kiệm ( hình , video_title . mp4" +".mp4", dpi ). cho tôi trong phạm vi( . 0, sim_length, sample_rate): # Vẽ cánh tay con lắc. x_pendulum_arm = [0, . x1_vec[i], x2_vec[i]] y_pendulum_arm = [0, y1_vec[i], y2_vec[i]] p1. set_data ( x_pendulum_arm , y_pendulum_arm . ) # Update Pendulum Patches: con lắc_1_center = x1_vec [ i . ], y1_vec[i] pendulum_2_center = x2_vec[i], y2_vec[i] pendulum_1. tâm = con lắc_1_tâm con lắc_2 . center = con lắc_2_center # Cập nhật bản vẽ. hình . canvas . vẽ () # Lấy và Lưu Khung. writerObj . grab_frame ()

Băng hình

từ IPython . hiển thị nhập Video Video ( . mp4"+video_title+".mp4", nhúng =True, width=640, height=480)