Cara menggunakan square root loop python

Sebelum saya memutuskan untuk menjalani karir di bidang data yang mana banyak mengimplementasikan pengetahuan statistika, saya menekuni bidang engineering, khususnya kontrol cerdas. Biasanya saya menggunakan MATLAB untuk mendesain controller yang saya butuhkan. Namun, setelah saya mempelajari Python yang terkenal sebagai , saya jadi kepikiran, gimana kalau saya coba mendesain sebuah controller di Python, bukan di MATLAB lagi.

Sebelum kita terlalu jauh membahas kontrol cerdas, alangkah baiknya kita memulainya dengan controller yang lebih simpel, yaitu PID Controller. Artikel ini bertujuan untuk menjelaskan beberapa teori mengenai PID Controller, PID tuning menggunakan metode Ziegler-Nichols, perancangan sistem, dan penerapannya pada Python. Artikel ini dibagi ke dalam beberapa bagian:

  • Sedikit teori tentang PID Controller
  • Ziegler-Nichols PID tuning
  • Perancangan sistem
  • Penerapan di Python

Baiklah. Tanpa bertele-tele lagi, mari kita bahas satu per satu.

Sedikit teori tentang PID Controller

Open-loop system dan closed-loop system

Sebuah controller diterapkan ke dalam sebuah sistem dengan tujuan untuk mengendalikan output dari sistem tersebut. Dalam disiplin ilmu teknik kontrol, ada dua jenis sistem, yaitu open-loop system dan closed-loop system. Mudahnya, open-loop system tidak mempedulikan output sistemnya, sedangkan closed-loop system menjaga output sistemnya agar sebisa meungkin mendekati nilai yang diinginkan [alias nilai reference atau set point]. Baca di sini untuk memahaminya lebih lanjut. Gambar 1 [atas] menunjukkan diagram blok open-loop system, sedangkan Gambar 1 [bawah] menunjukkan diagram blok closed-loop system.

Gambar 1 — Open-loop system dan closed-loop system

Tentang PID

PID Controller adalah sebuah controller yang diterapkan pada closed-loop system system sehingga tujuan PID Controller adalah untuk mengendalikan process/plant/model agar memiliki output yang terkendali mendekati nilai reference/setpoint. PID Controller terdiri dari P [proportional], I [integral], dan D [derivative]. Controller ini sudah ada sejak hampir satu abad yang lalu. Baca Wikipedia page ini untuk memahami PID Controller lebih lanjut. Gambar 2 di bawah menunjukkan desain dari PID Controller.

Gambar 2 — Closed-loop system dengan PID Controller

Secara matematis, PID Controller didefinisikan oleh Persamaan 1 di bawah.

Persamaan 1 — PID Controller

di mana u[.] adalah sinyal kontrol dari PID Controller; Kp, Ki, dan Kd berturut-turut adalah konstanta proportional gain, integral gain, dan derivative gain; e[.] adalah nilai error, yaitu nilai perbedaan antara reference/setpoint dengan feedback.

Selain bentuk dasar seperti pada Persamaan 1, PID Controller juga memiliki bentuk alternatif seperti yang ditunjukkan oleh Persamaan 2 di bawah.

Persamaan 2 -PID Controller bentuk alternatif

di mana Ti dan

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
0 didefiniskan oleh Persamaan 3 di bawah.

Persamaan 3

Bentuk diskrit

Kemudian, berhubung kita akan menerapkan PID Controller ke dalam bentuk pemrograman, kita perlu mengubah persamaan PID Controller yang continuous tersebut ke dalam bentuk diskrit. Persamaan 4 di bawah menunjukkan PID Controller dalam bentuk diskrit.

Persamaan 4 — PID Controller bentuk diskrit

di mana ∆t adalah perbedaan waktu.

Ziegler-Nichols PID tuning

