2009-12-07 5 views
0

мне нужно экспоненциальное уравнение со следующими параметрами:Формула для кривой (алгебра в JavaScript)

При х = 0, у = 153.
При х = 500, у = 53.
Y должен возрастают экспоненциально, когда X приближается к 0 и должен экспоненциально уменьшаться, когда X приближается к 500.

По какой-то причине я не помню, как это сделать. Я уверен, как только я увижу уравнение (или одно подобное), я смогу выяснить остальное.

Контекст в программировании: это функция Javascript, которая изменяет цвет div при достижении максимальной длины textarea. Другие варианты или фрагменты кода очень приветствуются.

UPDATE: Я не знаю, почему, но -1500/(х + 15) +153 дает мне что-то близкое к тому, что я ищу. Так что похоже, что я просил не то, чего я действительно хотел.

Я предполагаю, что я ищу это:
При х = 0, у = 53.
При х = 500, у = 153.

+2

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

+1

Может быть лучше на http://www.mathoverflow.net/ – Yacoby

+0

@ Donnie Спасибо, я удалил часть уравнения примера. –

ответ

2

редактировать (после обновления):

С вашими изменениями, вы просите функцию восходящей и что-то похожее на y = 1/x.

Шкала вашей функции может быть изменена в соответствии с вашими точными координатами, хотя кривая наклоняется намного круче в начале.

y = 154 - 10100/(20 * x + 100) @ Wolfram Alpha
Plot of 154 - 10100/(20 * x + 100) from x=0 to x=500 @ Wolfram Alpha

отмечая целочисленные решения, мы используем решение х = 96, у = 149, чтобы изменить формулу, масштабирование этих значений в ваш диапазон координат. Это даст нам что-то более близкое к вашей обновленной кривой, которая наклоняется немного мягче.

y = 158 - 2625/(x + 25) @ Wolfram Alpha
Plot of 158 - 2625/(x + 25) from x=0 to x=500 @ Wolfram Alpha

Вот сюжет вашей версии, для сравнения.

y = -1500/(x + 15) + 153 @ Wolfram Alpha


Оригинал ответа (до вашего обновления)

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

Во-первых, алгебраическая/полиномиальная функция.

A * X^N + B = Y 

Эта общая формула может быть решена в системе, чтобы дать вам полином порядка N, что соответствует кривой между двумя известными точками. В этом случае мы решаем для < X = 0, Y = 153 > - < X = 500, Y = 53 >.

Подставляя первую пару координат, легко получить Б.

A * (0)^N + B = (153) 
0 + B = (153) 
B = 153 

Теперь, подставляя вторую пару, мы можем найти А.

A * (500)^N + 153 = (53) 
A * (500)^N = -100 
A = -100/(500^N) 

Если вы хотите линейную шкалу, вы заменяете N = 1, что дает A = -0.20.

-0.20 * X + 153 = Y 

Если вы хотите квадратичный масштаб, то заменить N = 2, и что дает нам = -0.0004.

-0.0004 * X^2 + 153 = Y 

Вы можете также использовать некоторые не целое значение N, между 1 и 2 (попробуйте 1.5 или 1.6), который я думаю, вероятно, даст вам лучшие результаты. Также обратите внимание, что по мере увеличения этой функции она в конечном итоге опустится ниже нуля, но только после того, как кривая пройдет через вторую точку.

Вот экспоненциальная функция. Я использую e в качестве базы здесь, хотя вы можете изменить его на что-либо большее, чем 1. Чтобы соответствовать кривой между двумя точками, мы получим наилучшие результаты, если обе точки имеют значения Y над нолем. В противном случае нам нужно будет добавить смещение и определить, где мы хотим, чтобы базовая линия была. Для целей здесь мы предположим, что базовый уровень равен Y = 0. Это означает, что по мере увеличения X Y в конце концов достигнет, но фактически не достигнет 0, после того, как он пройдет через вторую точку.

A * e^(B * X) = Y 

Опять же, решите для первой координаты.

A * e^(B * 0) = 153 
A * e^(0) = 153 
A * 1 = 153 
A = 153 

Замените, чтобы получить B, со второй координатой.

153 * e^(B * 500) = 53 
e^(B * 500) = 53/153 
B * 500 = ln(53/153) 
B = ln(53/153)/500 

ln (val) - это естественный журнал, который является инверсным для e^val. Мой калькулятор говорит, что B примерно равен -0.0021202920156806272577911119053782, или, может быть, -0.0021 будет работать лучше всего. Если вы хотите разрешить это для других базиса экспоненты, используйте идентификаторы экспоненты/логарифма таким же образом, чтобы решить любую другую базу, а также изменить базу логарифма на ln() [log() в js] или log() [log()/Math.log10e в js].

+0

безупречный! обновленная функция, которую вы мне дали, отлично работает! Благодаря! –

0

Я не знаю, что кривая будет точно но он, вероятно, будет в семействе 1/(x^d) где d - ваш показатель степени. Посмотрите here, чтобы понять, как выглядит кривая. Это то, что вы хотите?

1

Вы должны быть более конкретными, но y = 154-x^0.742625 должен делать трюк. Здесь десятичное число - log (101)/log (500).

http://www.wolframalpha.com/input/?i=154-x ^% 28log% 28101% 29% 2Flog% 28599% 29% 29

0

В основном вы, вероятно, хотите решить logistic equation dy/dx = K y (ymax - y). Решение находится в предоставленной ссылке.

+0

На самом деле, после того, как вы предоставили свою причину, это, вероятно, перебор. Линейный градиент, вероятно, лучше для вашего приложения. – erikkallen