Model Matematika Kekacauan

Pendahuluan


Habr sudah membahas teori chaos dalam artikel [1,2,3]. Aspek-aspek teori chaos berikut dipertimbangkan dalam artikel-artikel ini: diagram umum generator Chua; memodelkan dinamika sistem Lorentz; penarik yang diprogram oleh sirkuit terintegrasi logika Lorentz, Ressler, Rikitake dan Nose-Hoover.

Namun, teknik teori chaos juga digunakan untuk memodelkan sistem biologis, yang, tidak diragukan lagi, adalah salah satu sistem yang paling kacau dari semua yang dapat dibayangkan. Sistem pemerataan dinamis digunakan untuk memodelkan segala sesuatu mulai dari populasi dan pertumbuhan epidemi hingga detak jantung aritmia [4].

Bahkan, hampir semua sistem kacau dapat dimodelkan - pasar sekuritas menghasilkan kurva yang dapat dengan mudah dianalisis menggunakan penarik aneh, proses menjatuhkan tetes dari keran bocor adalah acak ketika dianalisis dengan telinga telanjang, tetapi jika digambarkan sebagai penarik aneh, itu membuka tatanan supernatural yang tidak bisa diharapkan dari cara tradisional.

Tujuan artikel ini adalah untuk menguji teori kekacauan menggunakan contoh peningkatan jumlah populasi biologis dan menggandakan siklus dalam sistem mekanis dengan visualisasi grafis model matematika berdasarkan program intuitif sederhana yang ditulis dengan Python.

Artikel ini ditulis untuk tujuan pengajaran, tetapi akan memungkinkan bahkan pembaca tanpa pengalaman pemrograman untuk menggunakan program-program di atas untuk secara mandiri menyelesaikan sebagian besar masalah pendidikan baru pada topik pemodelan fenomena kekacauan.

Menggandakan periode siklus dan kekacauan pada contoh pertumbuhan jumlah populasi biologis


Mari kita mulai dengan melihat persamaan diferensial logistik yang memodelkan peningkatan terbatas daripada eksponensial dalam jumlah populasi biologis:

 fracdNdt=aNβˆ’bN2,(a,b>0).(1)

Persamaan inilah yang dapat memprediksi pola perilaku eksotis dan tak terduga dari beberapa populasi. Memang menurut (1), untuk t rightarrow+ infty ukuran populasi mendekati batas sama dengan a / b .

Untuk solusi numerik dari solusi diferensial logistik, seseorang dapat menggunakan algoritma paling sederhana, dengan nilai numerik dari langkah waktu, tn+1=tn+h , maka solusi (1) dapat diperoleh dengan berulang kali menerapkan relasi berikut:

Nn+1=Nn+(aNnβˆ’bNn2)h. (2)

Kami mewakili persamaan (2) dalam bentuk persamaan logistik dalam perbedaan hingga:

Nn+1=rNnβˆ’sNn2 . (3)

di mana: r = 1 + ah dan s = bh .
Pergantian dalam (3) Nn= fracrsxn kami mendapatkan formula berulang:

xn+1=rxn(1βˆ’xn) , (4)

Menghitung nilai yang diberikan oleh relasi (3), kita dapat menghasilkan urutan x1,x2,x3,.....
nilai maksimum dari jumlah populasi yang akan didukung oleh lingkungan pada waktu tertentu t1,t2,t3. .

Kami berasumsi bahwa ada nilai pembatas fraksi yang menyatakan bagian dari ukuran populasi:

x infty= limn to inftyxn , (5).

Kami akan menyelidiki bagaimana hal itu tergantung x infty dari parameter pertumbuhan r dalam persamaan (4). Untuk melakukan ini, dengan Python, kita menulis sebuah program yang dimulai dengan x1=$0, menghitung hasil pada beberapa ratus iterasi ( n = 200 ) untuk r = 1,5; 2.0; 2.5 :

