编写一个函数来平滑指定范围内的中心值
Writing a function for smoothing center values in specified range
我不确定这是问这类问题的正确地点(也许 mathematica 会更好?)。
我正在编写一个从模拟操纵杆读取输入值的程序。
取值范围为 -100 到 100,中间值为 0。
我的问题是,中心区域的粘性值不是很精确。例如,松开摇杆后,我应该得到一个等于 0 的输入值,但我经常得到 2、7、-5 等值(几乎从不超过 10 或 -10)。
我想做的是应用 "smoothing" 函数来减少 0 区域周围的值。
我没有数学经验,到目前为止我能找到的最好的函数是:
function smooth(x) {
return Math.pow(x,3)/10000;
}
这给了我这种 values:
如你所见,这个函数太"aggressive" 因为即使是 f(20) ~= 0 !
知道我可以使用哪个更好的功能吗?
您可以检查绝对值是否小于或等于 10 并且 return 零而不是值。
function smooth(x) {
return Math.abs(x) <= 10 ? 0 : x;
}
我最终将我的第一个解决方案与 Nina 提供的解决方案混合在一起。
var deadzone = 15;
function smooth(x) {
return Math.abs(x) <= deadzone ? Math.pow(x,3)/Math.pow(deadzone,2) : x;
}
参见this图表
我不确定这是问这类问题的正确地点(也许 mathematica 会更好?)。
我正在编写一个从模拟操纵杆读取输入值的程序。
取值范围为 -100 到 100,中间值为 0。
我的问题是,中心区域的粘性值不是很精确。例如,松开摇杆后,我应该得到一个等于 0 的输入值,但我经常得到 2、7、-5 等值(几乎从不超过 10 或 -10)。
我想做的是应用 "smoothing" 函数来减少 0 区域周围的值。
我没有数学经验,到目前为止我能找到的最好的函数是:
function smooth(x) {
return Math.pow(x,3)/10000;
}
这给了我这种 values:
如你所见,这个函数太"aggressive" 因为即使是 f(20) ~= 0 !
知道我可以使用哪个更好的功能吗?
您可以检查绝对值是否小于或等于 10 并且 return 零而不是值。
function smooth(x) {
return Math.abs(x) <= 10 ? 0 : x;
}
我最终将我的第一个解决方案与 Nina 提供的解决方案混合在一起。
var deadzone = 15;
function smooth(x) {
return Math.abs(x) <= deadzone ? Math.pow(x,3)/Math.pow(deadzone,2) : x;
}
参见this图表