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]

Chủ Đề