Untitled
unknown
plain_text
10 months ago
3.9 kB
17
Indexable
clc; clear; close all;
% ===== 1. Variabel =====
kecepatan = 0:1:6000;
suhu = 270:1:330;
frekuensi = 2000:1:7000;
% ===== 2. Membership Function =====
% Kecepatan (Trapesium & Triangular)
mu_lambat = trapmf(kecepatan,[1000 1000 2500]);
mu_sedang = trimf(kecepatan,[1800 3000 4300]);
mu_cepat = trapmf(kecepatan,[3500 4500 5000 5000]);
% Suhu (Gaussian)
mu_dingin = gaussmf(suhu, [60 150]);
mu_normal = gaussmf(suhu, [70 350]);
mu_panas = gaussmf(suhu, [60 550]);
% Output Frekuensi (ZMF & SMF)
a_rendah = 2000; b_rendah = 4500; %ZMF
a_tinggi = 4500; b_tinggi = 7000; %SMF
mu_rendah = zmf(frekuensi,[a_rendah b_rendah]);
mu_tinggi = smf(frekuensi,[a_tinggi b_tinggi]);
% ===== 3. Input =====
x_kecepatan = 4000;
x_suhu = 300;
% Derajat Keanggotaan input
deg_lambat = interp1(kecepatan, mu_lambat, x_kecepatan);
deg_sedang = interp1(kecepatan, deg_sedang, x_kecepatan);
deg_cepat = interp1(kecepatan, deg_panas, x_kecepatan);
deg_dingin = interp1(suhu, mu_dingin, x_suhu);
deg_normal = interp1(suhu, mu_normal, x_suhu);
deg_panas = interp1(suhu, mu_panas, x_suhu);
% ===== 4, Inferensi Rule Tsukamoto =====
alpha1 = min(deg_lambar, deg_dingin)
alpha2 = min(deg_cepat, deg_panas)
alpha3 = min(deg_sedang, deg_normal)
alpha4 = min(deg_cepat, deg_normal)
z1 = (alpha1>0)*inv_zmf(a_rendah, b_rendah, alpha1)
z2 = (alpha2>0)*inv_smf(a_tinggi, b_tinggi, alpha2)
z3 = (alpha3>0)*inv_zmf(a_rendah, b_rendah, alpha3)
z4 = (alpha4>0)*inv_smf(a_tinggi, b_tinggi, alpha4)
%===== 5. Defuzzifikasi =====
alphas = [alpha1 alpha2 alpha3 alpha4];
zs = [z1 z2 z3 z4];
aktif = alphas > 0;
z_final = sum(alphas(aktif).*zs(aktif)) / sum(alphas(aktif));
fprintf('Hasil Defuzzifikasi Tsukamoto: %.2f rpm\n', z_final);
%===== 6. Visualisasi =====
figure;
hold on;
% Plot membership function ZMF & SMF
plot(frekuensi, mu_rendah, 'b--', 'LineWidth', 1.5);
plot(frekuensi.mu_tinggi, 'r--', 'LineWidth', 1.5);
% Buat Area clipping tiap rule
outR1 = min(alpha1, mu_rendah);
outR3 = min(alpha3, mu_rendah);
outR2 = min(alpha2, mu_tinggi);
outR4 = min(alpha4, mu_tinggi);
area(frekuensi, outR1, 'FaceColor', 'b', 'FaceAlpha', 0.15, 'EdgeColor', 'none');
area(frekuensi, outR3, 'FaceColor', 'c', 'FaceAlpha', 0.25, 'EdgeColor', 'none');
area(frekuensi, outR2, 'FaceColor', 'r', 'FaceAlpha', 0.15, 'EdgeColor', 'none');
area(frekuensi, outR4, 'FaceColor', 'm', 'FaceAlpha', 0.25, 'EdgeColor', 'none');
% Garis Firing Strength (Horizontal)
yline(alpha1,'--b','R1');
yline(alpha3,'--c','R3');
yline(alpha2,'--r','R2');
yline(alpha4,'--m','R4');
% Titik z1-z4
plot([z1 z1],[0 alpha1],'ob','MarkerFaceColor','b');
plot([z3 z3],[0 alpha3],'oc','MarkerFaceColor','c');
plot([z2 z2],[0 alpha2],'or','MarkerFaceColor','r');
plot([z4 z4],[0 alpha4],'om','MarkerFaceColor','m');
%Garis Defuzzifikasi Akhir
plot([z_final z_final],[0 1],'k','LineWidth',2);
xlabel('Frekuensi (rpm)');
ylabel('\mu');
title('Visualisasi Tsukamoto (Area Clipping + Titik z1-z4');
legend('RENDAH (MF)','TINGGI (MF)','Area R1','Area R2','Area R3','Area R4' ...
'R1','R3','R2','R4','z1','z3','z2','4' ...
'Defuzzifikasi','Location','bestoutside');
ylim([0 1.1]); grid on;
%===== 7. Tampilkan Hasil Crisp di Grafik =====
text(z_final, 1.05, sprintf('Hasil Defuzzifikasi = %.2f rpm', z_final), ...
'HorizontalAlignment', 'center', 'VerticalAlignment', 'bottom', ...
'FontWight', 'bold', 'BackGroundColor', 'w', 'EdgeColor', 'k');
%===== 8. Function Lokal =====
function z = inv_zmf(a,b,alpha)
if alpha >= 0.5
z = a + (b-a)*sqrt((1-alpha)/2);
else
z = b - (b-a)*sqrt(alpha/2);
end
end
function z = inv_smf(a,b,alpha)
if alpha <= 0.5
z = a + (b-a)*sqrt(alpha/2);
else
z = b - (b-a)*sqrt((1-alpha)/2);
end
end
Editor is loading...
Leave a Comment