Yang menjadi tantangan tersendiri dalam menggunakan PID Controller adalah mendefinisikan nilai konstanta Kp, Ki [atau Ti], dan Kd [atau

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
0]. Tiga konstanta tersebut menentukan baik atau tidaknya PID Controller dalam mengendalikan sebuah plant/process sesuai dengan reference/setpoint yang diinginkan. Dan lagi, beda plant/process-nya, maka beda pula ketiga konstanta tersebut. Kita bisa saja menset tiga konstanta tersebut secara asal, lalu melihat apakah hasilnya memuaskan. Namun, teknik ini sangat memakan waktu, tidak reproducible, dan tidak ada ketentuan yang jelas.

Oleh karena itu, banyak riset dilakukan untuk menentukan ketiga nilai konstanta tersebut. Salah satu yang terkenal adalah penelitian yang dilakukan oleh Ziegler dan Nichols, yang kemudian dikenal sebagai metode Ziegler-Nichols. Baca untuk memahami metode ini lebih lanjut.

Pada dasarnya, metode ini didasarkan pada ide untuk mendapatkan nilai

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
6 [ultimate gain] dan
Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
7 [ultimate period]. Tahapan dalam implementasinya adalah sebagai berikut:

1. Definisikan sistem lengkap dengan PID Controller dan plant/process-nya.

2. Atur controller agar, pilih salah satu:

  • HANYA menggunakan bagian
    Mean squared error: 0.848
    Mean absolute error: 0.268
    Root mean square error: 0.921
    8 [proportional], atau
  • tetap menggunakan PID, namun set nilai Ti menjadi infinity dan
    Mean squared error: 0.848
    Mean absolute error: 0.268
    Root mean square error: 0.921
    0 menjadi 0.

3. Tentukan nilai untuk , lalu jalankan sistem.

4. Dapatkan nilai

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
6 dengan cara secara bertahap tingkatkan nilai konstanta Kp hingga controller membuat output plant menjadi continuous oscillations, seperti pada Gambar 3.

5. Nilai

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
6 adalah nilai Kp di mana output plant membuat continuous oscillations tersebut, sedangkan nilai
Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
7 adalah besar periode pada output tersebut. Lihat Gambar 3.

6. Setelah dua nilai tersebut didapatkan, hitung nilai Kp, Ti, dan

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
0 dengan menggunakan ketentuan seperti yang ditunjukkan oleh Gambar 4.

Gambar 3 — Respon dari plant dalam menentukan Ku dan Tu

Gambar 4 — Perancangan sistem

Kita telah membahas tentang apa itu PID Controller dan metode untuk men-tuning-nya. Sekarang, pada bagian ini, kita akan merancang sistem secara keseluruhan yang kemudian akan diprogram pada bagian selanjutnya pada artikel ini.

Sistem secara keseluruhan

Kita akan merancang secara sederhana sebuah sistem , sebuah sistem untuk mengendalikan dinamika objek [yaitu kendaraan] yang bergerak translasi [gerak lurus]. Diagram blok dari sistem secara keseluruhan ditunjukkan oleh Gambar 5.

peaks: [9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75]

Tu = 2.0
9 adalah kecepatan referensi;
Control type 'p':
Kp = 975.0
Ti = _
Td = _

Control type 'pi':
Kp = 877.5
Ti = 1.6
Td = _

Control type 'pd':
Kp = 1560.0
Ti = _
Td = 0.25

Control type 'classic_pid':
Kp = 1170.0
Ti = 1.0
Td = 0.25

Control type 'pessen_integral_rule':
Kp = 1365.0
Ti = 0.8
Td = 0.3

Control type 'some_overshoot':
Kp = 643.5
Ti = 1.0
Td = 0.66

Control type 'no_overshoot':
Kp = 390.0
Ti = 1.0
Td = 0.66
0 adalah error, yaitu beda kecepatan antara
peaks: [9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75]

Tu = 2.0
9 dengan
Control type 'p':
Kp = 975.0
Ti = _
Td = _

Control type 'pi':
Kp = 877.5
Ti = 1.6
Td = _

Control type 'pd':
Kp = 1560.0
Ti = _
Td = 0.25

Control type 'classic_pid':
Kp = 1170.0
Ti = 1.0
Td = 0.25

Control type 'pessen_integral_rule':
Kp = 1365.0
Ti = 0.8
Td = 0.3

