Showing posts with label MATLAB. Show all posts
Showing posts with label MATLAB. Show all posts

Monday, November 25, 2024

Low pass filter waktu diskrit dan kontinu

Transfer function Laplace (s) untuk low pass filter

G(s) = K/(1+Tc.s)

dimana K adalah gain filter, Tc adalah konstanta waktu filter, s adalah variabel Laplace.

Persamaan beda untuk low pass filter diskrit

x[n+1] = (1-Ts/Tc).x[n] + K.(Ts/Tc).u[n]

y[n] = x[n]

dimana Ts adalah time sampling, Tc adalah konstanta waktu filter (cut-off), K adalah gain filter, dan u[n] adalah sinyal input filter.

Low-Pass Filter (Discrete or Continuous)

Friday, March 3, 2023

Script metode penghindaran rintangan dalam dua dimensi (2D)

Suatu kendaraan udara, misalnya UAV, bergerak menuju target sambil menghindari bangunan atau rintangan apa pun. Algoritma ini terdiri dari dua bagian. Pertama, algoritma untuk memandu UAV bergerak menuju target dengan menaikkan atau menurunkan heading angle (psi) hingga tepat mengarah ke target. Bagian kedua, algoritma untuk menghitung gaya tolak dari rintangan apapun terhadap UAV untuk menghindari tabrakan. Gaya tolakan (berupa akselerasi) ini kemudian ditambahkan ke kecepatan UAV dan memberikan arah untuk menghindari rintangan. Sambil menghindari rintangan, algoritma pertama memandu UAV menuju target. Kedua bagian ini bekerja secara simultan hingga UAV mencapai target. Script ini dikembangkan menggunakan MATLAB 2016A.

Kata kunci; menghindari rintangan, obstacle avoidance, unmanned aero vehicle (UAV), MATLAB

Tuesday, December 13, 2022

Men-diagonal-kan matriks persegi yang memiliki eigenvalue berbeda

Lemma. Suatu matriks A n×n dapat didiagonalisasi jika dan hanya jika A memiliki n eigenvector v1,v2,...,vn yang bebas linier (linierly independent).

Misalnya, λ1,λ2,...,λn adalah eigenvalue yang sesuai dengan eigenvector v1,v2,...,vn. 

Kemudian, kita dapat menyusun:

  • matriks Q n×n dengan menempatkan vi sebagai kolom ke-i dari Q, (1 ≤ i ≤ n).
  • matriks diagonal n×n D = diag[λ1,λ2,...,λn].

Konstruksi di atas, memastikan bahwa A = QDQ-1.

Saturday, November 26, 2022

Model matematik 6-DOF dalam frame Earth-Centered Earth-Fixed

Tulisan ringkas ini menjelaskan model matematik enam derajat kebebasan (six degree of freedom) suatu titik massa dalam frame Earth-Centered Earth Fixed.

Enam derajat kebebasan adalah tiga gerak translasi (X, Y, Z) dan tiga gerak rotasi (Roll, Pitch, dan Yaw).


Maksud dari Earth-Centered Earth Fixed (ECEF) adalah model matematik dalam tulisan ini menggunakan Bumi elips dan berotasi sebagai koordinat acuan.

Tuesday, November 22, 2022

Memahami Intrapolasi 3-D dan 4-D dengan metode Spline

Intrapolasi adalah sebuah metode dalam analisis numerik yang bertujuan untuk mendapatkan data baru dari kumpulan data-data diskret yang telah ada sebelumnya menggunakan sebuah algoritma tertentu. Terdapat banyak variasi intrapolasi untuk mendapatkan data-data baru. Di antaranya ialah intrapolasi linear, yaitu menggunakan bentuk persamaan linear antara titik untuk menemukan titik-titik di antara kedua titik tersebut, dan intrapolasi kuadratik, yaitu membuat persamaan kuadrat untuk menemukan titik hasil intrapolasi.

