Ecco un esempio che trova i picchi superiore e inferiore per le onde sinusoidali.Lo script genera prima alcuni dati di esempio e poi va e trova i picchi superiore e inferiore.

Names Default To Here( 1 );
dt = New Table( "sine", New Column( "x" ), New Column( "y" ) );
For( k = 1, k <= 10, k++,
yfudgepos = Random Uniform( 0, .2 );
yfudgeneg = Random Uniform( 0, .2 );
For( x = 0, x <= 360, x++,
dt << add rows( 1 );
y = Sin( x / 180 * Pi() );
:x[Row()] = x + ((k - 1) * 360);
If( y < -1 * yfudgeneg,
:y[Row()] = y + yfudgeneg
);
If( y > yfudgepos,
:y[Row()] = y - yfudgePos
);
);
);
dt << select where(ismissing(:y));
dt << delete rows;
Graph Builder( Variables( X( :x ), Y( :y ) ), Elements( Points( X, Y, Legend( 3 ) ) ) );
wait(5);
// Find the min and max for each phase in the sine waves
dt << New Column("T or B",character);
// determine the starting direction of the wave
if(dt:y[1]<Y> dt:y[i],
dt:T or B[i] = "Bottom";
direction = "up";
)
);
dt << select where( :T or B != "" );
dtTB = dt << subset( selected columns(0), selected rows(1));</Y>
Avrei dovuto essere più descrittivo nella risposta precedente.
La capacità di trovare i picchi e gli avvallamenti di un'onda sinusoidale utilizzando JMP non è una delle analisi integrate di JMP.Tuttavia, utilizzando JSL (Scripting Language) di JMP, è possibile utilizzare uno script per ottenere le informazioni necessarie.
La prima cosa di cui avevo bisogno per iniziare a lavorare su una soluzione alla tua domanda era una tabella di dati di esempio.JMP fornisce nella sua installazione, tuttavia, non sono a conoscenza di nessuno di essi che fornisca i valori dei dati per un'onda sinusoidale simile all'onda sinusoidale che hai fornito nella tua domanda iniziale.Ho quindi dovuto creare la mia tabella di dati di esempio.La prima parte del mio script non fa altro che creare una tabella di dati di esempio.
Names Default To Here( 1 );
dt = New Table( "sine", New Column( "x" ), New Column( "y" ) );
For( k = 1, k <= 10, k++,
yfudgepos = Random Uniform( 0, .2 );
yfudgeneg = Random Uniform( 0, .2 );
For( x = 0, x <= 360, x++,
dt << add rows( 1 );
y = Sin( x / 180 * Pi() );
:x[Row()] = x + ((k - 1) * 360);
If( y < -1 * yfudgeneg,
:y[Row()] = y + yfudgeneg
);
If( y > yfudgepos,
:y[Row()] = y - yfudgePos
);
);
);
dt << select where(ismissing(:y));
dt << delete rows;Th
Questa parte dello script crea la tabella dati di esempio.Non è una tabella dati sinusoidale perfetta.
Volevo che l'onda sinusoidale prodotta avesse una certa variabilità per ogni onda. Per fare ciò, il codice regola l'onda ogni volta che va sopra o sotto la metà dell'onda. .Il risultato finale è un'onda che ha diversi punti massimi massimi e diversi valori minimi per ogni onda.La tabella dei dati risultante ha quella variabilità, ma crea anche un piccolo passo nella forma d'onda.Sebbene la tabella dei dati di esempio non sia perfetta, è abbastanza buona da usare.

Ecco la parte dello script che produce i dati per l'onda precedente.
Names Default To Here( 1 );
dt = New Table( "sine", New Column( "x" ), New Column( "y" ) );
For( k = 1, k <= 10, k++,
yfudgepos = Random Uniform( 0, .2 );
yfudgeneg = Random Uniform( 0, .2 );
For( x = 0, x <= 360, x++,
dt << add rows( 1 );
y = Sin( x / 180 * Pi() );
:x[Row()] = x + ((k - 1) * 360);
If( y < -1 * yfudgeneg,
:y[Row()] = y + yfudgeneg
);
If( y > yfudgepos,
:y[Row()] = y - yfudgePos
);
);
);
dt << select where(ismissing(:y));
dt << delete rows;
Il tavolo che produce sembra

La tabella dati che ho creato ha due colonne.Uno chiamato X e uno chiamato Y Le colonne possono essere denominate come si desidera chiamarle.Lo script deve solo essere modificato per scambiare i riferimenti ai nomi delle colonne di X e Y con qualunque siano i nomi effettivi delle colonne.
Tornando allo script effettivo che ho fornito... una volta creata la tabella dei dati, ho quindi utilizzato Graph Builder per visualizzare i dati in forma grafica.
Graph Builder( Variables( X( :x ), Y( :y ) ), Elements( Points( X, Y, Legend( 3 ) ) ) );
Questa istruzione JSL mostrava il grafico dell'onda sinusoidale.
L'istruzione successiva simple sospende l'esecuzione dello script, per consentire di vedere il grafico per 5 secondi, prima di passare alla ricerca vera e propria dei valori minimo e massimo nei dati.
Wait( 5 );
Il resto del JSL, è l'effettiva parte di lavoro del codice, che prima trova il punto massimo e minimo di ogni onda sinusoidale, quindi crea una nuova tabella di dati contenente solo il
Punti dati superiore e inferiore per ciascuna onda.
// Find the min and max for each phase in the sine waves
dt << New Column("T or B",character);
// determine the starting direction of the wave
if(dt:y[1]<Y> dt:y[i],
dt:T or B[i] = "Bottom";
direction = "up";
)
);
dt << select where( :T or B != "" );
dtTB = dt << subset( selected columns(0), selected rows(1));</Y>
Per applicare questa analisi ai tuoi dati, devi prima inserire i tuoi dati in una tabella di dati JMP in una struttura come la tabella di dati di esempio che ho generato.Quindi, supponendo che la tua colonna di dati sia stata nominata X e Y, devi solo eseguire lo script qui sotto, per fare in modo che utilizzi la tua nuova tabella per analizzare i dati e trovare i valori minimo e massimo per ogni onda.
Names Default To Here( 1 );
dt = Current Data Table();
// Find the min and max for each phase in the sine waves
dt << New Column( "T or B", character );
// determine the starting direction of the wave
If( dt:y[1] < dt:y[2],
direction = "up",
direction = "down"
);
For( i = 1, i <= N Rows( dt ) - 1, i++,
If(
direction == "up" & dt:y[i + 1] < dt:y[i],
Show( i );
dt:T or B[i] = "Top";
direction = "down";,
direction == "down" & dt:y[i + 1] > dt:y[i],
dt:T or B[i] = "Bottom";
direction = "up";
)
);
dt << select where( :T or B != "" );
dtTB = dt << subset( selected columns( 0 ), selected rows( 1 ) );
Ciao, ho alcuni dati di movimento del movimento ciclico misurati come angolo nel tempo. Esiste un modo per estrarre i valori di picco minimo e massimo (sono un principiante quindi è possibile una semplice spiegazione, per favore). Un esempio qui sotto. L'ho fatto manualmente ma ho alcuni dati con un gran numero di picchi, quindi vorrei un modo più efficiente. Grazie molto
