如何为未知解析形式的函数计算反函数近似值?
未知采样函数的反函数近似计算方法
首先要明确前提:只有当函数f在[0, 2*Math.PI]区间内严格单调时,才存在唯一的单值反函数,如果f非单调,只能拆分出多个单调子区间分别计算对应区间段的反函数。满足前提的情况下,完全可以通过采样值得到反函数的近似采样结果,具体方案如下:
前置预处理
- 先将你持有的所有采样点按自变量从小到大排序,得到有序的配对序列
(u_i, f_i),其中满足0 = u_0 < u_1 < u_2 < ... < u_N = 2*Math.PI,f_i = f(u_i) - 校验单调性:遍历所有相邻采样点,计算
f_{i+1} - f_i,如果所有差值符号一致(全正为严格递增,全负为严格递减),则区间内f严格单调,可直接计算全局反函数;如果差值有正有负,需要先将原区间拆分为多个单调子区间,后续对每个子区间单独处理。
反函数近似采样步骤
- 直接将有序配对序列的两个维度调换,得到
(f_i, u_i),这就是反函数f⁻¹的原始采样点,天然满足f⁻¹(f_i) = u_i的定义 - 如果你需要的反函数采样值对应的输入(也就是原函数的输出值)没有刚好落在
f_i的取值上,可以对(f_i, u_i)序列做插值得到近似值:- 采样密度足够高的场景下,优先选择线性插值,计算成本极低,精度也能满足大多数需求
- 对精度要求更高的场景,可以使用三次样条插值,注意插值前需要保证
f_i序列是严格有序的(原函数递增则f_i已升序,原函数递减则将(f_i, u_i)整体倒序即可)
注意事项
- 如果原函数存在平坦段(相邻
f_i的差值小于你设定的误差阈值),这段区间的反函数无唯一解,建议直接标注该段反函数的取值为对应u的区间,或直接剔除平坦段 - 反函数的近似精度完全依赖原函数的采样密度,原函数曲率大的区域建议尽量保证有足够多的采样点,避免插值误差过大
- 不建议对超出
[min(f_i), max(f_i)]范围的输入做反函数外插,外插误差没有可控保障
内容的提问来源于stack exchange,提问作者aSpagno
相关产品推荐
相关产品推荐

