$muda, 'dewasa' => $dewasa, 'tua' => $tua); } public static function fuzzifikasi_luas_lahan($luas_lahan) { // Fuzzifikasi for Luas Lahan // Derajat keanggotaan linier turun untuk kategori 'kecil' $kecil = max(0, min((700 - $luas_lahan) / (700 - 300), 1)); $kecil = self::round_float($kecil); // Derajat keanggotaan segitiga untuk kategori 'sedang' $sedang = max(0, min(($luas_lahan - 300) / (700 - 300), (1000 - $luas_lahan) / (1000 - 700))); $sedang = self::round_float($sedang); // Derajat keanggotaan linier naik untuk kategori 'besar' $besar = max(0, min(($luas_lahan - 700) / (1000 - 700), 1)); $besar = self::round_float($besar); return array('kecil' => $kecil, 'sedang' => $sedang, 'besar' => $besar); } public static function fuzzifikasi_tinggi_air($tinggi_air) { // Fuzzifikasi for Tinggi Air // Derajat keanggotaan linier turun untuk kategori 'rendah' $rendah = max(0, min((10 - $tinggi_air) / (10 - 5), 1)); $rendah = self::round_float($rendah); // Derajat keanggotaan segitiga untuk kategori 'sedang' $sedang = max(0, min(($tinggi_air - 5) / (10 - 5), (15 - $tinggi_air) / (15 - 10))); $sedang = self::round_float($sedang); // Derajat keanggotaan linier naik untuk kategori 'tinggi' $tinggi = max(0, min(($tinggi_air - 10) / (15 - 10), 1)); $tinggi = self::round_float($tinggi); return array('rendah' => $rendah, 'sedang' => $sedang, 'tinggi' => $tinggi); } public static function rule_evaluation($usia_tanaman_membership, $tinggi_air_membership, $luas_lahan_membership) { // Rules for Kebutuhan Air Rendah $kebutuhan_air_rendah_rules = array( // Rule 1 array( "usia_tanaman" => "muda", "tinggi_air" => "sedang", "luas_lahan" => "kecil", "rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['sedang'], $luas_lahan_membership['kecil']), "kebutuhan_air" => "rendah" ), // Rule 2 array( "usia_tanaman" => "muda", "tinggi_air" => "tinggi", "luas_lahan" => "kecil", "rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['kecil']), "kebutuhan_air" => "rendah" ), // Rule 3 array( "usia_tanaman" => "muda", "tinggi_air" => "tinggi", "luas_lahan" => "besar", "rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['besar']), "kebutuhan_air" => "rendah" ), // Rule 4 array( "usia_tanaman" => "muda", "tinggi_air" => "sedang", "luas_lahan" => "sedang", "rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['sedang'], $luas_lahan_membership['sedang']), "kebutuhan_air" => "rendah" ), // Rule 5 array( "usia_tanaman" => "muda", "tinggi_air" => "tinggi", "luas_lahan" => "sedang", "rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['sedang']), "kebutuhan_air" => "rendah" ), // Rule 6 array( "usia_tanaman" => "muda", "tinggi_air" => "sedang", "luas_lahan" => "besar", "rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['sedang'], $luas_lahan_membership['besar']), "kebutuhan_air" => "rendah" ), // Rule 7 array( "usia_tanaman" => "dewasa", "tinggi_air" => "tinggi", "luas_lahan" => "kecil", "rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['kecil']), "kebutuhan_air" => "rendah" ), // Rule 8 array( "usia_tanaman" => "dewasa", "tinggi_air" => "tinggi", "luas_lahan" => "sedang", "rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['sedang']), "kebutuhan_air" => "rendah" ), // Rule 9 array( "usia_tanaman" => "dewasa", "tinggi_air" => "tinggi", "luas_lahan" => "besar", "rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['besar']), "kebutuhan_air" => "rendah" ), // Rule 10 array( "usia_tanaman" => "tua", "tinggi_air" => "tinggi", "luas_lahan" => "kecil", "rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['kecil']), "kebutuhan_air" => "rendah" ), // Rule 11 array( "usia_tanaman" => "tua", "tinggi_air" => "tinggi", "luas_lahan" => "sedang", "rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['sedang']), "kebutuhan_air" => "rendah" ), // Rule 12 array( "usia_tanaman" => "tua", "tinggi_air" => "tinggi", "luas_lahan" => "besar", "rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['tinggi'], $luas_lahan_membership['besar']), "kebutuhan_air" => "rendah" ), // Rule 13 array( "usia_tanaman" => "tua", "tinggi_air" => "sedang", "luas_lahan" => "kecil", "rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['sedang'], $luas_lahan_membership['kecil']), "kebutuhan_air" => "rendah" ), // Rule 14 array( "usia_tanaman" => "tua", "tinggi_air" => "sedang", "luas_lahan" => "sedang", "rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['sedang'], $luas_lahan_membership['sedang']), "kebutuhan_air" => "rendah" ), // Rule 15 array( "usia_tanaman" => "tua", "tinggi_air" => "sedang", "luas_lahan" => "besar", "rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['sedang'], $luas_lahan_membership['besar']), "kebutuhan_air" => "rendah" ), ); // Rules for Kebutuhan Air Tinggi $kebutuhan_air_tinggi_rules = array( // Rule 1 array( "usia_tanaman" => "muda", "tinggi_air" => "rendah", "luas_lahan" => "kecil", "rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['rendah'], $luas_lahan_membership['kecil']), "kebutuhan_air" => "tinggi" ), // Rule 2 array( "usia_tanaman" => "muda", "tinggi_air" => "rendah", "luas_lahan" => "sedang", "rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['rendah'], $luas_lahan_membership['sedang']), "kebutuhan_air" => "tinggi" ), // Rule 3 array( "usia_tanaman" => "muda", "tinggi_air" => "rendah", "luas_lahan" => "besar", "rule" => min($usia_tanaman_membership['muda'], $tinggi_air_membership['rendah'], $luas_lahan_membership['besar']), "kebutuhan_air" => "tinggi" ), // Rule 4 array( "usia_tanaman" => "dewasa", "tinggi_air" => "rendah", "luas_lahan" => "besar", "rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['rendah'], $luas_lahan_membership['besar']), "kebutuhan_air" => "tinggi" ), // Rule 5 array( "usia_tanaman" => "dewasa", "tinggi_air" => "sedang", "luas_lahan" => "besar", "rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['sedang'], $luas_lahan_membership['besar']), "kebutuhan_air" => "tinggi" ), // Rule 6 array( "usia_tanaman" => "dewasa", "tinggi_air" => "rendah", "luas_lahan" => "kecil", "rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['rendah'], $luas_lahan_membership['kecil']), "kebutuhan_air" => "tinggi" ), // Rule 7 array( "usia_tanaman" => "dewasa", "tinggi_air" => "sedang", "luas_lahan" => "kecil", "rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['sedang'], $luas_lahan_membership['kecil']), "kebutuhan_air" => "tinggi" ), // Rule 8 array( "usia_tanaman" => "dewasa", "tinggi_air" => "rendah", "luas_lahan" => "sedang", "rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['rendah'], $luas_lahan_membership['sedang']), "kebutuhan_air" => "tinggi" ), // Rule 9 array( "usia_tanaman" => "dewasa", "tinggi_air" => "sedang", "luas_lahan" => "sedang", "rule" => min($usia_tanaman_membership['dewasa'], $tinggi_air_membership['sedang'], $luas_lahan_membership['sedang']), "kebutuhan_air" => "tinggi" ), // Rule 10 array( "usia_tanaman" => "tua", "tinggi_air" => "rendah", "luas_lahan" => "kecil", "rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['rendah'], $luas_lahan_membership['kecil']), "kebutuhan_air" => "tinggi" ), // Rule 11 array( "usia_tanaman" => "tua", "tinggi_air" => "rendah", "luas_lahan" => "sedang", "rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['rendah'], $luas_lahan_membership['sedang']), "kebutuhan_air" => "tinggi" ), // Rule 12 array( "usia_tanaman" => "tua", "tinggi_air" => "rendah", "luas_lahan" => "besar", "rule" => min($usia_tanaman_membership['tua'], $tinggi_air_membership['rendah'], $luas_lahan_membership['besar']), "kebutuhan_air" => "tinggi" ), ); // Gabungkan hasil aturan untuk kedua kategori kebutuhan air $all_rules = array_merge($kebutuhan_air_rendah_rules, $kebutuhan_air_tinggi_rules); // Assign rule activations $rule_activations = array(); for ($i = 0; $i < count($all_rules); $i++) { $rule_activations["rule_$i"] = $all_rules[$i]; } return $rule_activations; // return array( // 'rule_activations' => $rule_activations // ); } public static function aggregation($rule_activations) { // Array untuk menyimpan nilai aktivasi tertinggi dari aturan yang berasal dari variabel rendah dan tinggi $max_activations = array( 'rendah' => -INF, 'tinggi' => -INF ); // Array untuk menyimpan aturan-aturan dengan nilai aktivasi tertinggi dari variabel rendah dan tinggi $max_activation_rules = array( 'rendah' => null, 'tinggi' => null ); // Iterasi melalui aturan-aturan dan pilih aturan dengan nilai aktivasi tertinggi dari variabel rendah dan tinggi foreach ($rule_activations as $rule => $activation) { $kebutuhan_air = $activation['kebutuhan_air']; $activation_degree = $activation['rule']; // Periksa apakah variabel kebutuhan air adalah 'rendah' atau 'tinggi' if ($kebutuhan_air === 'rendah' || $kebutuhan_air === 'tinggi') { // Periksa apakah aktivasi saat ini lebih besar dari nilai tertinggi yang disimpan if ($activation_degree > $max_activations[$kebutuhan_air]) { // Jika ya, perbarui nilai maksimum dan aturan yang sesuai $max_activations[$kebutuhan_air] = $activation_degree; $max_activation_rules[$kebutuhan_air] = array( 'rule' => $rule, 'activation' => $activation_degree ); } } } // Gabungkan nilai aktivasi tertinggi dari aturan variabel rendah dan tinggi $aggregated_output = max($max_activations['rendah'], $max_activations['tinggi']); // return $aggregated_output; return array('max_activations' => $max_activations, 'max_activation_rules' => $max_activation_rules, 'aggregated_output' => $aggregated_output); } public static function calculate_intersection_points($aggregated_output) { // Mengambil nilai aktivasi tertinggi dari variabel rendah dan tinggi // $nilai_aktivasi_rendah = $aggregated_output['rendah']; // $nilai_aktivasi_tinggi = $aggregated_output['tinggi']; $nilai_aktivasi_rendah = $aggregated_output['max_activations']['rendah']; $nilai_aktivasi_tinggi = $aggregated_output['max_activations']['tinggi']; // Menghitung titik perpotongan t1 dan t2 $t1 = ($nilai_aktivasi_rendah * 10) + 10; $t2 = ($nilai_aktivasi_tinggi * 10) + 10; return array('t1' => $t1, 't2' => $t2); } public static function integrate($rule_activations){ // Menambahkan fungsi round_float di sini function round_float($value) { return number_format((float)$value, 2, '.', ''); } function integrateFunction($lower_bound, $upper_bound, $function, $n = 1000) { $step = ($upper_bound - $lower_bound) / $n; $sum = 0; for ($i = 0; $i <= $n; $i++) { $x = $lower_bound + $i * $step; $sum += $function($x); if ($i !== 0 && $i !== $n) { $sum += $function($x); } } $integral = $step * $sum / 2; // return $integral; return round_float($integral); } $aggregated_output = self::aggregation($rule_activations); $intersection_points = self::calculate_intersection_points($aggregated_output); $lower_bound = 0; $upper_bound = $intersection_points['t1']; $function = function($z) use ($aggregated_output) { $max_activation_rendah = $aggregated_output['max_activations']['rendah']; return round_float($max_activation_rendah * $z); }; // return $function4; return integrateFunction($lower_bound, $upper_bound, $function); } public static function integrate2($rule_activations){ // Menambahkan fungsi round_float di sini function round_float2($value) { return number_format((float)$value, 2, '.', ''); } function integrateFunction2($lower_bound2, $upper_bound2, $function2, $n = 1000) { $step = ($upper_bound2 - $lower_bound2) / $n; $sum = 0; for ($i = 0; $i <= $n; $i++) { $x = $lower_bound2 + $i * $step; $sum += $function2($x); if ($i !== 0 && $i !== $n) { $sum += $function2($x); } } $integral = $step * $sum / 2; // return $integral; return round_float2($integral); } $aggregated_output = self::aggregation($rule_activations); $intersection_points = self::calculate_intersection_points($aggregated_output); $lower_bound2 = $intersection_points['t1']; $upper_bound2 = $intersection_points['t2']; $function2 = function($z) { return round_float(($z - 10) / 10 * $z); }; // return $function4; return integrateFunction2($lower_bound2, $upper_bound2, $function2); } public static function integrate3($rule_activations){ // Menambahkan fungsi round_float di sini function round_float3($value) { return number_format((float)$value, 2, '.', ''); } function integrateFunction3($lower_bound3, $upper_bound3, $function3, $n = 1000) { $step = ($upper_bound3 - $lower_bound3) / $n; $sum = 0; for ($i = 0; $i <= $n; $i++) { $x = $lower_bound3 + $i * $step; $sum += $function3($x); if ($i !== 0 && $i !== $n) { $sum += $function3($x); } } $integral = $step * $sum / 2; // return $integral; return round_float3($integral); } $aggregated_output = self::aggregation($rule_activations); $intersection_points = self::calculate_intersection_points($aggregated_output); $lower_bound3 = $intersection_points['t2']; $upper_bound3 = 20; $function3 = function($z) use ($aggregated_output) { $max_activation_tinggi = $aggregated_output['max_activations']['tinggi']; return round_float3($max_activation_tinggi * $z); }; // return $function4; return integrateFunction3($lower_bound3, $upper_bound3, $function3); } public static function integrate4($rule_activations){ // Menambahkan fungsi round_float di sini function round_float4($value) { return number_format((float)$value, 2, '.', ''); } function integrateFunction4($lower_bound4, $upper_bound4, $function4, $n = 1000) { $step = ($upper_bound4 - $lower_bound4) / $n; $sum = 0; for ($i = 0; $i <= $n; $i++) { $x = $lower_bound4 + $i * $step; $sum += $function4($x); if ($i !== 0 && $i !== $n) { $sum += $function4($x); } } $integral = $step * $sum / 2; // return $integral; return round_float4($integral); } $aggregated_output = self::aggregation($rule_activations); $intersection_points = self::calculate_intersection_points($aggregated_output); $lower_bound4 = 0; $upper_bound4 = $intersection_points['t1']; $function4 = function($z) use ($aggregated_output) { $max_activation_rendah = $aggregated_output['max_activations']['rendah']; return round_float4($max_activation_rendah * 1); }; // return $function4; return integrateFunction4($lower_bound4, $upper_bound4, $function4); } public static function integrate5($rule_activations){ // Menambahkan fungsi round_float di sini function round_float5($value) { return number_format((float)$value, 2, '.', ''); } function integrateFunction5($lower_bound5, $upper_bound5, $function5, $n = 1000) { $step = ($upper_bound5 - $lower_bound5) / $n; $sum = 0; for ($i = 0; $i <= $n; $i++) { $x = $lower_bound5 + $i * $step; $sum += $function5($x); if ($i !== 0 && $i !== $n) { $sum += $function5($x); } } $integral = $step * $sum / 2; // return $integral; return round_float5($integral); } $aggregated_output = self::aggregation($rule_activations); $intersection_points = self::calculate_intersection_points($aggregated_output); // Menggunakan nilai t1 dan t2 untuk batas bawah dan atas $lower_bound5 = $intersection_points['t1']; $upper_bound5 = $intersection_points['t2']; // Mendefinisikan fungsi yang akan diintegrasikan $function5 = function($z) { return round_float5(($z - 10) / 10 * 1); // Sesuaikan fungsi sesuai dengan persamaan integral yang diberikan }; // return $function5; return integrateFunction5($lower_bound5, $upper_bound5, $function5); } public static function integrate6($rule_activations){ // Menambahkan fungsi round_float di sini function round_float6($value) { return number_format((float)$value, 2, '.', ''); } function integrateFunction6($lower_bound6, $upper_bound6, $function6, $n = 1000) { $step = ($upper_bound6 - $lower_bound6) / $n; $sum = 0; for ($i = 0; $i <= $n; $i++) { $x = $lower_bound6 + $i * $step; $sum += $function6($x); if ($i !== 0 && $i !== $n) { $sum += $function6($x); } } $integral = $step * $sum / 2; // return $integral; return round_float6($integral); } $aggregated_output = self::aggregation($rule_activations); $intersection_points = self::calculate_intersection_points($aggregated_output); $lower_bound6 = $intersection_points['t2']; $upper_bound6 = 20; $function6 = function($z) use ($aggregated_output) { $max_activation_tinggi = $aggregated_output['max_activations']['tinggi']; return round_float6($max_activation_tinggi * 1); }; // return $function6; return integrateFunction6($lower_bound6, $upper_bound6, $function6); } public static function display($lower_bound, $upper_bound, $function, $lower_bound2, $upper_bound2, $function2, $lower_bound3, $upper_bound3, $function3, $lower_bound4, $upper_bound4, $function4, $lower_bound5, $upper_bound5, $function5, $lower_bound6, $upper_bound6, $function6, $rule_activations, $aggregated_output) { // Hitung integral untuk setiap bagian $integral_value = self::integrate($lower_bound, $upper_bound, $function, $rule_activations); $integral_value2 = self::integrate2($lower_bound2, $upper_bound2, $function2, $rule_activations); $integral_value3 = self::integrate3($lower_bound3, $upper_bound3, $function3, $rule_activations); $integral_value4 = self::integrate4($lower_bound4, $upper_bound4, $function4, $rule_activations); $integral_value5 = self::integrate5($lower_bound5, $upper_bound5, $function5, $rule_activations); $integral_value6 = self::integrate6($lower_bound6, $upper_bound6, $function6, $rule_activations); // Terapkan pembulatan dua angka di belakang koma pada semua nilai integral $integral_value = round_float($integral_value); $integral_value2 = round_float($integral_value2); $integral_value3 = round_float($integral_value3); $integral_value4 = round_float($integral_value4); $integral_value5 = round_float($integral_value5); $integral_value6 = round_float($integral_value6); // Hitung total M dan total A $total_M = $integral_value + $integral_value2 + $integral_value3; $total_A = $integral_value4 + $integral_value5 + $integral_value6; // Hitung hasil akhir $result = $total_M / $total_A; // Terapkan pembulatan dua angka di belakang koma pada hasil akhir $result = round_float($result); return [ 'total_M' => $total_M, 'total_A' => $total_A, 'result' => $result ]; } }