2014-02-17 4 views
0

У меня есть «scaledValue», и я хотел бы найти «Value»,Можно ли инвертировать эту функцию?

но, похоже, это невозможно? (Аналогично значение принято)

var priceBound = [0, 10000000]; 
var priceCurves = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.2, 1.4, 1.6, 1.8, 5, 35, 70, 100]; 

function calcScaledPrice(Value) { 
    var currentValue = Value; 
    var currentFixed = Value - priceBound[0]; 

    var fixedBound = priceBound[1] - priceBound[0]; 

    var currentPercent = Math.round((currentFixed/fixedBound) * 20); 
    var currentScale = priceCurves[currentPercent]; 
    var scaledValue = Math.round(currentValue * (currentScale/100)); 

    return scaledValue; 
} 
+0

Хотите ли вы, чтобы это работало как уравнение? или будет достаточно console.log (Value)? –

+0

Это обратимо, если это биекция: если она взаимно однозначная и на. –

+0

Если 'scaledValue = currentValue * currentScale/100', то решить для * currentValue *:' currentValue = scaledValue * 100/currentScale'. – RobG

ответ

0

Там нет единого входного значения, которое генерирует конкретную выходную величину, так что невозможно обеспечить окончательный ответ. Однако возможно генерировать значение, что приведет к определенному масштабированному значению, просто чтобы оно не было уникальным. например

calcScaledPrice(150)); // 2 
calcScaledPrice(200)); // 2 

Следующая генерирует ряд значений кандидата, а затем возвращает первое, которое создает подходящее масштабируемое значение. Не особенно элегантный, но он выполняет эту работу (только слегка проверенный, поэтому используйте с осторожностью). Существуют и другие итеративные подходы, например. используя своего рода алгоритм бинарного поиска, чтобы найти подходящее значение.

function calcValue(scaledValue) { 
    var fixedBound = priceBound[1] - priceBound[0]; 
    var possibleCurrentValues = []; 
    var currentFixed, currentScale, value; 

    // Generate a matrix of possible values 
    for (var i=0, iLen=priceCurves.length; i<iLen; i++) { 
     possibleCurrentValues.push(Math.round(scaledValue * 100/priceCurves[i])); 
    } 

    // Return the first possibleCurrentValue that generates 
    // a suitable scaled value 
    for (var j=0, jLen=possibleCurrentValues.length; j<jLen; j++) { 
     value = possibleCurrentValues[j] 
/* 
     // Do the calculation of calcScaledPrice 
     currentFixed = value - priceBound[0];  
     currentPercent = Math.round((currentFixed/fixedBound) * 20); 
     currentScale = priceCurves[currentPercent]; 

     if (Math.round(value * currentScale/100) == scaledValue) { 
      return value; 
     } 
*/ 
     // Simpler, depends on calcScaledPrice function 
     if (calcScaledPrice(value) == scaledValue) { 
      return value; 
     } 
    } 
    return "not found"; 
} 

calcValue(2) // 200 
calcValue(50) // 5000 
0

Ваша программа включает цену от значения в диапазоне [0..10000000] до целого числа в диапазоне [0..20], с использованием линейного правила и округления. Затем (монотонно растущая) таблица поиска возвращает процент, который применяется к исходному значению.

Таким образом, вы получаете кусочно-линейную функцию, которая прерывиста, когда проценты меняются. Например, значения 6249999 и 6250000 будут отображаться в процентах 0,01 и 0,012 с выходами 62499,99 и 75000. Нет scaledValue между 62499,99 и 75000 соответствует любым Value.

0

Ваша функция не является биекцией, потому что вы сопоставляете многие значения в домене с тем же значением из-за Math.round(). На этом этапе вы можете получить диапазон значений для заданного масштабированного значения.

Смежные вопросы