Biarkan saya menawarkan solusi paling umum yang konsisten dengan persyaratan: yang akan memberi Anda fleksibilitas paling banyak untuk memilih dan mengoptimalkan.
Kita dapat menafsirkan "berbentuk-S" sebagai kurva yang meningkat secara monoton (karena transformasi harus satu-ke-satu) yang terdiri dari satu bagian yang cekung ke atas dan bagian lain yang cekung ke bawah. Kita mungkin fokus untuk membuat setengah kiri cekung ke bawah, karena tipe lain (dengan setengah cekung atas) diperoleh melalui membalikkan transformasi tersebut.
Karena transformasi seharusnya dapat dibedakan, maka harus memiliki turunan penurunan di bagian kiri dan turunan yang meningkat di bagian kanan. Apapun, turunannya harus nonnegatif dan bisa nol hanya pada titik yang terisolasi (jika sama sekali: nilai minimum turunannya memberikan kemiringan transformasi yang paling rendah.)ff′
Tidak diperlukan bahwa turunannya dapat dibedakan, tetapi sebagai hal praktis kita dapat menduga bahwa turunannya dapat dibedakan hampir di mana-mana dengan turunan . f′′
Derivatif kedua ini dapat melakukan hampir semua hal : yang kita butuhkan hanyalah itu
itu dapat diintegrasikan,
kurang dari atau sama dengan nol untuk semua nilai dalam beberapa interval tangan kiri , dan[0,k)
lebih besar atau sama dengan nol untuk semua nilai dalam interval tangan kanan .(k,1]
Fungsi-fungsi seperti itu (dan inversnya) parameterisasi himpunan semua solusi. f′′ (Ada beberapa redundansi: dirawat dengan langkah normalisasi akhir yang dijelaskan di bawah ini.)
Teorema dasar kalkulus memungkinkan kita untuk memulihkan dari setiap spesifikasi tersebut. Itu adalah,f
f′(x)=∫x0f′′(t)dt
and
f(x)=∫x0f′(t)dt.
The conditions on f′′ guarantee that f rises monotonically from its minimim f(0) to some maximum f(1)=C. Finally, normalize f by dividing the values of the preceding integral by C.
Here is an illustration starting with a version of a random walk for the second derivative. In it, the derivatives have not been normalized, but the transformation f has been.
To apply this approach, you may begin with an analytic expression for f′′, perhaps varied by a finite number of parameters. You may also specify it by giving some points along its graph and interpolating among them--provided that the interpolator respects the negativity of the values on [0,k) and the positivity on (k,1]. The latter is the method used to generate the illustration. The corresponding R
code (below) provides the details of the calculation.
This approach enables you to design any transformation you like. You could begin by sketching the S-curve, estimating its (relative) slopes f′, and from that estimating its slopes. Specify some f′′ to match that latter picture, then proceed to compute f′ and then f.
Note that f that are first concave up and then concave down can also be obtained by negating f′′ at the outset. The critical condition for creating an S-shaped curve is that (apart from possible excursions on a set of measure zero) f′′ may actually cross zero at most once.
Incidentally, the solution f(x)=x arises by setting f′′(x)=0 almost everywhere, making f′ constant and positive, whence f is linear; normalization assures the slope is 1 and the intercept is 0. (Making f′ constant and negative produces the solution 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")