Функция инкрементного масштабирования

Если вы знаете, что «input1» находится строго между 0 и 1 или, как правило, «min» и «max» (где известно, что min и max находятся между, но не строго, между 0 и 1), как бы вы получили «input1» увеличивать или уменьшать числовой скачок, заданный «input2», с гарантией того, что новое значение находится строго между минимумом и максимумом и никогда не достигнет минимума или максимума?


person Kyle Dan War    schedule 11.06.2011    source источник
comment
Каковы ограничения на input2? Если input2 может быть больше max или меньше -1 * min, каково правило для обработки этого?   -  person SubmittedDenied    schedule 11.06.2011
comment
input2 › 1, ваша функция должна будет иметь дело с сохранением результата между min и max   -  person Kyle Dan War    schedule 11.06.2011
comment
Я все еще неясен. Если input1 = 0.7, max = 0.75 и input2 = 2.25, каким должен быть результат?   -  person SubmittedDenied    schedule 11.06.2011


Ответы (3)


Вам нужна функция распределения, желательно обратимая (обратная называется квантильная функция). Другими словами, вам нужна монотонная строго возрастающая непрерывная функция f с lim[x->-oo] f(x) = 0 и lim[x->oo] f(x) = 1.

Если у вас есть такая функция распределения f и обратная ей f⁻¹, то ваша корректирующая функция будет выглядеть примерно так:

g (x, Δ) = f( f⁻¹(x) + Δ )

Это для значений от 0 до 1, для других интервалов [a, b] нам нужно масштабировать его, используя функцию масштабирования s:

s(x) = (b-a)·x + a,     s⁻¹(y) = (y-a)/(b-a)

Тогда функция настройки получает

h(x, Δ) = s(g(s⁻¹(x), Δ) = s( f( f⁻¹(s⁻¹(x)) + Δ )).

Одной из таких функций распределения, которую легко вычислить на языке Java, будет

f(x) = 1 - 0.5 * exp(-x)   for 0 ≤ x
f(x) =     0.5 * exp( x)   for x ≤ 0

с квантильной функцией

f⁻¹(y) = - log(2 - 2y)  for   y ≤ 0.5
f⁻¹(y) =   log(2 y)     for 0.5 ≤ y

Построение из этого вашей функции настройки — это просто их объединение.

Конечно, это работает только в пределах вашей числовой точности — вы не можете приблизиться к 1.

person Paŭlo Ebermann    schedule 11.06.2011

Я считаю, что следующее должно держать input1 в пределах min/max

input1 = ((input1 - min + input2) % (max - min)) + min; 
person btreat    schedule 11.06.2011

Вы можете использовать min/max как

 public static int adjust(int n, int adjust, int min, int max) {
      return adjust0(n, adjust, min+1, max-1);
 }

 private static int adjust0(int n, int adjust, int trueMininum, int trueMaximum) {
      return Math.max(trueMininum, Math.min(trueMaximum, n + adjust));
 }

Это позволит вам настроить ваши значения и убедиться, что они будут между минимальным и максимальным, но не этими значениями.

person Peter Lawrey    schedule 11.06.2011
comment
Это, конечно, не никогда не достигает максимума или минимума. - person Paŭlo Ebermann; 11.06.2011
comment
Если он никогда не достигает максимума или минимума, то это не максимум и не минимум. Я обновлю пример. ;) - person Peter Lawrey; 11.06.2011