2009-12-07 7 views
0

I ont besoin d'une équation exponentielle avec les paramètres suivants:Formule pour une courbe (algèbre en javascript)

Lorsque x = 0, y = 153.
Lorsque x = 500, y = 53.
Y devrait augmenter de façon exponentielle lorsque X approche de 0 et devrait décroître de façon exponentielle lorsque X approche 500.

Pour une raison que j'ignore, je ne me souviens pas comment procéder. Je suis sûr qu'une fois que je vois l'équation (ou une semblable) je peux comprendre le repos.

Contexte dans la programmation: Ceci est pour une fonction Javascript qui change la couleur d'un div lorsque la longueur maximale d'une zone de texte est sur le point d'être atteinte. D'autres alternatives ou extraits de code sont les bienvenus.

MISE À JOUR: Je ne sais pas pourquoi, mais -1500/(x + 15) +153 me donne quelque chose à ce que je cherche. Donc, il semble que ce que je demandais n'est pas ce que je voulais vraiment.

Je crois que ce que je cherche est:
Lorsque x = 0, y = 53.
Lorsque x = 500, y = 153.

+2

l'équation que vous avez indiquée est quadratique. Exponentiel aurait x dans l'exposant. –

+1

Peut-être mieux sur http://www.mathoverflow.net/ – Yacoby

+0

@Donnie Merci, j'ai enlevé l'exemple de la partie équation. –

Répondre

2

modifier (après votre mise à jour):

Avec vos modifications, vous demandez une fonction croissante et quelque chose ressemblant à y = 1/x.

L'échelle de votre fonction peut être modifiée pour s'adapter à vos coordonnées exactes, bien que la courbe soit beaucoup plus abrupte au départ.

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

Prenant note des solutions entières, nous utilisons la solution x = 96, y = 149 pour modifier la formule, mise à l'échelle de ces valeurs dans votre plage de coordonnées. Cela nous donnera quelque chose de plus proche de votre courbe mise à jour qui descend un peu plus doucement.

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

Voici une parcelle de votre version, à titre de comparaison.

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


Réponse originale (avant votre mise à jour)

Je pense que vous verrez quelques convergences étranges vers la couleur de votre destination si vous utilisez une échelle non linéaire, mais néanmoins, vous peut utiliser une formule générale et décider quel polynôme ou exposant vous donne les meilleurs résultats.

D'abord, la fonction algébrique/polynomiale.

A * X^N + B = Y 

Cette formule générale peut être résolu dans le système pour vous donner un polynôme d'ordre N qui correspond à une courbe entre deux points connus. Dans ce cas, nous résolvons pour < X = 0, Y = 153 > à < X = 500, Y = 53 >.

Substituer la première paire de coordonnées, on obtient facilement B.

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

Maintenant, en remplaçant la deuxième paire, nous pouvons trouver A.

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

Si vous voulez une échelle linéaire, vous substituez N = 1, et cela nous donne A = -0.20.

-0.20 * X + 153 = Y 

Si vous voulez une échelle quadratique, vous substituez N = 2, et qui nous donne A = -0,0004.

-0.0004 * X^2 + 153 = Y 

Vous pouvez également utiliser une valeur non entière pour N, entre 1 et 2 (essayez 1.5 ou 1.6), que je pense que vous donnera probablement de meilleurs résultats. Notez également que lorsque cette fonction augmente, elle finit par tomber en dessous de zéro, mais seulement après que la courbe a traversé le second point.

Voici la fonction exponentielle. J'utilise et comme base ici, bien que vous puissiez le modifier à n'importe quoi d'autre supérieur à 1. Pour ajuster une courbe entre deux points, nous obtiendrons les meilleurs résultats si les deux points ont des valeurs Y supérieures à zéro. Sinon, nous devrons ajouter un décalage et déterminer où nous voulons que la ligne de base soit. Pour les besoins ici, nous supposerons que la ligne de base est Y = 0. Cela signifie qu'au fur et à mesure que X augmente, Y finira par atteindre, mais n'atteindra pas réellement, 0, après avoir traversé le second point.

A * e^(B * X) = Y 

Encore une fois, résoudre pour la première coordonnée. Substituez l'entrée pour obtenir B, avec la deuxième coordonnée.

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

ln (val) est le journal naturel qui est inverse à e^val. Ma calculatrice dit que B est à peu près égal à -0.0021202920156806272577911119053782, ou peut-être -0.0021 fonctionnerait mieux en bref. Si vous voulez résoudre ceci pour d'autres bases d'exposant, utilisez les identités exposant/logarithme de la même manière pour résoudre toute autre base, et pour changer la base du logarithme en ln() [log() en js] ou log() [log()/Math.log10e dans js].

+0

parfait! la fonction mise à jour que vous m'avez donnée fonctionne très bien! Merci! –

0

Je ne sais pas ce que la courbe serait exactement mais il serait probablement dans la famille de 1/(x^d) où d est votre exposant. Regardez here pour avoir une idée de ce à quoi ressemble la courbe. Est-ce que c'est ce que tu veux?

1

Vous devez être plus précis, mais y = 154-x^0.742625 devrait faire l'affaire. Ici, le nombre décimal est log (101)/log (500).

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

0

Fondamentalement, vous voulez probablement résoudre le logistic equation dy/dx = K y (ymax - y). La solution est dans le lien fourni.

+0

En fait, après avoir fourni votre raison, c'est probablement trop. Un gradient linéaire est probablement meilleur pour votre application. – erikkallen