5

你能给我一个算法的例子吗? 替代文字 http://ryancalderoni.com/archive/ideal_curve.jpg

编辑:然后我将如何使用 Javascript 计算数学?有人可以添加吗?很抱歉最初没有包含该上下文..

注意:我使用“flot”来绘制它,flot 的输入是一个像这样的 javascript 数组:

[[x,y],[x,y],[x,y]...]

因此,给定改变曲线的值,我将所有点输出到带有循环的数组中,然后将其吐出以浮动到图形。

4

7 回答 7

4

典型的 sigmoid 曲线是 tanh(x) 曲线。

根据定义,

  tanh(x) = sinh(x) / cosh(x) =
          = [(1/2) (e^x - e^-x)] / [(1/2) (e^x + e^-x)] =
          = (e^x - e^-x) / (e^x + e^-x) = 
          = (e^(2x) - 1) / (e^(2x) + 1)


(高分辨率)

请注意,对称线相对于您的示例图片发生了偏移。要使 tanh 图看起来更像您的示例,只需将其向上和向右移动:

y = 1 + (e^(2x - 6) - 1) / (e^(2x - 6) + 1)


(高分辨率)

在 JavaScript 中,你最有效地实现这个表达式

exp2x = Math.exp(2*x)
y = (exp2x - 1) / (exp2x + 1)

更新(再次)

好的,如果您希望 y 的范围从 0 到 100,x 的范围从 0 到 100,那么您可能想尝试

y = 50 + 50*tanh((x−50)/10)

看起来像


(高分辨率)

现在

y = 50 + 50 * tanh((x−50)/10)
  = 50 + 50 * (e^((x−50)/5) - 1) / (e^((x−50)/5) + 1)

错误函数 erf 看起来非常相似,但计算起来要困难得多(除非 JavaScript 有内置的 erf 函数)。


Ryan (OP) 补充说:已实施!

var y = 50 + 50 * tanh((n-50)/10);

function tanh (arg) {
    return (Math.exp(arg) - Math.exp(-arg)) / (Math.exp(arg) + Math.exp(-arg));
}
于 2010-08-13T19:21:18.297 回答
3

如果你想要一个单一的解析函数,那么 ArcTangent 和 Hyperbolic Tangent 都具有这种形状,你只需将它移动一点。如果您希望它仅从原点开始并且是平坦的,请查看 Exp[-1/x^n],对于 n>=1。这会产生一条在原点处非常平坦的曲线。

于 2010-08-13T18:56:45.957 回答
2

尝试查找sigmoid函数,它看起来很像。

替代文字
(来源:ulcar.uml.edu 的 iag

于 2010-08-13T19:02:09.690 回答
1

我可以建议:

  • 误差函数(erf(x)在 C 中)
  • 正态累积分布函数 ( 0.5 * erfc(-x/sqrt(2)))
  • 逻辑函数 ( 1.0 / (1.0 + exp(-x)))
  • 任何其他 sigmoid 函数
于 2010-08-13T19:03:41.943 回答
1

贝塞尔曲线? 绘制它的相应算法将是de Casteljau's algorithm

于 2010-08-13T18:53:26.530 回答
0

这一切都很棒,但还有另一个想法:

假设一个三阶多项式:

替代文字
(来源:equationsheet.com

您有四个边界条件:

替代文字 替代文字
(来源:equationsheet.com

替代文字 替代文字
(来源:equationsheet.com

如果您将这些代入等式并计算出代数,您将得到以下结果:

替代文字
(来源:equationsheet.com

在哪里

替代文字
(来源:equationsheet.com

替代文字
(来源:equationsheet.com

它可能不准确,但您可以根据您知道的值轻松地对其进行近似:(来源:equationsheet.com替代文字

于 2010-08-14T21:56:40.957 回答
0

您正在寻找的是所谓的 Sigmoid 函数。您可以在维基百科中查找它。用于此的一些函数是误差函数或逻辑函数。这些最常用于神经网络。

于 2010-08-13T19:18:32.247 回答