Вы пытаетесь реализовать эту математическую функцию:
F(x, y) = (W1 * |x| + W2 * |y|) / (|x| + |y|)
Эта функция прерывиста в точке x = 0, y = 0
.К сожалению, как отметил Р. в комментарии, разрыв не является устраняемым - там нет никакого разумного значения для использования в этой точке.
Это потому, что «разумное значение» изменяется в зависимости отпуть, по которому вы доберетесь до x = 0, y = 0
.Например, рассмотрите возможность следования по пути F(0, r)
от r = R1
до r = 0
(это эквивалентно установке ручки X в ноль и плавной настройке ручки Y с R1 до 0).Значение F(x, y)
будет постоянным на W2
до тех пор, пока вы не доберетесь до разрыва.
Теперь рассмотрите возможность следования F(r, 0)
(удерживая регулятор Y в нуле и плавно регулируя регулятор X до нуля) -выходной сигнал будет постоянным на уровне W1
до тех пор, пока вы не доберетесь до разрыва.
Теперь рассмотрите возможность следования F(r, r)
(удерживая обе ручки на одном и том же значении и одновременно устанавливая их в ноль).Выход здесь будет постоянным на W1 + W2 / 2
, пока вы не перейдете к разрыву.
Это означает, что любое значение между W1
и W2
в равной степени действует как выход на x = 0, y = 0
.Нет разумного способа выбирать между ними.(И, кроме того, всегда выбирая 0, так как выходной сигнал совершенно неправильный - в противном случае выходной сигнал ограничен интервалом W1..W2
(т. Е. Для любого пути, по которому вы приближаетесь к разрыву, предел F()
всегда находится в этом интервале), а 0 может даже не лежать в этом интервале!)
Вы можете «исправить» проблему, слегка изменив функцию - добавив константу (например, 1.0
) к v1
иv2
после fabs()
.Это сделает так, чтобы минимальный вклад каждой ручки не мог быть нулевым - просто «близко к нулю» (константа определяет, насколько близко).
Может быть заманчиво определить эту константу как «оченьsmall number ", но это просто приведет к резкому изменению выходного сигнала, поскольку регуляторами манипулируют близко к их нулевым точкам, что, вероятно, нежелательно.