Алгоритм интерполяции ограниченного экспоненциального роста - PullRequest
0 голосов
/ 05 декабря 2018

Мне нужно реализовать ограниченную экспоненциальную интерполяцию роста.Я нашел для формулы для этого в Википедии:

B(t)=S-(S-B(0))*e^(-k*t)

Я должен точки, отмечающие начало и конец кривой, которую я хочу создать: enter image description here

Мне нужны только значения кривой в целых числовых интервалах, например, 0,1,2,3, КОНЕЦ. Поэтому, с моей точки зрения, мне нужно решить вышеприведенное уравнение для k, поскольку у меня есть все остальное.

Проблема в том, что уравнение

B(END_X)=END_Y-(END_Y-START_Y)*e^(-k*END_X)

не имеет решения, так как оно только приближает желаемое значение END_Y и никогда не достигает его.

Мой вопрос, как бы яРеализовать наиболее эффективное вычисление k, не перепрыгивая через множество обручей, например, увеличивая END_Y чуть выше фактически желаемой конечной точки?(Язык C ++)

РЕДАКТИРОВАТЬ: //

END_Y-(END_Y-START_Y)*e^(-k*END_X)=END_Y+sgn(END_Y-START_Y)*G

Где G - параметр близости.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Экспоненциальный рост соответствует функциям, меняющимся экспоненциально.В этих ситуациях обычно выполняется линейная интерполяция в лог-области или что-то эквивалентное в линейной области.

Давайте назовем (x 0 , y 0 ) и (x 1 , y 1 ) первый и последний баллы.Интерполяция состоит в вычислении аппроксимации y i для каждого входа x i :

Линейная интерполяция в домене журнала:

Что приводит к линейной области:

Последний показатель степени соответствует простой переменной t , изменяющейся от 0 до 1 линейным образом.Это означает, что этот расчет может быть выполнен итеративно, требуется только один вызов pow()

0 голосов
/ 05 декабря 2018

Для экспоненциального затухания интерполяции

 y = A*exp(-k*x)  (1)

того, что показано на вашей картинке, вам нужно знать как минимум две точки (x0, y0), (x1, y1) .В этом случае у вас есть

y0 = A*exp(-k*x0)
y1 = A*exp(-k*x1)

y0/y1 = exp(-k*x0)/exp(-k*x1) = exp(-k(x0-x1))

k = log(y0/y1)/(x1-x0). 

Сначала найдите k , а затем найдите A

 A = y0 / exp(-k*x0)

После получения k и A вы можете найти y (x) во внутренней точке

(x0<x<x1)

По формуле (1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...