指数映射下原始值转归一化值的反向公式推导求助
首先得说,你遇到的这个问题其实挺典型的——你的正向映射里同时包含了指数项和线性项,这导致反向方程变成了超越方程,没办法用常规的对数、指数这类初等函数写出解析解,我给你一步步理清楚:
先明确正向映射公式
你给出的正向公式是:
$$y= p_{min}+\left(2^{(f\cdot x-f)}-2^{-f}\cdot(1-x)\right)\cdot p_{max} $$
先简化一下,把式子整理成更方便推导的形式:
移项后得到:
$$\frac{y - p_{min}}{p_{max}} = 2^{f(x-1)} - 2^{-f}(1 - x)$$
如果令 $z = 1 - x$(把x转换成1-x,方便看结构),代入后式子变成:
$$\frac{y - p_{min}}{p_{max}} = 2^{-fz} - 2^{-f}z$$
再令 $k = 2^{-f}$,就得到:
$$k^z - kz = C \quad \text{其中 } C = \frac{y - p_{min}}{p_{max}}$$
为什么你的反向公式不对?
你之前推导时错误地忽略了式子中的线性项 $(1-x)$,把它当成纯指数映射来反向推导,所以得到的结果不符合实际。更关键的是,上面这个方程属于超越方程——同时包含指数函数和线性函数,这类方程无法用初等函数(对数、指数、三角函数等)写出z的解析表达式,自然也没法直接写出x的解析形式。
可行的解决方案:数值迭代法
不过不用担心,你的正向映射是严格单调递增的(对x求导就能验证:导数是 $p_{max}\left(f\ln2\cdot2^{f(x-1)} + 2^{-f}\right)$,所有项都是正数,y随x增大而单调递增),所以每个有效的y值都对应唯一的x值,我们可以用牛顿迭代法快速求出精确解,步骤如下:
定义需要求解的函数:
$$F(x) = p_{min} + \left(2^{f(x-1)} - 2^{-f}(1 - x)\right)p_{max} - y$$
我们的目标是找到x使得 $F(x)=0$。求F(x)的导数:
$$F'(x) = p_{max} \left( f\ln2 \cdot 2^{f(x-1)} + 2^{-f} \right)$$牛顿迭代公式:
$$x_{n+1} = x_n - \frac{F(x_n)}{F'(x_n)}$$迭代初始化:
选一个接近真实值的初始值即可,比如:
- 如果y接近 $p_{min}$,选 $x_0=0$;
- 如果y接近 $p_{min}+p_{max}$(x=1时的y值),选 $x_0=1$;
- 或者用线性映射的结果作为初始值:$x_0 = \frac{y - p_{min}}{p_{max}}$
一般迭代3-5次就能收敛到足够精确的结果了。
备注:内容来源于stack exchange,提问作者Roel

