Domanda

ho allegato immagine: alt text
(fonte: piccy.info )

Quindi, in questa immagine è un diagramma di funzione, che è definita sui punti indicati. Per esempio sui punti x = 1..N.

Un altro schema, elaborata come una curva semitrasparente, Questo è ciò che voglio ottenere dal diagramma originale, cioè voglio approssimare la funzione originale in modo che diventi liscio.

Ci sono metodi per fare questo?

Ho sentito parlare di metodo dei minimi quadrati, che può essere utilizzato per approssimare una funzione retta o per funzione parabolica. Ma non ho bisogno di approssimare per funzione parabolica. Probabilmente ho bisogno di approssimarla dalla funzione trigonometrica. Quindi ci sono tutti i metodi per fare questo? E una sola idea, è possibile utilizzare il metodo dei minimi quadrati per questo problema, se si può dedurre che per le funzioni trigonometriche?

Ancora una domanda! Se uso Discrete Fourier Transform e pensare alla funzione come somma di onde, quindi possibile che il rumore ha caratteristiche appositamente per cui possiamo definire e poi possiamo impostare a zero la frequenza corrispondente e quindi eseguire Fourier trasformata inversa. Quindi, se si pensa che è possibile, allora che cosa si può suggerire, al fine di identificare la frequenza del rumore?

È stato utile?

Soluzione

Purtroppo molte soluzioni qui presentati non risolvono il problema e / o sono semplicemente sbagliato. Ci sono molti approcci e sono specificamente costruiti per risolvere le condizioni ed i requisiti è necessario essere consapevoli di!

a) la teoria della approssimazione: Se si dispone di una funzione definita molto forte senza errori (dato da una definizione o di dati) e si desidera tracciare esattamente come possibile, si utilizza approssimazione polinomio o razionale da Chebyshev o Legendre polinomi, il che significa che si avvicinare la funzione da un polinomio o, se periodico, per serie di Fourier.

b) di interpolazione:! Se si dispone di una funzione in cui sono riportati alcuni punti (ma non l'intera curva) e avete bisogno di una funzione per ottenere attraverso questo punti, è possibile utilizzare diversi metodi:

Newton-Gregory, Newton con differenze divise, Lagrange, Hermite, Spline

c) montaggio di curva: Lei ha una funzione con punti dati e si vuole disegnare una curva con una data () funzione che approssima il più vicino alla curva possibile!. Ci sono lineari e algoritmi non lineari per questo caso.

Il tuo Disegno implica:

  • Non è lontanamente simile a una funzione matematica.
  • Non è nettamente definita dai dati o la funzione
  • È necessario adattare la curva, non alcuni punti.

Che cosa vogliono e hanno bisogno è

d) Smoothing: Dato un curva o datapoints con rumore o elementi in rapida evoluzione, si vuole solo vedere le lenti cambiamenti nel corso del tempo

.

È possibile farlo con LOESS come Jacob suggerito (ma trovo che eccessivo, soprattutto perché la scelta di un arco ragionevole ha bisogno di una certa esperienza). Per il vostro problema, ho semplicemente consiglio la media in esecuzione come suggerito da Jim C.

http://en.wikipedia.org/wiki/Running_average

Siamo spiacenti, cdonner e Orendorff, le vostre proposte sono ben di mente, ma completamente sbagliato, perché si sta utilizzando gli strumenti giusti per la soluzione sbagliata.

Questi ragazzi usato un sesto polinomio per adattarsi dati climatici e si sono imbarazzato completamente.

http://scienceblogs.com/deltoid/2009/01/the_australians_war_on_science_32.php

http://network.nationalpost.com/np/blogs/fullcomment/archive/2008/10/20/lorne-gunter-thirty-years-of-warmer-temperatures-go-poof. aspx

Altri suggerimenti

loess in R (gratuito)

es. qui la funzione loess approssima una curva sinusoidale rumoroso.

sine
(fonte: stowers-institute.org )

Come si può vedere è possibile modificare la morbidezza della vostra curva con span

Ecco un po 'di codice di esempio da R qui :

  