Kode program
# -*- coding: utf8 -*- from numpy import * print(" nr=1,5 r=2,0 r=2,5 ") M=zeros([201,3]) a=[1.5,2.0,2.5] for j in arange(0,3,1): M[0,j]=0.5 for j in arange(0,3,1): for i in arange(1,201,1): M[i,j]=a[j]*M[i-1,j]*(1-M[i-1,j]) for i in arange(0,201,1): if 0<=i<=2: print(" {0: 7.0f} {1: 7.4f} {2: 7.4f} {3: 7.4f} " . format(i,M[i,0],M[i,1],M[i,2])) elif 2<i<=5: print(".") elif 197<=i<=200: print(" {0: 7.0f} {1: 7.4f} {2: 7.4f} {3: 7.4f} " . format(i,M[i,0],M[i,1],M[i,2])) 


Hasil program (untuk mengurangi output dari hasil, tiga nilai pertama dan empat terakhir diberikan):

  nr=1,5 r=2,0 r=2,5 0 0.5000 0.5000 0.5000 1 0.3750 0.5000 0.6250 2 0.3516 0.5000 0.5859 . . . 197 0.3333 0.5000 0.6000 198 0.3333 0.5000 0.6000 199 0.3333 0.5000 0.6000 200 0.3333 0.5000 0.6000 

Analisis model diskrit menunjukkan bahwa untuk r = 1.5; 2.0; 2.5 dengan peningkatan jumlah iterasi, nilainya xn menstabilkan dan menjadi hampir sama dengan batas x infty , yang ditentukan oleh relasi (5). Apalagi untuk nilai yang diberikan r, kuantitas x infty sama dengan itu x infty=0,3333;0,5000;$0,600 .
Kami meningkatkan r = 3.1; 3.25; 3.5 dan jumlah iterasi n = 1008, untuk ini kami membuat perubahan berikut pada program:

Kode program
 # -*- coding: utf8 -*- from numpy import * print(" nr=3,1 r=3,25 r=3,5 ") M=zeros([1008,3]) a= [3.1,3.25,3.5] for j in arange(0,3,1): M[0,j]=0.5 for j in arange(0,3,1): for i in arange(1,1008,1): M[i,j]=a[j]*M[i-1,j]*(1-M[i-1,j]) for i in arange(0,1008,1): if 0<=i<=3: print(" {0: 7.0f} {1: 7.4f} {2: 7.4f} {3: 7.4f} " . format(i,M[i,0],M[i,1],M[i,2])) elif 4<i<=7: print(".") elif 1000<=i<=1007: print(" {0: 7.0f} {1: 7.4f} {2: 7.4f} {3: 7.4f} " . format(i,M[i,0],M[i,1],M[i,2])) 


Hasil program (untuk mengurangi output dari hasil, empat nilai pertama dan delapan terakhir diberikan):

  nr=3,1 r=3,25 r=3,5 0 0.5000 0.5000 0.5000 1 0.7750 0.8125 0.8750 2 0.5406 0.4951 0.3828 3 0.7699 0.8124 0.8269 . . . 1000 0.5580 0.4953 0.5009 1001 0.7646 0.8124 0.8750 1002 0.5580 0.4953 0.3828 1003 0.7646 0.8124 0.8269 1004 0.5580 0.4953 0.5009 1005 0.7646 0.8124 0.8750 1006 0.5580 0.4953 0.3828 1007 0.7646 0.8124 0.8269 

Sebagai berikut dari data di atas, alih-alih stabil di dekat populasi tunggal yang membatasi, bagian fraksional dari populasi berfluktuasi antara dua fraksi seiring perubahan waktu. Dibandingkan dengan r = 3,1 , periode siklus untuk r = 3,25 dua kali lipat, dan untuk r = 3,5 empat kali.

Program untuk menampilkan grafik siklus pertumbuhan populasi
 # -*- coding: utf8 -*- import matplotlib.pyplot as plt from numpy import * M=zeros([1008,3]) a= [3.1,3.25,3.5] for j in arange(0,3,1): M[0,j]=0.5 for j in arange(0,3,1): for i in arange(1,1008,1): M[i,j]=a[j]*M[i-1,j]*(1-M[i-1,j]) x=arange(987,999,1) y=M[987:999,0] y1=M[987:999,1] y2=M[987:999,2] plt.title('     r=3,1;3,25;3,5') plt.plot(x,y, label="T=1,ymax=%s,ymin=%s"%(round(max(y),3),round(min(y),3))) plt.plot(x,y1, label="T=2,ymax=%s,ymin=%s"%(round(max(y1),3),round(min(y1),3))) plt.plot(x,y2, label="T=4,ymax=%s,ymin=%s"%(round(max(y2),3),round(min(y2),3))) plt.grid() plt.legend(loc="best") plt.ylabel("x(n)") plt.xlabel("n") plt.show() 


