2009-12-07 22 views
0

我需要使用以下参数的指数方程:公式的曲线(在JavaScript代数)

当x = 0,Y = 153
当x = 500,Y = 53。
ÿ应随着X接近0而呈指数增长,并且在X接近500时应该呈指数级下降。

由于某种原因,我不记得如何做到这一点。 我确信一旦我看到等式(或类似的),我就可以找出其余的。

编程中的上下文:这是一个Javascript函数,当textarea的最大长度即将到达时,它改变div的颜色。其他备选方案或代码片段非常受欢迎。

更新: 我不知道为什么,但-1500 /(x + 15)+153给了我一些接近我所寻找的东西。所以看起来我所要求的并不是我真正想要的。

我猜我期待的是:
当x = 0,Y = 53
当x = 500,Y = 153

+2

您列出的公式是二次的。指数在指数中有x。 – 2009-12-07 16:42:04

+1

可能会更好http://www.mathoverflow.net/ – Yacoby 2009-12-07 16:43:10

+0

@Donnie谢谢,我删除了示例方程部分。 – 2009-12-07 16:44:41

回答

2

编辑(您更新后):

随着你的改变,你问一个提升功能和类似y = 1/x的东西。

您的功能的比例可以更改为适合您的确切坐标,尽管曲线在开始时斜率更陡。

y = 154 - 10100/(20 * x + 100) @ Wolfram Alpha
Plot of 154 - 10100/(20 * x + 100) from x=0 to x=500 @ Wolfram Alpha

注意到整数解,我们利用解x = 96,Y =的149,以改变该式中,缩放这些值代入你的坐标范围内。这会给我们提供更接近你的更新曲线的曲线,这个曲线稍微倾斜一点点。

y = 158 - 2625/(x + 25) @ Wolfram Alpha
Plot of 158 - 2625/(x + 25) from x=0 to x=500 @ Wolfram Alpha

这里是你的版本情节,进行比较。

y = -1500/(x + 15) + 153 @ Wolfram Alpha


原来的答案

(您更新之前),我想你会看到朝着自己的目标颜色一些奇怪的趋同,如果您使用的是非线性的规模,但尽管如此,你可以使用一个通用公式并决定什么多项式或指数给你最好的结果。

首先,代数/多项式函数。

A * X^N + B = Y 

此通式可以在系统需要解决给你的适合两个已知点之间的曲线阶数N的多项式。在这种情况下,我们解决了< X = 0,Y = 153 >至< X = 500,Y = 53 >。

代第一坐标对,我们很容易得到B.

A * (0)^N + B = (153) 
0 + B = (153) 
B = 153 

现在,替代第二对,我们可以发现A.

A * (500)^N + 153 = (53) 
A * (500)^N = -100 
A = -100/(500^N) 

如果你想有一个线性刻度,你替代N = 1,这给了我们A = -0.20。

-0.20 * X + 153 = Y 

如果你想要一个二次规模,你可以用N = 2代替,那么A = -0.0004。

-0.0004 * X^2 + 153 = Y 

你也可以使用一些非整数值N,1和2之间(尝试1.5或1.6),我认为这可能会给你更好的结果。还要注意,随着这个函数的增加,它将最终降到零以下,但是只有在曲线通过第二个点之后。

这里是指数函数。我使用e作为基础,尽管您可以将它改为大于1的任何值。要拟合两点之间的曲线,如果两个点的Y值均大于零,我们将获得最佳结果。否则,我们将不得不添加一个偏移量并确定我们想要的基线位置。为了达到这个目的,我们假定基线是Y = 0。这意味着随着X的增加,Y在通过第二点后最终会蠕变,但实际上不会达到0。

A * e^(B * X) = Y 

再次解决第一个坐标。

A * e^(B * 0) = 153 
A * e^(0) = 153 
A * 1 = 153 
A = 153 

用第二个坐标代替B得到B.

153 * e^(B * 500) = 53 
e^(B * 500) = 53/153 
B * 500 = ln(53/153) 
B = ln(53/153)/500 

ln(val)是与e^val相反的自然对数。我的计算器表示B大约等于-0.0021202920156806272577911119053782,或者-0.0021可能最好。如果你想为其他指数基础解决这个问题,以相同的方式使用指数/对数身份来解决任何其他基础,并将对数的底数改为ln()[log()in js]或log() [js中的log()/ Math.log10e]。

+0

完美!你给我的更新功能非常棒!谢谢! – 2009-12-09 13:16:25

0

我不知道该曲线是究竟是什么但它可能在 1/(x^d) 的系列中,其中d是您的指数。查看here了解曲线的外观。那是你要的吗?

1

你必须更具体,但 y = 154-x^0.742625应该做的伎俩。 这里,十进制数是log(101)/ log(500)。

http://www.wolframalpha.com/input/?i=154-x ^%28log%28101%29%2Flog%28599%29%29

0

基本上你可能想要解决dy/dx = K y(ymax - y)。解决方案在提供的链接中。

+0

其实,在你提供你的理由后,这可能是矫枉过正。线性渐变可能对您的应用程序更好。 – erikkallen 2009-12-07 17:27:41