Step-by-Step Procedura

     

Diamo una curva sinusoidale, aggiungere un po '   "Rumore" ad esso, e poi vedere come la   loess parametro "span" colpisce il   cercare della curva levigata.

     
      
  1. Crea una curva sinusoidale e aggiungere un po 'di rumore:

         

    periodo <- 120 x <- 1: 120 y <-   sin (2 * pi * x / periodo) +   runif (lunghezza (x), - 1,1)

  2.   
  3. tracciare i punti su questa curva sinusoidale rumorosa:

         

    plot (x, y, principale = "Sine Curve +   Rumore 'Uniform' ") mtext (" mostrando   smoothing loess (regressione locale   smoothing) ")

  4.   
  5. Applica loess lisciatura utilizzando il valore di span di default di 0.75:

         

    y.loess <- loess (y ~ x, arco = 0.75,   data.frame (x = x, y = y))

  6.   
  7. Calcola valori loess smussati per tutti i punti lungo la curva:

         

    y.predict <- prevedere (y.loess,   data.frame (x = x))

  8.   
  9. Tracciare la curva di loess lisciato con i punti che erano già   tracciato:

         

    linee (x, y.predict)

  10.   

È possibile utilizzare un filtro digitale come un filtro FIR. Il filtro FIR più semplice è solo una media in esecuzione. Per un trattamento più sofisticato sembrare un qualcosa come un FFT.

Questo è chiamato curva fitting . Il modo migliore per farlo è quello di trovare una libreria numerica in grado di farlo per voi. Ecco una pagina che mostra come fare questo usando SciPy . L'immagine in quella pagina mostra ciò che fa il codice:

grafico

mostra due insiemi di dati rumorosi e due best-fit sinusoidi http://www.scipy.org/Cookbook/FittingData?action=AttachFile&do=get&target=datafit.png

Ora è solo 4 righe di codice, ma l'autore non spiega affatto. Cercherò di spiegare brevemente qui.

In primo luogo si deve decidere quale forma si desidera che la risposta sia. In questo esempio, l'autore vuole una curva della forma

  

f (x) = p 0 cos (2π / p 1 x + p 2 ) + p 3 x

Si potrebbe invece voler la somma delle varie curve. Va bene; la formula è un input al risolutore.

L'obiettivo della esempio, allora, è quello di trovare le costanti p 0 a p 3 per completare la formula. SciPy può trovare questo array di quattro costanti. Tutto ciò che serve è un funzione di errore che SciPy può usare per vedere quanto vicino le sue congetture sono i punti dati campionati attuali.

fitfunc = lambda p, x: p[0]*cos(2*pi/p[1]*x+p[2]) + p[3]*x # Target function
errfunc = lambda p: fitfunc(p, Tx) - tX # Distance to the target function

errfunc richiede solo un parametro: un array di lunghezza 4. Si inserisce queste costanti nella formula e calcola una matrice di valori sulla curva candidato, quindi sottrae la matrice di campione punti dati Tx. Il risultato è una matrice di valori di errore; presumibilmente SciPy prenderà la somma dei quadrati di questi valori.

Poi basta mettere alcune ipotesi iniziali e scipy.optimize.leastsq scricchiolii i numeri, cercando di trovare un set di parametri p in cui è ridotto al minimo l'errore.

p0 = [-15., 0.8, 0., -1.] # Initial guess for the parameters
p1, success = optimize.leastsq(errfunc, p0[:])

Il p1 risultato è una matrice contenente i quattro costanti. success è 1, 2, 3, o 4 se THS risolutore effettivamente trovato una soluzione. (Se l'errfunc è sufficientemente folle, il risolutore può fallire.)

Questo appare come un'approssimazione polinomiale. Si può giocare con polinomi in Excel ( "Aggiungi linea di tendenza" ad un grafico, selezionare polinomiale, quindi aumentare l'ordine al livello di approssimazione che avete bisogno). Non dovrebbe essere troppo difficile trovare un algoritmo / code per questo. Excel può dimostrare l'equazione che si avvicinò con per il ravvicinamento, anche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top