Bộ dao động kết hợp Python

Mã cho Kuramoto bằng Python có sẵn tại đây hoặc từ trang con mã. Giải thích về cách sử dụng nó ở dưới cùng của bài đăng này

Giới thiệu nhỏ

Kuramoto[, ] có lẽ là một trong những mô hình phổ biến và thành công nhất cho bộ dao động kết hợp. Có rất nhiều thông tin về nó, nhưng tóm lại, nó mô hình các pha của bộ tạo dao động phụ thuộc vào độ lệch pha được chia tỷ lệ cho tất cả các cặp bộ tạo dao động

Cách đây một thời gian, tôi đã thực sự viết về một phương pháp cụ thể mà tôi đã sử dụng để tìm các tham số tối ưu cho mô hình Kuramoto dựa trên một số quan sát. [Xem Suy luận động Bayesian tại đây. ]

Về mặt toán học, mô hình này được xác định bởi một tập hợp các phương trình vi phân thông thường [ODE] được ghép nối. Với N bộ dao động, động lực học cho mỗi pha của mỗi bộ dao động $\phi_i$ được định nghĩa là $i\in N$ được xác định bởi $\dot\phi_i = \omega_i + \sum_{j=0}^N k_{ij} \sin[ . Lưu ý rằng người ta có thể để khớp nối với chính nó, bởi vì trong trường hợp đó $\sin[\phi_i - \phi_i] = 0$, do đó, nó không nhập bất cứ thứ gì vào giải pháp cuối cùng

Lưu ý nhanh rằng mô hình khớp nối Kuramoto có thể được sử dụng để tham chiếu mô hình với chức năng khớp nối có thể được biểu diễn dưới dạng tổng của các hàm điều hòa. Ví dụ: thứ tự thứ hai có nghĩa là chúng tôi bao gồm cả $k \sin[\Delta\phi]$ và $k^{[2]}\sin[2\Delta\phi]$. Nói chung, mô hình thứ tự $M$ của Kuramoto sẽ mô tả $\dot\phi_i = \omega_i + \sum_{m=0}^{M} \sum_{j=0}^N k_{ij}^{[m]}

ví dụ

Dưới đây là hai ví dụ. Cả hai đều sử dụng các giá trị cốt lõi giống nhau, ngoại trừ đối với hệ thống thứ hai, chức năng ghép nối được xác định bởi hai thuật ngữ điều hòa. Điều này tự nhiên thay đổi động lực, nhưng nó không nên thay đổi nhiều giá trị trung bình, gần với tần số nội tại

Các giá trị chính xác cho thử nghiệm đầu tiên được trình bày trong bảng dưới đây. Mỗi hàng là một bộ dao động khác nhau với pha ban đầu Φ0 và tần số nội tại Ω. Các cột sau biểu thị cường độ khớp nối giữa các cặp dao động tương ứng

Φ0ωk. 1k. 2k. 310280. 21. 12π190. 5-0. 730110. 30. 9Động lực pha, tôi. e. đạo hàm thời gian của các pha thu được, được trình bày trong hình. 1. Người ta có thể thấy rằng tất cả các ô đều tập trung vào tần số nội tại với một số điều chế.
Quả sung. 1. Động lực pha, tôi. e. đạo hàm thời gian, trong mô hình Kuramoto đơn giản

Bảng dưới đây cho thấy các giá trị được sử dụng trong mô phỏng thứ hai. Thêm 3 cột biểu thị các giá trị tỷ lệ được sử dụng trong sóng hài bậc hai

Φ0ωk[1]. 1k[1]. 2k[1]. 3k[2]. 1k[2]. 2k[2]. 310280. 21. 1-0. 50. 22π190. 5-0. 7-0. 41. 030110. 30. 90. 80. 8Một lần nữa, động lực pha đã được trình bày dưới dạng biểu đồ [Hình. 2]. Tôi nghĩ rằng sự khác biệt là rõ ràng. Mặc dù có các giá trị trung bình tương tự [xấp xỉ bằng tần số nội tại], các điều chế của chúng đã thay đổi. Không chỉ nội dung tần số của các điều chế này đã thay đổi, mà cả biên độ của chúng.
Hình. 2. Động lực pha, tôi. e. đạo hàm thời gian, trong mô hình Kuramoto có bao gồm sóng hài bậc hai.

Sử dụng mã

Ngoại trừ việc tải xuống mã từ github hoặc trang con mã, người ta sẽ có mô-đun SciPy. Kuramoto sử dụng nó để giải các phương trình vi phân

Tập lệnh bên dưới hiển thị một ví dụ về cách một người có thể sử dụng mô-đun Kuramoto. Khi bạn chạy chương trình này, hãy đảm bảo rằng kuramoto. py nằm trong đường dẫn của bạn. Cũng lưu ý rằng hầu hết mã chỉ để xác định các tham số ban đầu và vẽ kết quả. Thực thi thực tế của mô-đun là hai dòng. Quả sung. 1 là đầu ra dự kiến

import numpy as np
import pylab as plt
from kuramoto import Kuramoto

# Defining time array
t0, t1, dt = 0, 40, 0.01
T = np.arange[t0, t1, dt]

# Y0, W, K are initial phase, intrinsic freq and
# coupling K matrix respectively
Y0 = np.array[[0, np.pi, 0]]
W = np.array[[28, 19, 11]]

K1 = np.array[[[  0, 0.2,  1.1],
               [0.5,   0, -0.7],
               [0.3, 0.9,    0]]]

K2 = np.array[[[   0, -0.5, 0.2],
               [-0.4,    0, 1.0],
               [ 0.8,  0.8,   0]]]
K = np.dstack[[K1, K2]].T

# Passing parameters as a dictionary
init_params = {'W':W, 'K':K, 'Y0':Y0}

# Running Kuramoto model
kuramoto = Kuramoto[init_params]
odePhi = kuramoto.solve[T]

# Computing phase dynamics
phaseDynamics = np.diff[odePhi]/dt

# Plotting response
nOsc = len[W]
for osc in range[nOsc]:
    plt.subplot[nOsc, 1, 1+osc]
    plt.plot[T[:-1], phaseDynamics[osc]]
    plt.ylabel["$\dot\phi_{%i}$" %[osc+1]]
plt.show[]

[1] Y. Kuramoto, "Chemical Oscillations, Waves, and Turbulence," 1984, doi. 10. 1007/978-3-642-69689-3

[2] Steven H. Strogatz, "Từ Kuramoto đến Crawford. khám phá sự khởi đầu của đồng bộ hóa trong quần thể các bộ dao động kết hợp," 2000, doi. 10. 1016/S0167-2789[00]00094-4

GIỚI THIỆU Bài trước đã giới thiệu bài toán tìm vectơ ẩn số, v, trong phương trình Av=r, trong đó A là ma trận và r là vectơ hằng số. Một loại bài toán rất quan trọng khác trong đại số tuyến tính có dạng $M v = \lambda v$. Ở đây, $M$ là một ma trận, $\lambda$ là một số duy nhất và $v$ là một vectơ. Đây là bài toán giá trị riêng/vectơ riêng

VÍ DỤ. Bộ tạo dao động kết hợp Một lần nữa, chúng ta quay lại cơ học cơ bản để làm ví dụ. Xét hai khối lượng chuyển động theo một chiều dọc theo một mặt bàn không có ma sát. Các vật nặng, đều có khối lượng m, được nối với nhau bằng các lò xo giống hệt nhau vào một bức tường cố định, như thể hiện trong hình dưới đây. Mỗi lò xo có độ cứng $k$ và chiều dài thả lỏng $\ell$. Đặt $x_1$ và $x_2$ biểu thị vị trí của các khối lượng được đo từ tường

Nếu bạn dịch chuyển một hoặc cả hai khối lượng này khỏi điểm cân bằng của nó và thả nó ra, bạn sẽ thấy chuyển động phức tạp của cả hai khối lượng. Sự tiến hóa phức tạp này có thể được hiểu dễ dàng hơn theo hai chế độ bình thường của hệ thống. Để hiểu rõ hơn về các chế độ bình thường này [mà chúng ta sẽ nhận được từ phân tích véc tơ riêng], trước tiên chúng ta hãy xem xét vấn đề đơn giản hơn của chỉ một khối lượng trên một lò xo. Trong trường hợp này, chúng ta đang giải phương trình đơn giản

$m \ddot x_1 = -k x_1 $

Nhận ra rằng giải pháp cho điều này là một hàm điều hòa, chúng ta có thể viết ra giải pháp chung là

$x_1 = A\sin[\omega t] + B\cos[\omega t]$

trong đó $\omega = \sqrt{k/m}$ là tần số dao động của khối lượng. Các hằng số A, B được xác định bởi điều kiện ban đầu của hệ [độ dời và vận tốc ban đầu]. Do đó, chuyển động rất đơn giản, dao động qua lại với tần số cố định này

Mở rộng điều này cho hệ thống hai khối lượng của chúng ta bắt đầu theo cách tương tự, áp dụng định luật thứ hai của Newton cho mỗi khối lượng

$m \ddot x_1 = -k[x_1 - \ell] + k[x_2 - x_1 - \ell] \\ m \ddot x_2 = -k[x_2 - x_1 - \ell]$

Phân tích chế độ bình thường là một kỹ thuật mạnh mẽ được sử dụng để mô tả một hệ thống dao động. Chế độ bình thường là một dạng dao động trong đó mỗi phần của hệ dao động quanh vị trí cân bằng của nó ở một tần số góc chung $\omega$. Do đó, đối với hệ thống này, các chế độ bình thường có dạng

$x_1 = \ell + A\sin[\omega t] + B\cos[\omega t] \\ x_2 = 2\ell + C\sin[\omega t] + D\cos[\omega t] $

Chèn các biểu thức này vào các phương trình vi phân, chúng tôi tìm thấy

$ -m\omega^2 [A\sin[\omega t] + B\cos[\omega t]] = \\ k[C\sin[\omega t] + D\cos[\omega t] - A

Bằng cách đặt $t = 0$, chúng ta thấy rằng các hệ số của $\cos[\omega t]$ phải triệt tiêu. Tương tự như vậy, bằng cách đặt $t = \pi/[2\omega]$, chúng ta thấy rằng các hệ số của $\sin[\omega t]$ phải triệt tiêu. Điều này dẫn đến bốn phương trình sau

$m\omega^2 A = kA - k[C-A] \\ m\omega^2 B = kB - k[D-B] \\ m\omega^2 C = k[C-A] \\ m\omega^2 D

có thể được viết bằng ký hiệu ma trận là

$\left[\begin{array}{cccc} 2 & 0 & -1 & 0 \\ 0 & 2 & 0 & -1 \\ -1 & 0 & 1 & 0 \\ 0 & -1 & 0 & 1

Đây là một vấn đề về giá trị riêng/vector riêng, trong đó giá trị riêng là $\lambda = \omega^2 m/k$ và véc tơ riêng là tập hợp các biên độ $v = [A,B,C,D]^T$. Lưu ý rằng giá trị riêng của $\lambda = 1$ tương ứng với tần số tự nhiên của một khối lượng trên một lò xo, $\omega^2 = k/m$

Giá trị riêng và vectơ riêng Bây giờ chúng ta đã rút gọn hai khối lượng của bài toán hai lò xo về dạng toán $M v = \lambda v$. Vế phải của phương trình giá trị riêng/vector riêng này có thể được viết là $\lambda I v$ trong đó $I$ là ma trận đơn vị. Với ký hiệu này, vấn đề có thể được viết là $A v = 0$ trong đó ma trận $A$ được xác định bởi $A \equiv M - \lambda I = 0$. Tất nhiên, chúng ta biết cách giải hệ $Av =0$. chỉ cần đảo ngược ma trận $A$ và nhân cả hai vế của phương trình với $A^{-1}$. Điều này mang lại giải pháp tầm thường $v = 0$. Lưu ý rằng $v=0$ luôn là giải pháp cho vấn đề ban đầu của chúng ta, $Mv = \lambda v$. Trên thực tế, đây là giải pháp duy nhất khi giả định rằng ma trận $A \equiv M - \lambda I$ khả nghịch. Đối với một số giá trị đặc biệt của $\lambda$, được gọi là giá trị riêng, ma trận này sẽ {\em không} khả nghịch và hệ thống $M v = \lambda v$ sẽ có nghiệm không cần thiết cho $v$. Các vectơ không cần thiết $v$ được gọi là các vectơ riêng

Bài toán giá trị riêng/vector riêng bao gồm việc tìm tất cả các giá trị riêng $\lambda$ sao cho $M - \lambda I$ không khả nghịch, sau đó [đối với mỗi giá trị riêng] tìm các véc tơ riêng tương ứng $v$ thỏa mãn $Mv = \lambda v . Trong python, bạn có thể sử dụng hàm numpy eig[] để giải quyết vấn đề giá trị riêng/véc tơ riêng. Chính xác hơn, lệnh

eigenval,eigenvec = eig[M]

sẽ tính toán các giá trị riêng và các vectơ riêng tương ứng của ma trận $M$. Các giá trị riêng được đặt trong một mảng, được gọi là giá trị riêng trong ví dụ này. Giá trị riêng đầu tiên được lưu trữ trong eigenval[0]

>> print eigenval[0]
-2.0

Các vectơ riêng được đặt trong một ma trận, được gọi là eigenvec trong ví dụ này. Cột đầu tiên của eigenvec là vector riêng tương ứng với giá trị riêng đầu tiên. Cột thứ hai của evec là vectơ riêng tương ứng với giá trị riêng thứ hai, v.v.

>> print 'The first eigenvector is ', eigenvec[:,0]
The first eigenvector is [-0.70710678  0.70710678]

BÀI TẬP. Xét ma trận

$M = \left[\begin{array}{cc} 1 & 3 \\ 4 & 2 \end{array}\right] $

Ra lệnh eigenval,eigenvec = eig[M]. Điều này sẽ mang lại các giá trị riêng $\lambda_1=-2$ và $\lambda_2=5$, với các véc tơ riêng tương ứng $v_1 = [-0. 707, 0. 707]^T$ và $v_2 = [-0. 6, -0. 8]^T$. Xác minh bằng tính toán thủ công rằng các giá trị riêng/vector riêng này thỏa mãn $Mv = \lambda v$. Lưu ý rằng vectơ riêng được liên kết với một giá trị riêng đã cho không phải là duy nhất. Nếu $v$ thỏa mãn phương trình $Mv =\lambda v$, thì bất kỳ vectơ nào cũng tỷ lệ với $v$. Do đó, đối với vấn đề này, chúng ta có thể thay đổi tỷ lệ vectơ riêng được liên kết với $\lambda_1$ để thu được $v_1 = [1,-1]^T$. Tương tự như vậy, chúng ta có thể điều chỉnh lại vectơ riêng thứ hai thành $v_2 = [3,4]^T$. Kiểm tra thủ công xem các vectơ riêng này có thỏa mãn $Mv = \lambda v$

Bây giờ hãy áp dụng quy trình này cho các khối lượng ghép nối trên lò xo. Nhiệm vụ đầu tiên là tìm các giá trị riêng, biểu thị tần số của các chế độ bình thường của hệ thống và các vectơ riêng, mô tả biên độ tương đối của các hàm điều hòa tạo nên từng chế độ bình thường tương ứng. Nhiệm vụ thứ hai là sử dụng các kết quả này để mô tả chuyển động của các chế độ bình thường

Phân công. Sử dụng Python để giải quyết vấn đề giá trị riêng/vectơ riêng bằng số và sau đó vẽ đồ thị chuyển động của hai chế độ bình thường. Đặt $k = 15$ và $m = 0. 3 đô la theo đơn vị SI. Đối với mỗi giá trị riêng $\lambda$, xác định véc tơ riêng tương ứng và tính tần số $\omega = \sqrt{\lambda/m}$. Đối với mỗi giá trị riêng, hãy vẽ biểu đồ thể hiện $x_1 - \ell$ và $x_2 - 2\ell$ dưới dạng hàm thời gian. Đây là các chế độ rung bình thường cho hệ thống. Mô tả định tính sự khác biệt giữa các chế độ bình thường. Chuyển động tổng quát nhất của hệ là tổ hợp tuyến tính của các pháp tuyến

Các bộ dao động kết hợp là gì?

Bộ tạo dao động kết hợp là bộ tạo dao động được kết nối theo cách mà năng lượng có thể được truyền giữa chúng . Chuyển động của các bộ dao động kết hợp có thể phức tạp và không nhất thiết phải tuần hoàn.

Làm cách nào để giải các phương trình vi phân kết hợp bằng số trong Python?

.
nhập numpy dưới dạng np. nhập matplotlib. pyplot dưới dạng pltDt = 0. 01 # dấu thời gian Delta t. .
Y_arr = np. zeros[n_steps + 1] # tạo một mảng các số không cho Y. P_arr = np. zeros[n_steps +1] # tạo một mảng các số không cho P. .
# phương pháp Euler. cho tôi trong phạm vi [1, n_steps + 1]. .
# vẽ kết quả. vả = plt. hình [] # tạo hình

Mô hình kuramoto trong Python là gì?

Mô hình Kuramoto được sử dụng để nghiên cứu nhiều loại hệ thống có hoạt động đồng bộ hóa . Đó là hệ gồm N dao động tuần hoàn ghép cặp. Mỗi bộ dao động có omegai tần số riêng của nó, i. e. , vận tốc góc không đổi.

Chủ Đề