Untitled

 avatar
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