你能给我一个算法的例子吗? 替代文字 http://ryancalderoni.com/archive/ideal_curve.jpg
编辑:然后我将如何使用 Javascript 计算数学?有人可以添加吗?很抱歉最初没有包含该上下文..
注意:我使用“flot”来绘制它,flot 的输入是一个像这样的 javascript 数组:
[[x,y],[x,y],[x,y]...]
因此,给定改变曲线的值,我将所有点输出到带有循环的数组中,然后将其吐出以浮动到图形。
你能给我一个算法的例子吗? 替代文字 http://ryancalderoni.com/archive/ideal_curve.jpg
编辑:然后我将如何使用 Javascript 计算数学?有人可以添加吗?很抱歉最初没有包含该上下文..
注意:我使用“flot”来绘制它,flot 的输入是一个像这样的 javascript 数组:
[[x,y],[x,y],[x,y]...]
因此,给定改变曲线的值,我将所有点输出到带有循环的数组中,然后将其吐出以浮动到图形。
典型的 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));
}
如果你想要一个单一的解析函数,那么 ArcTangent 和 Hyperbolic Tangent 都具有这种形状,你只需将它移动一点。如果您希望它仅从原点开始并且是平坦的,请查看 Exp[-1/x^n],对于 n>=1。这会产生一条在原点处非常平坦的曲线。
尝试查找sigmoid函数,它看起来很像。
(来源:ulcar.uml.edu 的 iag)
我可以建议:
erf(x)
在 C 中)0.5 * erfc(-x/sqrt(2))
)1.0 / (1.0 + exp(-x))
)贝塞尔曲线? 绘制它的相应算法将是de Casteljau's algorithm。
这一切都很棒,但还有另一个想法:
假设一个三阶多项式:
(来源:equationsheet.com)
您有四个边界条件:
(来源:equationsheet.com)
(来源:equationsheet.com)
如果您将这些代入等式并计算出代数,您将得到以下结果:
(来源:equationsheet.com)
在哪里
(来源:equationsheet.com)
和
(来源:equationsheet.com)
它可能不准确,但您可以根据您知道的值轻松地对其进行近似:(来源:equationsheet.com)
您正在寻找的是所谓的 Sigmoid 函数。您可以在维基百科中查找它。用于此的一些函数是误差函数或逻辑函数。这些最常用于神经网络。