Tulisan ini akan menjelaskan intrapolasi kubik spline, yaitu salah satu metode intrapolasi yang menggunakan metode piecewise polynomials (intrapolasi sepotong demi sepotong) pangkat tiga antara titik-titik yang telah diketahui. Titik-titik yang telah diketahui ini akan dibuat polinomial pangkat tiganya secara iterasi atau sedikit demi sedikit hingga mencapai ke titik paling akhir. Kelebihan fungsi ini ialah dapat mengonstruksi sebuah garis yang cukup akurat dan tidak ada titik yang berubah secara tiba-tiba. Terdapat beberapa karakteristik yang dimiliki oleh intrapolasi jenis ini, salah satunya ialah memiliki kontinuitas 𝐶2 pada titik-titik knot-nya (titik sampel yang telah diketahui sebelumnya). Untuk lebih jelasnya ...

(PDF) Memahami Intrapolasi 3-D dan 4-D dengan Metode Spline Menggunakan Fungsi MATLAB interp3. 

Available from: https://www.researchgate.net/publication/364091881_Memahami_Intrapolasi_3-D_dan_4-D_dengan_Metode_Spline_Menggunakan_Fungsi_MATLAB_interp3 [accessed Nov 22 2022].

Thursday, September 8, 2022

Tuning kontroler PID dengan MATLAB script

Saya ingin coba membuat kontroler PI untuk sistem kontinu berikut dengan script MATLAB.

Sys = 1/(s+1)3

Pertama, saya buat representasi sistem Sys di atas dengan fungsi zpk

Friday, November 12, 2021

Monday, October 26, 2020

Script MATLAB: Plot spektrum frekuensi

fs = 1e3; % Sample frequency (Hz)

t = [0:1/fs:10]; % Time vector

x = 5*sin(2*pi*300.*t)+2*sin(2*pi*100.*t); % Signal

y = fft(x);

n = length(x);          % number of samples

f = (0:n-1)*(fs/n);     % frequency range

power = abs(y).^2/n;    % power of the DFT

plot(f,power)

xlabel('Frequency')

ylabel('Power')

Saturday, October 24, 2020

Script MATLAB: Kalman filter diskrit

% MATLAB SCRIPT FOR DISCRETE KALMAN FILTER IN NOISY MEASUREMENT SIGNAL


clc


%% INPUT

y = signal(:,2);    % Signal

t = signal(:,1);    % Time vector

n = length(y);


%% ESTIMASI PARAMETER MODEL AUTO-REGRESSIVE ORDE 2

% y[k] = fi0 + fi1.y[k-1] + fi2.y[k-1]


x1 = 0;

x2 = 0;


x1(1) = 0;

x1(2) = y(1);

x2(1) = 0;

x2(2) = 0;

X(1,:) = [1 x1(1) x2(1)];

X(2,:) = [1 x1(2) x2(2)];


for k = 3:n

    x1(k)  = y(k-1);

    x2(k)  = y(k-2);

    X(k,:) = [1 x1(k) x2(k)];

end


fi = inv(X'*X)*X'*y; % fi0, fi1, fi2


%% DISCRETE KALMAN FILTER

% Define:

% x1[k] = y[k-1]

% x2[k] = y[k-2]


Q = eye(2)*0.001;

R = eye(1)*0.01;

A = [fi(2) fi(3);1 0];    % [fi(2) fi(3);1 0]

F = [fi(1) 0]';           % fi(1)

H = [fi(2) fi(3)];


xmin = [0 0]';

Pmin = 0.01*speye(2);


for i = 1:n

    x = A*xmin+F;

    P = A*Pmin*A'+Q;


    K = P*H'*inv(H*P*H'+R);

    x = x+K*(y(i)-H*x);

    P = (speye(2)-K*H)*P;

    zest(i) = H*x+fi(1);

    

    xmin = x;

    Pmin = P;

end


%% PLOT

figure

plot(t,zest,'LineWidth',1);

set(gca,'FontSize',12)

xlabel('Time (s)','FontSize',12);

ylabel('Voltage','FontSize',12);

axis([0 5 0 0.01])


Wednesday, October 21, 2020

Mencari solusi non-trivial untuk sistem persamaan linier homogen

Diketahui satu sistem persamaan

   -4x1 + 2x2 +x3 = 0

   2x1 + 3x2 - x3 = 0

   -2x1 + 5x2 = 0

Sistem di atas bisa direpresntasikan sebagai Ax = b, dimana

   A = [-4 2 1;2 3 -1;-2 5 0]

   x = [x1 x2 x3]

   b = [0; 0; 0]

Karena persamaan 3 adalah jumlahan dari persamaan 1 dan 2 maka:

   - sistem ini tidak punya solusi trivial (eksak), tetapi punya solusi non-trivial,

   - determinan A adalah 0 sehingga A adalah matriks singular.