Hasil dari program:



Karena menggandakan periode iterasi, xn+1=rxn(1βˆ’xn) menjadi dikenal luas. Ketika nilai tingkat pertumbuhan melebihi r = 3,56 , penggandaan periode dipercepat dan kekacauan ekstrem sudah muncul pada titik r = 3,57 . Untuk menampilkan awal kekacauan, kami menggunakan program berikut:

Kode program
 # -*- coding: utf8 -*- import matplotlib.pyplot as plt from numpy import * print(" nr=3,57 ") M=zeros([1041,1]) a= [3.57] for j in arange(0,1,1): M[0,j]=0.5 for j in arange(0,1,1): for i in arange(1,1041,1): M[i,j]=a[j]*M[i-1,j]*(1-M[i-1,j]) for i in arange(0,1041,1): if 1000<=i<=1015: print(" {0: 7.0f} {1: 7.4f}" . format(i,M[i,0])) x=arange(999,1040,1) y=M[999:1040,0] plt.title('     r=3,57') plt.plot(x,y) plt.grid() plt.ylabel("x(n)") plt.xlabel("n") plt.show() 


Hasil dari program:
  nr=3,57 1000 0.4751 1001 0.8903 1002 0.3487 1003 0.8108 1004 0.5477 1005 0.8844 1006 0.3650 1007 0.8275 1008 0.5096 1009 0.8922 1010 0.3434 1011 0.8050 1012 0.5604 1013 0.8795 1014 0.3784 1015 0.8397 

gambar

Kami akan menulis sebuah program untuk memvisualisasikan ketergantungan perilaku iterasi pada parameter pertumbuhan r . Untuk setiap nilai r dalam interval a leqslantr leqslantb 1000 iterasi dilakukan untuk mencapai stabilitas. Kemudian, setiap 250 nilai yang diperoleh sebagai hasil dari iterasi diplot sepanjang sumbu vertikal, membentuk titik ( r, x ):

Kode program
 # -*- coding: utf8 -*- import matplotlib.pyplot as plt from numpy import* N=1000 y=[] y.append(0.5) for r in arange(2.8,4.0,0.0001): for n in arange(1,N,1): y.append(round(r*y[n-1]*(1-y[n-1]),4)) y=y[N-250:N] x=[r ]*250 plt.plot( x,y, color='black', linestyle=' ', marker='.', markersize=1) plt.title("   2,8<= r<=4,0,0<=x<=1") plt.xlabel("r") plt.ylabel("y") plt.axvline(x=3.01,color='black',linestyle='--') plt.axvline(x=3.45, color='black',linestyle='--') plt.axvline(x=3.6,color='black',linestyle='--') plt.axvline(x=3.7,color='black',linestyle='--') plt.axvline(x=3.8,color='black',linestyle='--') plt.axvline(x=3.9,color='black',linestyle='--') plt.show() 


Hasilnya berupa diagram:



Grafik yang dihasilkan disebut "diagram cabang" , yang memungkinkan Anda untuk menentukan apakah nilai r tertentu sesuai dengan siklus atau kekacauan. Satu-satunya nilai ukuran populasi ditentukan oleh nilai tersebut r sekitar3 kemudian siklus dengan periode 2 hingga r sekitar3,4 , kemudian siklus dengan periode 4, kemudian siklus dengan periode 8 dan seterusnya dengan pendekatan cepat untuk kekacauan.

Perlu dicatat bahwa area vertikal dari ruang tidak terisi pada grafik adalah daerah r = 3,6 dan r = 3,7 , antara r = 3,7 dan r = 3,8 , antara r = 3,8 dan r = 3,9 di mana urutan siklik kembali dari kekacauan sebelumnya.
Untuk mempertimbangkan tampilan siklus dengan kelipatan periode 3 in 3,8 leqslantr leqslant$3, lakukan perubahan pada program sebelumnya:

Kode program
 # -*- coding: utf8 -*- import matplotlib.pyplot as plt from numpy import* N=1000 y=[] y.append(0.5) for r in arange(3.8,3.9,0.0001): for n in arange(1,N,1): y.append(round(r*y[n-1]*(1-y[n-1]),4)) y=y[N-250:N] x=[r ]*250 plt.plot( x,y, color='black', linestyle=' ', marker='.', markersize=1) plt.title("   3,8<= r<=3,9,0<=x<=1") plt.xlabel("r") plt.ylabel("y") plt.axvline(x=3.83,color='black',linestyle='--') plt.show() 


Hasil dari program:



Siklus periode 3 muncul di sekitar titik r = 3,83 , dan kemudian dibagi secara berurutan menjadi siklus 6,12,24. Adanya siklus dengan periode 3 menyiratkan adanya siklus dari periode terbatas lainnya, serta siklus kacau tanpa periode sama sekali.

Diagram cabang memungkinkan Anda untuk mengikuti pengembangan sistem dengan perubahan parameter yang mulus. Dengan nilai tetap dari parameter, diagram laba-laba (diagram kamera) memungkinkan pelacakan titik-titik yang mengorbit.

Konstruksi diagram laba-laba memungkinkan Anda mengidentifikasi berbagai efek yang tidak terlihat pada diagram cabang. Mari kita menulis sebuah program:

Kode program
 # -*- coding: utf8 -*- import matplotlib.pyplot as plt from numpy import * a=2.7 x1=0.62 def ff(x): return a*x*(1-x) b=a*x1*(1-x1)/x1 def fl(x): return b*x x=0.1 y=0 Y=[] X=[] for i in arange(1,30,1): X.append(x) Y.append(y) y=ff(x) X.append(x) Y.append(y) x=y/b plt.title('   \n  Ξ»x(1-x)  Ξ» = 2.7') plt.plot(X,Y,'r') x1=arange(0,1,0.001) y1=[ff(x) for x in x1] y2=[fl(x) for x in x1] plt.plot(x1,y1,'b') plt.plot(x1,y2,'g') plt.grid(True) plt.show() 


Diagram kamera:

Diagram lameria

Penggandaan periode dalam sistem mekanis


Pertimbangkan persamaan diferensial yang memodelkan getaran teredam bebas dari titik material dari massa tertentu pada pegas non-linear, di mana redaman ditentukan oleh kecepatan.

mxβ€³+cxβ€²+kx+ betax3=0 (6)

Dalam persamaan (6), istilah kx mewakili gaya pegas linier yang diterapkan pada titik material dari massa yang diberikan, dan istilah tersebut  betax3 mewakili nonlinieritas aktual pegas.

Jika gaya bekerja pada sistem osilasi bebas (6), maka perpindahan titik material massa yang digunakan gaya ini dijelaskan oleh persamaan diferensial Duffing untuk osilasi paksa:

mxβ€³+cxβ€²+kx+ betax3=F0cos omegat (7)

Persamaan (7) untuk sebagian besar parameter yang termasuk di dalamnya diselesaikan secara numerik. Sistem mekanik untuk model matematika menurut persamaan (7) ditunjukkan pada gambar:

gambar

Fitur dari sistem yang diberikan adalah bahwa alih-alih pegas digunakan benang logam fleksibel, yang berosilasi dalam bidang vertikal, yang konstanta Hook k negatif. Dalam skema ini, titik-titik keseimbangan stabil (a) dan (c), dan titik keseimbangan tidak stabil (b).

Ketika suatu titik material dipindahkan dari posisi (b), gaya yang bekerja di atasnya adalah menjijikkan. Jika gaya periodik, misalnya, diciptakan oleh medan magnet osilasi sebagian teredam oleh hambatan udara. Kemudian, persamaan (7) adalah model matematika yang dapat diterima untuk perpindahan horisontal x (t) dari titik material dengan rentang parameter berikut k<0,c>0, beta>0 .

Untuk mempelajari perilaku sistem nonlinear seperti itu, kami ambil k=βˆ’1,m=c= beta= omega=1 maka persamaan diferensial (7) berbentuk:

xβ€³+xβ€²βˆ’x+x3=F0cos(t) , (8)

