Voici un exemple qui trouve les pics supérieur et inférieur pour les ondes sinusoïdales.Le script génère d'abord des exemples de données, puis recherche les pics supérieur et inférieur.

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>
J'aurais dû être plus descriptif dans la réponse précédente.
La possibilité de trouver les pics et les creux d'une onde sinusoïdale à l'aide de JMP ne fait pas partie des analyses intégrées de JMP.Cependant, en utilisant le langage de script JMP (JSL), un script peut être utilisé pour obtenir les informations dont vous avez besoin.
La première chose dont j'avais besoin pour commencer à travailler sur une solution à votre question était un exemple de tableau de données.JMP fournit dans son installation cependant, je ne connais aucun d'entre eux qui fournit les valeurs de données pour une onde sinusoïdale similaire à l'onde sinusoïdale que vous avez fournie dans votre question initiale.J'ai donc dû créer mon propre exemple de table de données.La première partie de mon script ne fait rien de plus que de créer un exemple de table de données.
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
Cette partie du script crée l'exemple de table de données.Ce n'est pas une table de données d'onde sinusoïdale parfaite.
Je voulais que l'onde sinusoïdale produite ait une certaine variabilité pour chaque onde. Pour ce faire, le code ajuste la vague chaque fois qu'elle passe au-dessus ou en dessous du milieu de la vague. .Le résultat final est une vague qui a différents points hauts maximaux et différentes valeurs minimales pour chaque vague.La table de données résultante finale a cette variabilité, mais elle crée également une petite étape dans la forme d'onde.Bien que l'exemple de tableau de données ne soit pas parfait, il est suffisamment bon pour être utilisé.

Voici la partie du script qui produit les données pour la vague ci-dessus.
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;
La table qu'il produit ressemble à

La table de données que j'ai créée a deux colonnes.Une appelée X et une appelée Y Les colonnes peuvent être nommées comme on veut les appeler.Le script doit simplement être modifié pour remplacer les références aux noms de colonne de X et Y par les noms réels des colonnes.
Pour en revenir au script réel que j'ai fourni... une fois la table de données créée, j'ai ensuite utilisé Graph Builder pour afficher les données sous forme graphique.
Graph Builder( Variables( X( :x ), Y( :y ) ), Elements( Points( X, Y, Legend( 3 ) ) ) );
Cette instruction JSL affichait le graphique sinusoïdal.
L'instruction suivante interrompt simplement l'exécution du script, pour permettre de voir le graphique pendant 5 secondes, avant de passer à la recherche proprement dite des valeurs minimales et maximales dans les données.
Wait( 5 );
Le reste du JSL est la partie de travail réelle du code, qui trouve d'abord le point maximum et minimum de chaque onde sinusoïdale, puis crée une nouvelle table de données contenant uniquement le
Points de données supérieurs et inférieurs pour chaque vague.
// 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>
Pour appliquer cette analyse à vos données, vous devez d'abord saisir vos données dans un tableau de données JMP dans une structure comme l'exemple de tableau de données que j'ai généré.Ensuite, en supposant que votre colonne de données s'appelle X et Y, il vous suffit d'exécuter le script ci-dessous, pour qu'il utilise votre nouvelle table pour analyser les données et trouver les valeurs minimales et maximales pour chaque vague.
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 ) );
Salut, j'ai des données de mouvement de mouvement cyclique mesurées sous forme d'angle dans le temps. Existe-t-il un moyen d'extraire les valeurs de crête minimales et maximales (je suis un noob donc une explication simple est possible s'il vous plaît). Un exemple ci-dessous. Je l'ai fait manuellement mais j'ai des données avec un grand nombre de pics, j'aimerais donc une manière plus efficace. Merci beaucoup