Untuk mencari solusi sistem di atas dengan MATLAB, gunakan fungsi reduksi baris pada matriks gabungan [A b] dengan fungsi rref

>> x = rref([A b])

ans =

    1.0000         0   -0.3125         0

         0    1.0000   -0.1250         0

         0            0             0         0

Arti dari hasil di atas adalah menyatakan x1 dan x2 sebagai fungsi dari x3

   x2 = 0.125x3

   x1 = 0.3125x3

dimana x3 dapat diisi dengan sembarang bilangan riel.

Sunday, October 18, 2020

Mencari solusi sistem persamaan linier yang lebih banyak dari variabelnya

Misalnya ada sistem persamaan linier seperti ini:

    2x1 - x2 + 5x3 = 5

    4x1 + 7x2 - x3 = 2

    -x1 - 3x2 - 4x3 = 3

    x1 + x2 + x3 = 1

Ada empat persamaan dan tiga variabel. Jumlah persamaan lebih banyak daripada jumlah variabel yang dicari. Sistem ini disebut overdetermined.

Sistem semacam ini bisa diselesaikan dengan Pseudo-Inverse.

Nyatakan sistem persamaan dalam matriks Ax = b

dimana 

    A = [2 -1 5;4 7 -1;-1 -3 -4;1 1 1]

    x = [x1; x2; x3]

    b = [5; 2; 3; 1]

Solusinya dapat dihitung dengan x = pinv(A)b, dimana pinv(A) adalah pseudo inverse dari A.

Saya coba dengan MATLAB, didapatlah solusi

x = [2.8348; -1.3939; -0.4137]

Untuk cek, bisa dicoba Ax seharusnya sama dengan b

Ax = [4.9950; 1.9961; 3.0016; 1.0273]

Nilai Ax tidak persis sama dengan b, namun mendekati nilai b, karena pseudo-inverse dihitung secara numerik iteratif, bukan eksak.

Saturday, August 8, 2020

Menyimpan workspace dalam .mat dengan nama file mengambil dari nilai salah satu variabel

Misal:

m = 1;

a = [1,2,3,4,5];

save(['data_',num2str(m),'.mat'])

OUTPUT: data_1.mat

===

m = 2;

a = [6,7,8,9,10];

save(['data_',num2str(m),'.mat'])

OUTPUT: data_2.mat

===

Wednesday, April 1, 2020

Simulink rangkaian battery charging

Karena tidak saya temukan di Google, saya coba menyusun rangkaian charging generic battery dengan Simulink MATLAB 2016.

Grafik SoC baterai (%). Baterai penuh pada detik ke 200.

Grafik tegangan charger. Ketika baterai makin terisi, tegangan makin naik.

Grafik arus charger yang masuk baterai. Karena tegangan baterai bertambah, arus charger makin berkurang.

Semoga bermanfaat.

Friday, March 30, 2018

When the tic-toc measurement is not reasonable?

Bismillah. In the Name of Allah, is the start of all things good. We too shall start with it.
(Said Nursi d. 1960)

I need to measure the computing time of my program for several matrix order. Tic-toc is perhaps very useful function provided in MATLAB for this task. But sometimes (not so much), this tic-toc gave me unreasonable time record for my program. Here for the example ...

Matrix Order |   1    |   2    |    3   | ...
Time         | 0.0122 | 0.0023 | 0.0015 | ...

It’s very weird situation. How can larger order matrix (2) takes faster time than (1). And it is also happened in other similar situations. I attempted any possible clue in getting rid of this problem: single thread computation, variable pre-declaration, running one-by-one instead of loop, etc. But nothing worked.

Saturday, March 10, 2018

Photo-Voltaic Array for Battery Charging: A Simulation Study

I’m running on a simulation research involving a Photo-Voltaic Array (PV Array), a Battery, and a DC Machine using MATLAB Simulink 2017. The condition is very simple: DC Motor (5 HP, 240 V, 16 A) is supplied with a Battery (240 V, 20 Ah), and when the Battery goes down PV Array is turned ON and the battery is charged. I just want to tell the detailed story here, perhaps will be useful for someone around the globe faced with the similar case.

Bismillah... In the Name of God...

Friday, February 2, 2018