Control type 'some_overshoot':
Kp = 643.5
Ti = 1.0
Td = 0.66

Control type 'no_overshoot':
Kp = 390.0
Ti = 1.0
Td = 0.66
2;
Control type 'p':
Kp = 975.0
Ti = _
Td = _

Control type 'pi':
Kp = 877.5
Ti = 1.6
Td = _

Control type 'pd':
Kp = 1560.0
Ti = _
Td = 0.25

Control type 'classic_pid':
Kp = 1170.0
Ti = 1.0
Td = 0.25

Control type 'pessen_integral_rule':
Kp = 1365.0
Ti = 0.8
Td = 0.3

Control type 'some_overshoot':
Kp = 643.5
Ti = 1.0
Td = 0.66

Control type 'no_overshoot':
Kp = 390.0
Ti = 1.0
Td = 0.66
2adalah kecepatan output dari vehicle dynamics yang akan di-feedback ke
peaks: [9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75]

Tu = 2.0
9;
Control type 'p':
Kp = 975.0
Ti = _
Td = _

Control type 'pi':
Kp = 877.5
Ti = 1.6
Td = _

Control type 'pd':
Kp = 1560.0
Ti = _
Td = 0.25

Control type 'classic_pid':
Kp = 1170.0
Ti = 1.0
Td = 0.25

Control type 'pessen_integral_rule':
Kp = 1365.0
Ti = 0.8
Td = 0.3

Control type 'some_overshoot':
Kp = 643.5
Ti = 1.0
Td = 0.66

Control type 'no_overshoot':
Kp = 390.0
Ti = 1.0
Td = 0.66
5 adalah output dari controller, yang dalam hal ini merupakan throttle [gas] dan brake [rem] pada kendaraan, di mana nilai positif
Control type 'p':
Kp = 975.0
Ti = _
Td = _

Control type 'pi':
Kp = 877.5
Ti = 1.6
Td = _

Control type 'pd':
Kp = 1560.0
Ti = _
Td = 0.25

Control type 'classic_pid':
Kp = 1170.0
Ti = 1.0
Td = 0.25

Control type 'pessen_integral_rule':
Kp = 1365.0
Ti = 0.8
Td = 0.3

Control type 'some_overshoot':
Kp = 643.5
Ti = 1.0
Td = 0.66

Control type 'no_overshoot':
Kp = 390.0
Ti = 1.0
Td = 0.66
5 adalah throttle, sedangkan nilai negatif
Control type 'p':
Kp = 975.0
Ti = _
Td = _

Control type 'pi':
Kp = 877.5
Ti = 1.6
Td = _

Control type 'pd':
Kp = 1560.0
Ti = _
Td = 0.25

Control type 'classic_pid':
Kp = 1170.0
Ti = 1.0
Td = 0.25

Control type 'pessen_integral_rule':
Kp = 1365.0
Ti = 0.8
Td = 0.3

Control type 'some_overshoot':
Kp = 643.5
Ti = 1.0
Td = 0.66

Control type 'no_overshoot':
Kp = 390.0
Ti = 1.0
Td = 0.66
5 adalah brake. Namun, untuk mempermudah, kita bisa menganggap
Control type 'p':
Kp = 975.0
Ti = _
Td = _

Control type 'pi':
Kp = 877.5
Ti = 1.6
Td = _

Control type 'pd':
Kp = 1560.0
Ti = _
Td = 0.25

Control type 'classic_pid':
Kp = 1170.0
Ti = 1.0
Td = 0.25

Control type 'pessen_integral_rule':
Kp = 1365.0
Ti = 0.8
Td = 0.3

Control type 'some_overshoot':
Kp = 643.5
Ti = 1.0
Td = 0.66

Control type 'no_overshoot':
Kp = 390.0
Ti = 1.0
Td = 0.66
5 sebagai suatu nilai force [gaya] dengan satuan Newton.

Gambar 5 — Cruise control system

Pemodelan vehicle dynamics

Untuk vehicle dynamics, sebagai sebuah contoh, kita akan memodelkan sebuah mobil. Model mobil tersebut didasarkan pada Hukum Newton Kedua. Pertama-tama, model memiliki input

