Математический вопрос относительно функций в форме (1) / (b ^ c) - PullRequest
1 голос
/ 19 января 2010

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

Я использую функцию, рассматривая 'c' как изменяющееся значение, то есть значение интерполяции между 0 и 1, в то время как b изменяется для 'резкости'. Я использую его для определения значения интерполяции между 0 и 1, поэтому, как правило, функция, которую я использую, такова:

float interpolationvalue = 1 - 1/pow(100,c);
linearinterpolate( val1, val2, interpolationvalue);

До этого момента я использовал взломанный подход, чтобы заставить его «работать», поскольку при значении интерполяции = 1 значение очень близко, но не совсем равно 0.

Так что мне было интересно, есть ли функция в форме или такая, которая может воспроизводить кривые, подобные тем, которые получаются в 1 / b c , где при c = 0 результат = 1 и c = 1 результат = 0.

Или даже C = 0, результат = 0 и C = 1 результат = 1.

Спасибо за любую помощь!

Ответы [ 4 ]

2 голосов
/ 19 января 2010

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

1 голос
/ 19 января 2010

Вы можете использовать аналогичную кривую в форме A - 1 / b^(c + a), выбирая значения A и a в соответствии с вашими ограничениями.Так, для c = 0, result = 1:

1 = A - 1/b^a   =>   A = 1 + 1/b^a

и для c = 1, result = 0:

0 = A - 1/b^(1+a)  =>  A = 1/b^(1+a)

Комбинируя их, мы можем найти a в терминах b:

1 + 1/b^a = 1/b^(1+a)
b^(1+a) + b = 1
b * (b^a - 1) = 1
b^a = 1/b - 1

Итак:

a = log_b(1/b - 1) = log(1/b - 1) / log(b)
A = 1 + 1/b^a = 1 / (1-b)
1 голос
/ 19 января 2010

1 - c ^ b с небольшими значениями для b? Другой вариант - использовать кубический полином и указать наклон в 0 и 1.

0 голосов
/ 19 января 2010

В вещественных числах, которые используют математики, ни одна из функций указанной вами формы никогда не вернет 0, деление не может этого сделать. (1 / x) == 0 не имеет реальных решений. В арифметике с плавающей запятой, плохой связи реальной арифметики, которую используют компьютеры, вы можете написать 1 / (MAX_FP_VALUE ^ 1), которая даст вам настолько близкое к 0, сколько вы когда-либо собираетесь получить (на самом деле, это может дать вам NaN или одно из других странных возвращений, которое допускает IEEE 754).

И, как я уверен, вы заметили, 1 / (b ^ 0) всегда возвращает 1, поскольку b ^ 0, по определению 0-й степени, всегда равен 1.

Таким образом, ни одна функция с c = 0 не выдаст результат 0.

Для c = 1, результат = 1, установить b = 1

Но я думаю, что это только частичный ответ, я не совсем уверен, что понимаю, что вы пытаетесь сделать.

Привет

Mark

...