Kalman Filter untuk Pengukuran Kecepatan Kapal


Bismillah. Rekan saya punya data pengukuran kecepatan kapal dari hasil uji lab terhadap miniatur kapalnya. Sayangnya, data pengukuran ini bercampur noise dan filter di sensornya tidak bekerja padahal dia perlu data yang bersih untuk memastikan kecepatan kapal sebenarnya. Lalu, saya mulai mengkaji dan merancang filternya. Prosedur utamanya ada dua:
  1. Memodelkan data pengukuran dengan Auto-Regressive orde 2
  2. Merancang Kalman filter dengan melibatkan model tersebut
Masing2 butir sudah saya jelaskan lebih detil di [1] dan [2].

Saturday, January 27, 2018

Efisien Membuat Matriks Identitas Ordo Puluhan/Ratusan Ribu

Mudah saja bila kita punya memory ram yang amat besar, atau ruang hardis yang longgar untuk virtual memory (swap/pagefile). Ordo 100rb saja, kita akan perlu memory 80 GB. Namun, untuk laptop rerata seperti punya saya, perlu ada akal2an untuk melakukan perhitungan matriks ordo puluhan/ratusan ribu. Alhamdulillah, MATLAB juga telah menyediakan olah matriks Sparse yang sangat tepat untuk kebutuhan terhadap matriks yang sebagian besar elemennya bernilai nol.

Tuesday, January 23, 2018

Efisiensi Iterasi Fungsi dengan Curve Fitting

Bismillah. Saya perlu membuat plot grafik dari suatu fungsi, f(t). Fungsinya sangat sederhana namun melibatkan matriks dengan ordo puluhan ribu. Sehingga, sekali iterasi bisa menanti 1500 detik. padahal saya perlu membuat plot kurva dalam 20 detik. Anggaplah iterasi dilakukan per detik, maka perlu 30000 detik, bisa meniren aku menanti.

Jadinya, saya buat iterasi tiap dua detik, jadi cuman 10 iterasi = 15000 detik. Ya... lumayan 50%. Namun kelemahannya, kurvanya nampak kaku, patah-patah, tidak smooth. Prof saya memberi intruksi agar coba menggunakan curve fitting atau smoothing di MATLAB. Saya googling, ternyata MATLAB menyediakannya, fungsi fit namanya.


z=fit(t,f,'splineinterp');
plot(z,'k',t,f,':');

Kodenya sederhana sekali dan perbandingan hasilnya, saya tampilkan pada gambar di atas. t adalah waktu, f adalah nilai fungsi tanpa fitting, dan z adalah hasil curve fitting, 'splineinterp' artinya saya menggunakan cubic interpolation. Alhamdulillah.

Saya menggunakan MATLAB 2008, very old. Saya kira versi 2017 jauh lebih magnificent.

Referensi

Friday, January 19, 2018

Efisiensi Memory dengan Sparse Matrix, Very Magnificent !

Bismillah. Masih seputar problematika komputasi matrix ordo tinggi yang sedang saya hadapi di MATLAB. Saya harus melakukan komputasi dengan matriks berordo 60rb x 60rb. Sepekan ini, saya stuck dibuatnya.

Pertama, saya menjumpai persoalan ketersediaan memory, solusi yang saya lakukan adalah menambah virtual memory hingga 30 GB. Persoalan memory selesai, saya jumpa persoalan komputasi. Beberapa kali setelah menanti luaama sekali, laptop macet, tidak respons sama sekali hingga harus di shutdown paksa.

Kedua, saya memperkecil pemakaian memory untuk matriks dengan menggunakan format 'single' hingga 50% efisiensinya. Namun ternyata persoalan komputasi masih belum teratasi.

Efisiensi Memory dengan Format Single untuk Matriks Ordo Tinggi

Bismillah. Ordo matriks terbesar yang saya libatkan adalah 60rb x 60rb. Secara default, MATLAB memerlukan memory sebanyak

60rb x 60rb x 8 bytes ~ 29 GB

Memory ram saya cuman 4 GB, virtual memory juga saya set hingga 50 GB. Komputasi menyita sebagian besar prosesor hingga laptop sering tidak responsif. Untuk mereduksi penggunaan memory, saya gunakan format bilangan single yang hanya memerlukan 4 bytes memory. Cara konversinya mudah sekali, misalnya