Control type 'p':
Kp = 975.0
Ti = _
Td = _

Control type 'pi':
Kp = 877.5
Ti = 1.6
Td = _

Control type 'pd':
Kp = 1560.0
Ti = _
Td = 0.25

Control type 'classic_pid':
Kp = 1170.0
Ti = 1.0
Td = 0.25

Control type 'pessen_integral_rule':
Kp = 1365.0
Ti = 0.8
Td = 0.3

Control type 'some_overshoot':
Kp = 643.5
Ti = 1.0
Td = 0.66

Control type 'no_overshoot':
Kp = 390.0
Ti = 1.0
Td = 0.66
5 dan output
Control type 'p':
Kp = 975.0
Ti = _
Td = _

Control type 'pi':
Kp = 877.5
Ti = 1.6
Td = _

Control type 'pd':
Kp = 1560.0
Ti = _
Td = 0.25

Control type 'classic_pid':
Kp = 1170.0
Ti = 1.0
Td = 0.25

Control type 'pessen_integral_rule':
Kp = 1365.0
Ti = 0.8
Td = 0.3

Control type 'some_overshoot':
Kp = 643.5
Ti = 1.0
Td = 0.66

Control type 'no_overshoot':
Kp = 390.0
Ti = 1.0
Td = 0.66
2. Kita bisa menggambar objek mobil tersebut seperti pada Gambar 6.

Gambar 6 —

Mobil memiliki massa u[.]1 yang, dalam kasus ini, bernilai konstan. Mobil bergerak dengan memiliki kecepatan u[.]2 atau u[.]3 [turunan pertama dari posisi] dan memiliki percepatan u[.]4 atau u[.]5 [turunan pertama dari kecepatan] atau u[.]6 [turunan kedua dari posisi]. Sinyal kontrol

Control type 'p':
Kp = 975.0
Ti = _
Td = _

Control type 'pi':
Kp = 877.5
Ti = 1.6
Td = _

Control type 'pd':
Kp = 1560.0
Ti = _
Td = 0.25

Control type 'classic_pid':
Kp = 1170.0
Ti = 1.0
Td = 0.25

Control type 'pessen_integral_rule':
Kp = 1365.0
Ti = 0.8
Td = 0.3

Control type 'some_overshoot':
Kp = 643.5
Ti = 1.0
Td = 0.66

Control type 'no_overshoot':
Kp = 390.0
Ti = 1.0
Td = 0.66
5 bertujuan untuk memberikan gaya gerak pada mobil sehingga
Control type 'p':
Kp = 975.0
Ti = _
Td = _

Control type 'pi':
Kp = 877.5
Ti = 1.6
Td = _

Control type 'pd':
Kp = 1560.0
Ti = _
Td = 0.25

Control type 'classic_pid':
Kp = 1170.0
Ti = 1.0
Td = 0.25

Control type 'pessen_integral_rule':
Kp = 1365.0
Ti = 0.8
Td = 0.3

Control type 'some_overshoot':
Kp = 643.5
Ti = 1.0
Td = 0.66

Control type 'no_overshoot':
Kp = 390.0
Ti = 1.0
Td = 0.66
5 memiliki arah yang sama dengan u[.]9, u[.]2, maupun u[.]4. Di lain sisi, terdapat pula gaya gesek pada mobil yang mana gaya tersebut menghambat laju mobil sehingga gaya gesek memiliki arah yang berlawanan dengan
Control type 'p':
Kp = 975.0
Ti = _
Td = _

Control type 'pi':
Kp = 877.5
Ti = 1.6
Td = _

Control type 'pd':
Kp = 1560.0
Ti = _
Td = 0.25

Control type 'classic_pid':
Kp = 1170.0
Ti = 1.0
Td = 0.25

Control type 'pessen_integral_rule':
Kp = 1365.0
Ti = 0.8
Td = 0.3

Control type 'some_overshoot':
Kp = 643.5
Ti = 1.0
Td = 0.66

Control type 'no_overshoot':
Kp = 390.0
Ti = 1.0
Td = 0.66
5. Gaya gesek tersebut didefiniskan sebagai nilai konstan Kp3 dikali kecepatan.

