620 lines
25 KiB
PHP
620 lines
25 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
class FuzzyLogicService
|
|
{
|
|
|
|
// Definisi fungsi round_float di dalam kelas FuzzyLogicService
|
|
public static function round_float($value) {
|
|
return number_format((float)$value, 2, '.', '');
|
|
}
|
|
|
|
public static function fuzzifikasi_usia_tanaman($usia_tanaman) {
|
|
// Fuzzifikasi for Usia Tanaman
|
|
// Derajat keanggotaan linier turun untuk kategori 'muda'
|
|
$muda = max(0, min((70 - $usia_tanaman) / (70 - 45), 1));
|
|
$muda = self::round_float($muda);
|
|
|
|
// Derajat keanggotaan segitiga untuk kategori 'dewasa'
|
|
$dewasa = max(0, min(($usia_tanaman - 45) / (70 - 45), (110 - $usia_tanaman) / (110 - 70)));
|
|
$dewasa = self::round_float($dewasa);
|
|
|
|
// Derajat keanggotaan linier naik untuk kategori 'tua'
|
|
$tua = max(0, min(($usia_tanaman - 70) / (110 - 70), 1));
|
|
$tua = self::round_float($tua);
|
|
|
|
return array('muda' => $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
|
|
];
|
|
}
|
|
} |