2010-08-13 3 views
5

E puoi darmi un esempio di un algoritmo? alt text http://ryancalderoni.com/archive/ideal_curve.jpgChe tipo di algoritmo fa una curva come questa (img) e può essere fatta in javascript per flottare?

MODIFICA: E poi come dovrei calcolare la matematica utilizzando Javascript? Qualcuno può aggiungerlo? Siamo spiacenti di non includere tale contesto originariamente ..

NOTA: Sto usando 'flot' per rappresentare graficamente e l'ingresso per flot è un array JavaScript come questo:

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

Quindi, dati i valori che cambiano la curva, emetto tutti i punti su un array con un loop e lo sputo per passare al grafico.

+2

meglio su math.stackexchange? EDIT: non sapeva che c'erano due. – James

+3

Si potrebbe voler provare a chiedere su http://math.stackexchange.com/. StackOverflow è pensato per domande relative alla programmazione. – derekerdmann

+3

@James: No. Assolutamente no.Math Overflow è per le domande matematiche a livello di ricerca, non per le cose che un undergrad potrebbe riflettere (soprattutto, almeno). Si prega di smettere di raccomandare quello per ogni domanda di matematica che vedi qui perché di solito è severamente fuori portata. – Joey

risposta

4

Una tipica curva sigmoide è la curva tanh (x).

Per definizione,

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) 

http://privat.rejbrand.se/tanh.png
(High-res)

Si noti che le linee di simmetria sono spostate rispetto alla foto del campione.Per fare un aspetto grafico tanh più come tuo esempio, è sufficiente spostarlo verso l'alto e verso destra:

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

http://privat.rejbrand.se/tanh2.png
(High-res)

In JavaScript si implementa questa espressione più efficiente

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

Aggiornamento (di nuovo)

OK, se si desidera che y sia compreso tra 0 e 100 e x sia compreso tra 0 e 100, t Han si potrebbe desiderare di provare

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

che assomiglia

http://privat.rejbrand.se/tanh3.png
(High-res)

Ora

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

La funzione di errore, ERF, sembra abbastanza simile, ma è molto più difficile da calcolare (a meno che JavaScript non abbia un divertimento erf incorporato zione).


Ryan (OP) ha aggiunto: implementato!

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

function tanh (arg) { 
    return (Math.exp(arg) - Math.exp(-arg))/(Math.exp(arg) + Math.exp(-arg)); 
} 
+0

grazie, ma la mia implementazione non funziona come mi aspetto, per ogni valore X aggiungo che restituisce il lo stesso valore Y (viene emessa una linea retta) – BigOmega

+0

@Ryan: Ciò potrebbe essere dovuto al fatto che si dimentica di aggiornare exp2x ogni volta. L'espressione è in realtà 'y = (Math.exp (2 * x) - 1)/(Math.exp (2 * x) + 1'. Ho appena ottimizzato un po 'riducendo una delle identiche chiamate al lento' exp 'Funzione –

+0

vedi dettagli aggiunti, +1 per il tuo aiuto fino ad ora, un passo più vicino al voto di risposta :) – BigOmega

3

Se si desidera una singola funzione analitica, ArcTangent e Hyperbolic Tangent hanno entrambi quella forma, è sufficiente spostarla un po '. Se vuoi che inizi solo all'origine e sia piatto, guarda Exp [-1/x^n], per n> = 1. Questo produce una curva che è eccessivamente piatta all'origine.

+0

Beat me to 1;). –

+0

aggiornato la domanda per mostrare la relazione di programmazione, qualche idea su come mettere questo algoritmo in javascript? – BigOmega

1

Posso sugggest:

  • La funzione di errore (erf(x) in C)
  • La funzione di distribuzione normale (0.5 * erfc(-x/sqrt(2)))
  • La funzione logistica (1.0/(1.0 + exp(-x)))
  • Qualsiasi altra funzione sigmoid
+0

+1 per la parola chiave 'sigmoid' (-> http://en.wikipedia.org/wiki/Sigmoid_function) – mykhal

0

Quello che stai cercando si chiama funzione sigmoide. Puoi cercarlo su Wikipedia. Alcune funzioni utilizzate sono la funzione di errore o la funzione logistica. Questi sono più comunemente usati per le reti neurali.

0
Problemi correlati