Setelah semua karakteristik parameter-parameter pada mobil diketahui, sekarang kita bisa memulai memodelkannya secara matematis. Kita mulai dari Hukum Kedua Newton, seperti yang ditunjukkan oleh Persamaan 5.

Persamaan 5 — Hukum Kedua Newton

di mana u[.]1 adalah massa [kg], u[.]4 adalah percepatan [m/s²], dan Kp6 adalah total gaya [N]. Kemudian, berdasarkan Gambar 6, kita bisa mengkombinasikan semua gaya yang bekerja di mobil, seperti yang ditunjukkan oleh Persamaan 6.

Persamaan 6 — Model sederhana dinamika mobil

di mana u[.]5 adalah turunan dari kecepatan [alias percepatan], Kp3 adalah konstanta gaya gesek pada mobil [Nm/s], dan

Control type 'p':
Kp = 975.0
Ti = _
Td = _

Control type 'pi':
Kp = 877.5
Ti = 1.6
Td = _

Control type 'pd':
Kp = 1560.0
Ti = _
Td = 0.25

Control type 'classic_pid':
Kp = 1170.0
Ti = 1.0
Td = 0.25

Control type 'pessen_integral_rule':
Kp = 1365.0
Ti = 0.8
Td = 0.3

Control type 'some_overshoot':
Kp = 643.5
Ti = 1.0
Td = 0.66

Control type 'no_overshoot':
Kp = 390.0
Ti = 1.0
Td = 0.66
5 adalah sinyal kontrol. Karena gaya gesek pada mobil memiliki arah yang berlawanan dengan kecepatan, Kp3 memiliki notasi negatif. Berhubung output yang diinginkan adalah kecepatan, kita harus mengubah nilai u[.]4 atau u[.]5 menjadi u[.]2. Dan karena u[.]4 adalah turunan dari u[.]2, kita bisa mendapatkan nilai u[.]2, seperti yang ditunjukkan oleh Persamaan 7.

Persamaan 7 — Turunan kecepatan

di mana ∆v adalah perbedaan kecepatan.

Kemudian, dengan menentukan nilai Ki7 [waktu], pada Persamaan 6 dan Persamaan 7, kita bisa mendapatkan, secara berurutan, Persamaan 8 [a] dan Persamaan 8 [b].

Persamaan 8 — Memasukkan nilai t

di mana Ki8 adalah nilai percepatan pada saat waktu Ki9; Kd0 adalah nilai kecepatan pada saat waktu Ki7; Kd2 adalah nilai sinyal kontrol pada saat waktu Ki7; Kd4 adalah nilai kecepatan pada saat waktu Ki9.

Dengan mensubstitusi Persamaan 8 [a] ke dalam Persamaan 8 [b], kita bisa mendapatkan nilai Kd4, yang merupakan persamaan final dari model matematis car dynamics kita, seperti yang ditunjukkan oleh Persamaan 9.

Persamaan 9 — Bentuk final modelPenerapan di Python

Akhirnya, kita mencapai bagian terakhir, bagian yang paling ditunggu-tunggu. Kita akan menerapkan sistem seperti yang ditunjukkan oleh Gambar 5 ke dalam Python. Lalu untuk controller-nya, kita akan menerapkan PID bentuk diskrit seperti yang ditunjukkan oleh Persamaan 4. Untuk modelnya, kita akan menerapkan model matematis seperti yang ditunjukkan oleh Persamaan 9. Terakhir, untuk mendapatkan konstanta Kp, Ti, dan

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
0 yang optimal pada model tersebut, kita akan menerapkan metode Ziegler-Nichols PID tuning.

Menerapkan controller di Python

Kita akan menggunakan fitur yield generator pada Python. Kita akan mendefinisikan sebuah function; kita namakan e[.]0, dan function ini akan men-calculate input untuk per satuan waktu Ki7. Kita bisa menggunakan Code 1 di bawah ini, yang mana sudah saya beri docstring dan comments untuk tiap bagiannya.

Code 1 — PID function

Menerapkan model di Python