Kami menulis sebuah program untuk integrasi numerik persamaan (8) di bawah kondisi awal x(0)=1,xβ€²(0)=0 di lapangan 100 leqslantt leqslant$20 dan untuk masing-masing nilai amplitudo berikut F0=0,6;0,7;0,75;0,8 , dan dalam setiap kasus, plot solusi untuk pesawat x(t),xβ€²(t) dan t,x(t) :

Kode program
 # -*- coding: utf8 -*- from numpy import * from scipy. integrate import odeint import matplotlib.pyplot as plt for F in [0.6,0.7,0.75,0.8]: def f(y,t): y1,y2=y return [y2,-y2-y1**3+y1+F*cos(t)] t=arange(100,200,0.001) y0=[1.0,0.0] [y1,y2]=odeint(f, y0, t, full_output=False,rtol=1e-12).T if F==0.6: plt.subplot(221) plt.title('  F=0.6,T=2'r'$\pi$') plt.plot(y1,y2, color='black', linestyle=' ', marker='.', markersize=0.1) plt.grid(True) plt.subplot(222) plt.title(' x(t): F=0.6,T=2'r'$\pi$') plt.plot(t,y1, color='black', linestyle=' ', marker='.', markersize=0.1) plt.grid(True) elif F==0.7: plt.subplot(223) plt.plot(y1,y2, color='black', linestyle=' ', marker='.', markersize=0.1, label='  \n F=0.7,T=4'r'$\pi$') plt.legend(loc='upper left') plt.grid(True) plt.subplot(224) plt.plot(t,y1, color='black', linestyle=' ', marker='.', markersize=0.1, label=' x(t): F=0.7,T=4'r'$\pi$') plt.legend(loc='upper left') plt.grid(True) plt.show() if F==0.75: plt.subplot(221) plt.title('  F=0.75,T=8'r'$\pi$') plt.plot(y1,y2, color='black', linestyle=' ', marker='.', markersize=0.1) plt.grid(True) plt.subplot(222) plt.title(' x(t): F=0.75,T=8'r'$\pi$') plt.plot(t,y1, color='black', linestyle=' ', marker='.', markersize=0.1) plt.grid(True) elif F==0.8: plt.subplot(223) plt.plot(y1,y2, color='black', linestyle=' ', marker='.', markersize=0.1, label=' \n F=0.8,') plt.legend(loc='upper left') plt.grid(True) plt.subplot(224) plt.plot(t,y1, color='black', linestyle=' ', marker='.', markersize=0.1, label=' x(t): F=0.8,') plt.legend(loc='upper left') plt.grid(True) plt.show() 


Bagan sebagai hasil dari program

gambar



Transisi ini dari periode penggandaan ke kekacauan menunjukkan perilaku umum sistem mekanis nonlinear sebagai respons terhadap perubahan dalam parameter fisik yang sesuai, misalnya: k,m,c, beta, omega,F0 . Fenomena seperti itu tidak terjadi dalam sistem mekanis linier.

Penarik Lorenz


Substitusi ke dalam persamaan Duffing untuk osilasi paksa (7) mengarah ke sistem persamaan diferensial diferensial nonlinier, yang ditunjukkan dalam daftar sebelumnya. Sistem persamaan diferensial diferensial tiga dimensi yang diterapkan pada masalah meteorologi dipertimbangkan oleh E.N. Lorenz:

 fracdxdt=βˆ’sx+sy,
 fracdydt=βˆ’xz+rxβˆ’y, (9)
 fracdzdt=xyβˆ’dz

Solusi untuk sistem (9) paling baik dilihat dalam proyeksi ke salah satu dari tiga pesawat. Kami menulis sebuah program integrasi numerik untuk nilai-nilai parameter b = \ frac {8} {3}, s = 10, r = 28 dan kondisi awal x (0) = - 8, y (0) = 8, z (0) = 27 :

Kode program
 # -*- coding: utf8 -*- import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt s,r,b=10,28,8/3 def f(y, t): y1, y2, y3 = y return [s*(y2-y1), -y2+(r-y3)*y1, -b*y3+y1*y2] t = np.linspace(0,20,2001) y0 = [-8, 8, 27] [y1,y2,y3]=odeint(f, y0, t, full_output=False).T plt.plot(y1,y3, color='black', linestyle=' ', marker='.', markersize=2) plt.xlabel('x') plt.ylabel('z') plt.grid(True) plt.title("     xz") plt.show() 


