Hier ist ein Beispiel, das die oberen und unteren Spitzen für die Sinuswellen findet.Das Skript generiert zunächst einige Beispieldaten und findet dann die oberen und unteren Spitzen.

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>
Ich hätte in der vorherigen Antwort beschreibender sein sollen.
Die Fähigkeit, die Spitzen und Täler einer Sinuswelle mit JMP zu finden, gehört nicht zu den integrierten Analysen von JMP.Durch die Verwendung der JMP-Skriptsprache (JSL) kann jedoch ein Skript verwendet werden, um die benötigten Informationen abzurufen.
Das erste, was ich brauchte, um an einer Lösung für Ihre Frage zu arbeiten, war eine Beispieldatentabelle.JMP stellt in seiner Installation bereit, mir ist jedoch keiner von ihnen bekannt, der die Datenwerte für eine Sinuswelle ähnlich der Sinuswelle liefert, die Sie in Ihrer ursprünglichen Frage angegeben haben.Ich musste daher meine eigene Beispieldatentabelle erstellen.Der erste Teil meines Skripts macht nichts weiter, als eine Beispieldatentabelle zu erstellen.
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
Dieser Teil des Skripts erstellt die Beispieldatentabelle.Es ist keine perfekte Sinusdatentabelle.
Ich wollte, dass die erzeugte Sinuswelle für jede Welle eine gewisse Variabilität aufweist. Um dies zu erreichen, passt der Code die Welle jedes Mal an, wenn sie über oder unter die Mitte der Welle geht. .Das Endergebnis ist eine Welle, die unterschiedliche maximale Hochpunkte und unterschiedliche Minimalwerte für jede Welle hat.Die resultierende Datentabelle weist diese Variabilität auf, erzeugt jedoch auch einen kleinen Schritt in der Wellenform.Die Beispieldatentabelle ist zwar nicht perfekt, aber gut genug, um sie zu verwenden.

Hier ist der Teil des Skripts, der die Daten für die obige Welle erzeugt.
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;
Die Tabelle, die es erzeugt, sieht aus wie

Die von mir erstellte Datentabelle hat zwei Spalten.Eine namens X und eine namens Y. Die Spalten können benannt werden, wie man sie nennen möchte.Das Skript muss nur geändert werden, um die Verweise auf die Spaltennamen von X und Y gegen die tatsächlichen Namen der Spalten auszutauschen.
Zurück zum eigentlichen Skript, das ich bereitgestellt habe .... sobald die Datentabelle erstellt wurde, habe ich Graph Builder verwendet, um die Daten in einer grafischen Form anzuzeigen.
Graph Builder( Variables( X( :x ), Y( :y ) ), Elements( Points( X, Y, Legend( 3 ) ) ) );
Diese JSL-Anweisung zeigte das Sinuswellendiagramm an.
Die nächste Anweisung unterbricht einfach die Ausführung des Skripts, damit man das Diagramm für 5 Sekunden sehen kann, bevor man mit der eigentlichen Suche nach den Minimal- und Maximalwerten in den Daten fortfährt.
Wait( 5 );
Der Rest der JSL ist der eigentliche Arbeitsteil des Codes, der zuerst den maximalen und minimalen Punkt jeder Sinuswelle findet und dann eine neue Datentabelle erstellt, die nur diese enthält
Obere und untere Datenpunkte für jede Welle.
// 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>
Um diese Analyse auf Ihre Daten anzuwenden, müssen Sie Ihre Daten zunächst in eine JMP-Datentabelle in einer Struktur wie der von mir generierten Beispieldatentabelle eingeben.Angenommen, Ihre Datenspalte hätte die Namen X und Y, müssen Sie dann nur das folgende Skript ausführen, damit es Ihre neue Tabelle verwendet, um die Daten zu analysieren und die Mindest- und Höchstwerte für jede Welle zu finden.
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 ) );