我有一个类,其中存储了三个任意float
值。让我们将它们称为A、B和C。类有一个方法,它将在-1到+1的范围内接受一个输入浮点,然后根据输入返回一个值。
用值调用方法-1将得到A的值,用0调用它将导致B,用1调用它将导致C。现在的问题是,如何在两者之间插值输出?
我在想一条假想曲线/样条,它基于定义为-1xA0xB和1xC的三个点。通过一个可以绘制这条曲线的函数,可以为范围内的任何浮点数提供输出。
注:
通常,我会在这里发布一些代码来说明我到目前为止的情况,但是由于我真的不知道如何解决这个问题,所以我认为只发布一个空函数定义没有任何意义。
PS:
如果有人好奇为什么,我用控制器的输入来定义关节的角度,所以输出值永远不会超出-180到+180的范围。
发布于 2014-07-18 13:45:08
最简单的答案是一个分段线性函数,就像在other answer中一样。
然而,一条评论说“任何一种光滑的曲线都不会导致尖顶或狭窄的凹坑”。
第二个最简单的答案是使用唯一的抛物线,它通过3点(二次插值),但这违反了所有值必须在min(A,B,C)
和max(A,B,C)
之间的要求。
因此,我们被困在第三个最简单的答案:使用分段二次函数,0导数在0:
f(x) = B + (C-B) * x^2 when x is in [0,1]
B + (A-B) * x^2 when x is in [-1,0]
发布于 2014-07-18 13:37:44
让我们用三点(-1,A),(0,B),(1,C)定义一个分段线性函数。
f(x) = (B-A)(x+1)+A if x in [-1, 0)
= (C-B)x+B if x in [0, 1]
(如果有人认识TeX,想让它变得漂亮).
对于光滑函数,有一些非常奇特的插值方法,使f(x)在x= B处可微,但我的数值分析类已经有一段时间了。
发布于 2014-07-18 14:00:50
分段线性插值只考虑约束条件,但仅为C0连续插值。
您可以通过分段抛物线插值( C1 )来实现y = A x(x-1)/2 + B (x+1)(1-x) + C x(x+1)/2
的连续性,但是必须确保这两个部分是单调的(除了端点之外,没有最大值)。
首先,尝试抛物线插值。导数是线性的(y' = A (2x-1)/2 + B 2x + C (2x+1)/2)
)。如果导数的符号在-1和+1是相同的,你就完成了。否则,使用3. @sds的解决方案。
https://stackoverflow.com/questions/24834050
复制相似问题