Hasil dari program:

gambar

Mempertimbangkan gambar pada grafik dari waktu ke waktu, dapat diasumsikan bahwa titik P (x (t), y (t), z (t)) membuat jumlah acak dari osilasi, kanan atau kiri. Untuk aplikasi meteorologi sistem Lorenz, setelah sejumlah hari cerah yang acak, sejumlah hari hujan secara acak akan menyusul.

Pertimbangkan program untuk memetakan penarik Lorentz di bidang xyz untuk kondisi awal yang sedikit berbeda:

Kode program
 # -*- coding: utf8 -*- import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D #     . s,r,b=10,25,3 def f(y, t): y1, y2, y3 = y return [s*(y2-y1), -y2+(r-y3)*y1, -b*y3+y1*y2] #        t = np.linspace(0,20,2001) y0 = [1, -1, 10] [y1,y2,y3]=odeint(f, y0, t, full_output=False).T fig = plt.figure(facecolor='white') ax=Axes3D(fig) ax.plot(y1,y2,y3,linewidth=2) plt.xlabel('y1') plt.ylabel('y2') plt.title(" : y0 = [1, -1, 10]") y0 = [1.0001, -1, 10] [y1,y2,y3]=odeint(f, y0, t, full_output=False).T fig = plt.figure(facecolor='white') ax=Axes3D(fig) ax.plot(y1,y2,y3,linewidth=2) plt.xlabel('y1') plt.ylabel('y2') plt.title(" : y0 = [1.0001, -1, 10]") plt.show() 


Hasil program ditunjukkan dalam grafik berikut:

gambar

gambar

Dari grafik di atas dapat disimpulkan bahwa perubahan dalam kondisi awal dari 1,0 ke 1.0001 secara dramatis mengubah sifat perubahan pada penarik Lorentz.

Sistem Rossler


Ini adalah sistem tiga dimensi nonlinier yang dipelajari secara sangat intensif:
 fracdxdt=βˆ’yβˆ’z,
 fracdydt=xβˆ’ alphay, (10)
 fracdzdt=b+x(xβˆ’c).

Kami akan menulis sebuah program untuk integrasi numerik sistem (10) untuk parameter berikut a = 0,39, b = 2, c = 4 dalam kondisi awal x (0) = 0, y (0) = 0, z (0) = 0 :

Kode program
 # -*- coding: utf8 -*- import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt a,b,c=0.398,2.0,4.0 def f(y, t): y1, y2, y3 = y return [(-y2-y3), y1+a*y2, b+y3*(y1-c)] t = np.linspace(0,50,5001) y0 = [0,0, 0] [y1,y2,y3]=odeint(f, y0, t, full_output=False).T plt.plot(y1,y2, color='black', linestyle=' ', marker='.', markersize=2) plt.xlabel('x') plt.ylabel('y') plt.grid(True) plt.title("     xy") plt.show() 


Hasil dari program:

Grafik

Di pesawat, rekaman Rossler terlihat seperti lingkaran, tetapi di ruang angkasa ternyata diputar seperti pita Moebius.

Kesimpulan


Untuk menunjukkan fenomena kekacauan, disajikan program sederhana dan intuitif dalam bahasa pemrograman Python tingkat tinggi, yang mudah untuk ditingkatkan ke proyek baru pada topik ini. Artikel ini memiliki fokus pendidikan dan metodologi dan dapat digunakan dalam proses pembelajaran.

Referensi


  1. Sedikit tentang kekacauan dan cara membuatnya
  2. Pandangan kritis pada penarik Lorenz
  3. FPGA Chaos Generator
  4. Persamaan diferensial dan masalah nilai batas: pemodelan dan perhitungan menggunakan Mathematica, Maple dan MATLAB. Edisi ke-3: Per. dari bahasa inggris - M.: LLC β€œSaya. Williams, 2008. - 1104 p .: Ill. - Paral. dada. Bahasa inggris

Source: https://habr.com/ru/post/id436014/


All Articles