Selanjutnya, kita bisa menerapkan model car dynamics di Python. Kita bisa menggunakan function seperti yang ditunjukkan oleh Code 2. Pada code tersebut, saya sudah memberikan docstring dan comments yang akan memudahkan dalam memahami function tersebut.

Code 2 — Car dynamics function

Menerapkan sistem secara keseluruhan di Python

Kita sudah memiliki functions e[.]0 dan e[.]3. Sekarang, kita bisa menerapkan cruise control system secara keseluruhan. Pertama-tama, sebagai contoh, nilai konstanta yang saya gunakan adalah sbb:

Kp = 500
Ti = 0.5
Td = 0.1
control_type = 'pid'
mass = 1000 # kg
frict = 50 # Nm/s

Nilai Kp, Ti, dan

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
0 yang saya tentukan di atas semata-mata hanya nilai asal. Namun, dengan nilai asal tersebut, mari kita lihat hasilnya.

Untuk menjalankan sistem ini, kita perlu mendefinisikan reference dan waktu. Pada contoh ini, saya menggunakan waktu total 50 detik, dengan e[.]7 nya tepat bernilai 1 detik. Berdasarkan total waktu tersebut, reference yang saya gunakan adalah 5 m/s selama 50 detik. Setelah itu, kita perlu melakukan for-loop sepanjang nilai total waktu tersebut untuk menghitung output controller dan output model untuk tiap satuan e[.]7. Kita bisa menerapkan hal tersebut dengan menggunakan Code 3. Pada code tersebut, saya telah memberikan comments yang dapat memudahkan dalam memahami cara kerja penerapan cruise control system di Python.

Code 3 — Cruise control system di Python

Setelah menjalankan Code 3, kita bisa melihat hasilnya dengan menggunakan Code 4 di bawah ini.

Code 4 — Plot hasil

Lalu hasil plotnya dapat dilihat pada Gambar 7 di bawah. Dapat dilihat bahwa walaupun ketiga konstanta PID ditentukan secara asal, controller tersebut cukup baik dalam mengendalikan model agar menyesuaikan reference.

Gambar 7 — Output cruise control system [konstanta PID tanpa tuning]

Berdasarkan nilai error yang didapatkan, kita bisa mengukur performa dari controller dengan menggunakan denga menggunakan Code 5. Nilai dari MSE, MAE, dan RMSE dari PID controller tanpa tuning adalah sbb:

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921

Code 5 — MSE, MAE, RMSE

Tuning controller

Sebelumnya, kita menggunakan controller dengan penentuan konstanta yang asal. Sekarang, kita akan mencoba menerapkan metode Ziegler-Nichols PID tuning yang telah dibahas di sesi awal. Berikut ini adalah tahapan-tahapan yang akan kita lakukan.

  1. Atur controller hanya menggunakan proportional
  2. Jalankan sistem pada step response
  3. Lakukan berulang hingga mendapatkan continuous oscillations
  4. Definisikan nilai
    Mean squared error: 0.848
    Mean absolute error: 0.268
    Root mean square error: 0.921
    6 dan hitung nilai
    Mean squared error: 0.848
    Mean absolute error: 0.268
    Root mean square error: 0.921
    7
  5. Hitung nilai Kp, Ti, dan
    Mean squared error: 0.848
    Mean absolute error: 0.268
    Root mean square error: 0.921
    0 sesuai dengan Gambar 4
  6. Jalankan kembali sistem dengan menggunakan full PID dan konstanta yang telah didapatkan

Untuk step 1 dan 2, tidak ada masalah. Untuk step 3, saya mencoba beberapa kali hingga mendapatkan continuous oscillations, seperti yang ditunjukkan oleh Gambar 8. Saya mendapatkannya pada saat nilai

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
6 sama dengan Ti5.

Gambar 8 — Continuous oscillations saat Ku = 1950

Kemudian, kita bisa mendapatkan nilai

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
7 dengan cara mengukur periode antar tiap peaks pada gelombang respon pada Gambar 8. Saya mendapati bahwa semua peaks berada pada nilai 9.75 m/s. Lalu nilai
Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
7 nya adalah 2.0.

