У меня есть точки, и я хочу нарисовать гиперболическую функцию для этих точек наилучшим образом.
Теперь я хочу сделать проверку качества.Есть идеи?
Моя идея состояла в том, чтобы проверить, где находится точка против функции.(Например, если точка находится над / под или над функцией)
Функция предписания: fn (x) = A1 + (A2 / A3 * (x + A4))
Моя первая идеядля этого было:
function checkQuality($points,$m,$k,$A1,$A4){
$over = 0;
$under= 0;
$on = 0;
$radius = 3;
foreach ($points as $point){
$status = ($A1+($m/($k*($point['x']+$A4)))-$point['y']);
if($status < $radius && $status > -$radius){
$status = 0;
}
if($status > 0){
$over++;
}else if($status <1 && $status >= 0){
$on++;
}else if($status < 0){
$under++;
}
}
if($under < $over){
$percentChange = ($under !== 0 ? ($under / $over) : 0) * 100;
}else{
$percentChange = ($over !== 0 ? ($over / $under) : 0) * 100;
}
return ['on'=>$on,'over'=>$over,'under'=>$under,'percent'=>$percentChange];
}
Но результат не так точен.
Здесь я публикую, как это выглядит.Зеленая кривая установлена вручную, и генерируется синяя (где я использую проверку качества, чтобы проверить, насколько хорошо, а если плохо, попробуйте создать лучшую кривую) -> Зеленая кривая лучше, чем синяя
(значения на входах указаны для зеленой кривой)
вот код, где я использую проверку качествавообразите, почему я хочу иметь максимально точную проверку:
for($i = 0; $i < 10000 ; $i++){
$new_m += 0.2;
$actual = $this->checkQuality($points['points'],$new_m,$ob['k'],0,0);
if($actual['percent'] > $prev['percent']){
$prev['percent'] = $actual['percent'];
$prev['m'] = $new_m;
$newQuality = $actual;
}else if($i>0 && $actual['percent'] < $prev['percent']){
break;
}
}