【问题标题】:What simple math function f(x) has these properties?什么简单的数学函数 f(x) 具有这些属性?
【发布时间】:2009-03-04 17:15:45
【问题描述】:

我有一个小数学问题。我想要一个具有这些属性的函数:

  1. 对于远大于 0 的 x:lim f(x) = x
  2. 对于远小于 0 的 x:lim f(x) = 0
  3. 和 f(0) = 1 (抱歉,我这里的 f(1)=1 是错误的!)
  4. f(x) 应该是monotonically increasing

所以函数应该看起来像这样:

        ^
        |   /
        |  /
        | /
   ___.-+´
--´-----+------>
        |

到目前为止我得到的最好的是x/(1 + e^(-x)),但后来我意识到它下降到 0 以下并且不是单调递增的。

GraphFunc Online 对玩转这些功能很有帮助。

此外,如果该函数计算速度很快,那将很有帮助,因为我需要经常执行它。

编辑:我在程序中使用它来限制值。我有一个优化算法,它使用带有Levenberg-Marquardt 算法的曲线拟合。但该算法不允许约束,并在整个实数值范围内进行优化。所以我需要一个这样的函数,这样我就可以添加一个人为的约束,使函数大于 0。一个简单的方法是使用f(x) = x²,但函数不是单调递增的,它有两个最小值。

Levenberg-Marquardt 逼近导数,所以我认为最好还是平滑函数。但我不确定这是否绝对必要。

【问题讨论】:

  • 我看不出这与编程有什么关系。
  • 在这一点上,我希望看到的不仅仅是语言标签。解释您为什么要以编程方式或类似方式执行此操作。
  • 我可以很容易地看到这是如何与编程相关的,但也许 OP 可以添加一些上下文来满足其他人。
  • 您是否也在寻找它是平滑的,即导数中没有不连续性?
  • 通过编辑,我可以接受它与编程相关的内容。不幸的是,无法删除接近投票。如果它确实关闭,我会观察并投票重新开放。

标签: math function


【解决方案1】:

这是满足您要求的smooth function

f(x) = (x + sqrt(x^2 + 4)) / 2

对于 x = 0,您可以看到 f(x) = 1。对于非常大的正 x,sqrt(x^2 + 4) 近似为 x,因此 f(x) ≈ x。对于非常大的负 x,sqrt(x^2 + 4) 近似为 -x,因此 f(x) ≈ 0。

一阶导数是

f'(x) = 1/2 + 1/2*x/sqrt(x^2 + 4)

对于 x > 0,x/sqrt(x^2 + 4) > 0,所以 f'(x) > 0。对于 x

0 < x^2/(x^2 + 4) < 1
0 < |x|/sqrt(x^2 + 4) < 1
-1 < x/sqrt(x^2 + 4) < 0
-1/2 < 1/2*x/sqrt(x^2 + 4) < 0
1/2 + 1/2*x/sqrt(x^2 + 4) > 0

因此,对于所有 x,f'(x) > 0,因此 f(x) 根据需要单调递增。

【讨论】:

  • 非常感谢,我也用这个。我希望我能接受两个答案:)
【解决方案2】:

除了 0 处的不连续性,x/(1 - e^(-x)) 有效。所以将 f(0) 定义为 1,然后你就设置好了。

#define E 2.71828183
double SimpleFunc(double x)
{
   if (x == 0)
      return 1;
   return x / (1 - pow(E, (-x)));
}

可能更快:

double SimpleFunc2(double x)
{
   if (x < 0)
     return 1/(1 - x);
   return x+1;
}

两者在一阶导数中都是连续的,但第二个在二阶导数中有一个跳跃)

如果你真的不想做分段函数,试试这个:(x^2+.1)^.5 / ((1 - e^(-x))^2+.1)^.5

【讨论】:

  • 不错!稍快一点当然是 x/(1 - e^(-x)),因为没有负数。
  • .. 在您的“可能更快”变体中,在 x>0 上返回 x+1 以减少不连续性。
  • 是的,我也打算建议 x/(1 - e^(-x)),但 Iraimbilanja 打败了我。 :)
  • 你的“稍微快一点”的版本不是单调递增的; -26
  • 另外,您的较慢版本没有给出 f(1) = 1,而是给出 f(1) = -1/(1/e-1)
【解决方案3】:

f(x) = abs( x/2 ) + x/2

其中 abs(x) 是 x 的绝对值

这个简单的函数显然计算速度很快,并且满足所有四个条件。

【讨论】:

  • 他要求 f(1) 为 1,而不是 f(0)(尽管他的图表没有比例,在这里可能会产生误导)。
  • 它错过了 #4:f(-10) = 10 > 0 = f(0)
【解决方案4】:

只是给你一些想法,这是一个没有约束 f(1)=1 并且不是单调递增的解决方案。

基本上,您希望在两个函数之间进行混合:x 0 时 f2(x) = x。您希望平滑混合。在 -inf 和 +inf 处具有恒定限制的简单阶梯函数是 atan(限制分别为 -pi/2 和 +pi/2)。

因此,将 atan blend 函数与 f1 和 f2 结合,您会得到:

混合(x) = atan(x)/pi + 0.5 f(x) = (1 - blend(x)) * f1(x) + blend(x) * f2(x)

这给出了:

f(x) = (atan(x)/pi + 0.5) * x

您可能还可以使用其他混合函数来代替 atan。另请注意,与较小的负值相比,f(x) 将为负数。

如果您希望曲线通过 (1,1),则可以使用 atan(0)=0 的事实。

【讨论】:

  • 卫生署!你比我快40秒! :)
  • 其实,如果函数有lim f(x)=x,并且f(x)=x at x=1,那么函数就得分段了。
【解决方案5】:

我不知道你到底在用它做什么;分段函数有什么问题?如果你要经常执行它,这样的事情会比做指数更快:

f(x) = -1/x, x < -1
f(x) = 1, -1 <= x <= 1
f(x) = x, x > 1

编辑:修复它,让它真正起作用。

【讨论】:

  • 在 x=0 时未定义,在 x 时为负
  • 此外,对于大多数用途,您通常希望从一个平滑过渡到另一个。
  • 对于低于 1 的值,使用 -1/(x-1)。
  • 但这是一个要求吗?这个问题确实有很多无法解释的地方。至少修改后的版本是连续的!
  • 1/x 不是单调递增的
【解决方案6】:

1/2 * (x + ABS(x))

它是单调的。

f(1) = 1.

当x小于零时,f(x) = 0,否则等于x。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多