Формула для кривой (алгебра в JavaScript) - PullRequest
0 голосов
/ 07 декабря 2009

Мне нужно экспоненциальное уравнение со следующими параметрами:

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

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

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

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

Я думаю, что я ищу:
Когда x = 0, y = 53.
Когда х = 500, у = 153.

Ответы [ 4 ]

2 голосов
/ 07 декабря 2009

изменить (после обновления):

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

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

y = 154 - 10100 / (20 * x + 100) @ Wolfram Alpha
Участок 154 - 10100 / (20 * х + 100) от х = 0 до х = 500 @ Wolfram Alpha

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

y = 158 - 2625 / (x + 25) @ Wolfram Alpha
Участок 158 - 2625 / (х + 25) от х = 0 до х = 500 @ Wolfram Alpha

Для сравнения приведен сюжет вашей версии.

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


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

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

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

A * X ^ N + B = Y

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

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

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

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

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, и это дает нам A = -0,0004.

-0.0004 * X ^ 2 + 153 = Y

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

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

1 голос
/ 07 декабря 2009

Вы должны быть более конкретным, но у = 154-х ^ 0,742625 должен добиться цели. Здесь десятичным числом является log (101) / log (500).

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

0 голосов
/ 07 декабря 2009

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

0 голосов
/ 07 декабря 2009

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

...