peaks: [9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75 9.75]

Tu = 2.0

Untuk perhitungan Kp, Ti, dan

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
0 sesuai dengan Gambar 4, di bawah ini adalah apa yang saya dapat.

Control type 'p':
Kp = 975.0
Ti = _
Td = _

Control type 'pi':
Kp = 877.5
Ti = 1.6
Td = _

Control type 'pd':
Kp = 1560.0
Ti = _
Td = 0.25

Control type 'classic_pid':
Kp = 1170.0
Ti = 1.0
Td = 0.25

Control type 'pessen_integral_rule':
Kp = 1365.0
Ti = 0.8
Td = 0.3

Control type 'some_overshoot':
Kp = 643.5
Ti = 1.0
Td = 0.66

Control type 'no_overshoot':
Kp = 390.0
Ti = 1.0
Td = 0.66

Kita memiliki 7 jenis controller. Sekarang setelah kita coba semuanya pada sistem, kita mendapatkan hasil seperti yang ditunjukkan oleh Gambar 9. Kita bisa lihat bahwa terdapat tiga controller [

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
01,
Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
02, dan
Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
03] yang memberikan hasil buruk, bahkan error-nya membengkak hingga pangkat 10 yang besar. Controllers terbaik sepertinya adalah
Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
04 dan
Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
05. Walaupun begitu, controller
Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
06 hampir memberikan hasil yang mendekati reference, sedangkan
Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
07 terlalu banyak memiliki overshoots.

Gambar 9 — Reference vs feedback pada 7 jenis controller

Namun, untuk lebih jelasnya, mari kita bandingkan ketujuh tipe controller tersebut dalam hal MSE, MAE, RMSE. Gambar 10 menunjukkan hasilnya.

Gambar 10 — Komparasi MSE, MAE, RMSE pada 7 controllers

Sudah jelas, kita tidak perlu lagi membicarakan tipe

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
01,
Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
02, dan
Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
10. Pada indikator MSE, controller
Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
06 memberikan hasil terbaik. Pada indikator MAE, controller
Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
04 memberikan hasil terbaik. Pada indikator RMSE, controller
Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
06 kembali memberikan hasil terbaik. Pada Gambar 10, saya copy-paste hasil MSE, MAE, RMSE PID tanpa tuning. Bisa kita lihat ternyata hasil nilai konstanta asal mampu memberikan hasil yang baik.

Untuk mendapatkan semua hasil tuning di atas, kita bisa menggunakan Code 6 di bawah ini. Saya juga sudah menambahkan comments agar source codes tersebut dapat dipahami lebih mudah.

Code 6 — PID tuningPenutup

Kita telah membahas banyak hal pada artikel ini. Kita telah belajar apa itu PID, bagaimana men-tuning-nya, bagaimana merancang sebuah sistem kontrol dan memodelkan plant-nya, dan terakhir bagaimana menerapkan itu semua ke dalam Python. Biasanya bahasan teknik kontrol tersebut diterapkan di MATLAB, tetapi pada artikel ini kita telah membuat hal yang berbeda.

Perlu diketahui bahwa model yang kita gunakan di atas adalah oversimplified sehingga terlalu mudah bagi PID controller, bahkan PID tanpa tuning pun bisa memberikan hasil yang cukup baik [walaupun controller tipe

Mean squared error: 0.848
Mean absolute error: 0.268
Root mean square error: 0.921
02 tak mampu mengendalikannya]. Namun, seharusnya model dapat dikembangkan dengan memasukkan beragam disturbance lain, seperti gravitasi, aerodinamika, rolling force, dll. Tetapi, hal tersebut di luar dari bahasan artikel ini.

Penerapan PID Controller pada Python bisa dikatakan cukup mudah. Di lain kesempatan, saya akan mencoba membahas hal lain mengenai penerapan sistem kontrol di Python. Namun, anda juga bisa membaca penerapan metode PID auto-tuning di artikel saya ini.

Terakhir, bagi anda yang ingin lihat source codes secara utuh, sila akses file notebook-nya di GitHub repo saya di sini.

Bài mới nhất

Chủ Đề