让我提供符合要求的最通用的解决方案:这将为您提供最大的选择和优化灵活性。
我们可以将“ S形”解释为单调递增曲线(因为变换应该是一对一的),它由一个向上凹的部分和另一个向下凹的部分组成。我们可能集中在使左半部分凹入向下,因为另一种类型(左半部分凹入向上)是通过反转这样的变换获得的。
由于变换被认为是可微的,因此它必须具有递减的导数f ′FF′的左半部分,而右半部分递增的导数。无论如何,导数必须是非负的,并且只能在孤立点为零(如果有的话:导数的最小值给出变换的最小斜率)。
它不要求导数微分的,但作为一个实际问题我们可以假设,这是几乎处处与衍生。 F' '
这个二阶导数几乎可以做任何事情:我们所需要的就是
此类函数(及其反函数)对所有解的集合进行参数化。F' ' (有一些冗余:下面描述的最后一个标准化步骤可以解决这个问题。)
微积分的基本定理使我们能够从任何这样的规范中恢复。那是,F
F′(x )= ∫X0F' '(吨) dŤ
和
F(x )= ∫X0F′(吨) dŤ 。
的条件保证˚F从其minimim单调上升˚F (0 )至某个最大˚F (1 )= C ^。最后,通过将前一个积分的值除以C来标准化f。F' 'FF(0 )F(1 )= CFC
这是从二阶导数的随机游走版本开始的说明。其中,导数尚未归一化,但变换已归一。F
F' '[ 0 ,k )(k ,1 ]R
F′F' 'F′F
FF' 'F' '
F(x )= xF' '(x )= 0F′F1个0F′F(x )= 1 − x
n <- 51 # Number of interpolation points
k.1 <- floor(n * 2/3) # Width of the left-hand interval
k.2 <- n - k.1 # ............ right-hand interval
x <- seq(0, 1, length.out=n) # x coordinates
set.seed(17)
# Generate random values of the second derivative that are first negative,
# then positive. Modify to suit.
y.2 <- (c(runif(k.1, -1, 0), 0.5*runif(k.2, 0, 1))) * abs(cos(3*pi * x)) +
c(rep(-.1, k.1), rep(.5,k.2))
# Recover the first derivative and then the transformation. Control the
# minimum slope of the transformation.
y.1 <- cumsum(y.2)
y.1 <- y.1 - min(y.1) + 0.005 * diff(range(y.1))
y <- cumsum(y.1)
y <- (y - y[1]) / (y[n] - y[1]) # Normalize the transformation
#
# Plot the graphs.
par(mfrow=c(1,3))
plot(x, y.2, type="l", bty="n", main="Second derivative")
points(x, y.2, pch=20, cex=0.5)
abline(h=0, col="Red", lty=3)
plot(x, y.1, type="l", bty="n", lwd=2, main="First derivative")
abline(h=0, col="Red", lty=3)
plot(x, y, type="l", lwd=2, main="Transformation")