以下は、正弦波のトップとボトムのピークを見つける例です。スクリプトは、最初にいくつかのサンプル データを生成し、次に上と下のピークを見つけます。

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>
ありがとうございます。 ばかげた質問で申し訳ありませんが、これを自分のデータに適用するにはどうすればよいですか。 また、0 に沿って少し段差がある理由を説明していただけますか?
ありがとう
ステフ
以前の回答でもっと説明的であるべきでした。
JMP を使用して正弦波のピークと谷を検出する機能は、JMP に組み込まれている分析機能の 1 つではありません。ただし、JMP のスクリプト言語 (JSL) を使用すると、スクリプトを使用して必要な情報を取得できます。
あなたの質問に対する解決策に取り組むために最初に必要だったのは、サンプル データ テーブルでした。JMPはインストール時に提供しますが、最初の質問で提供した正弦波と同様の正弦波のデータ値を提供するものは知りません。したがって、独自のサンプル データ テーブルを作成する必要がありました。スクリプトの最初の部分は、サンプル データ テーブルを作成するだけです。
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
スクリプトのこの部分は、サンプル データ テーブルを作成します。完全な正弦波データ テーブルではありません。
生成された正弦波には、波ごとにある程度の変動性を持たせたいと考えていました。 これを実現するために、コードは波が波の中央より上または下に移動するたびに波を調整します。 .最終結果は、波ごとに異なる最大高点と異なる最小値を持つ波です。最終結果のデータ テーブルにはそのばらつきがありますが、波形に小さなステップも作成されます。サンプル データ テーブルは完全ではありませんが、使用するには十分です。

上記の波のデータを生成するスクリプトの一部を次に示します。
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;
それが生成するテーブルは次のようになります

作成したデータ テーブルには 2 つの列があります。1 つは X と呼ばれ、もう 1 つは Y と呼ばれます。列には、任意の名前を付けることができます。スクリプトを変更して、X と Y の列名への参照を実際の列名に置き換える必要があります。
提供した実際のスクリプトに戻ります....データ テーブルが作成されたら、Graph Builder を使用してデータをグラフィカルな形式で表示しました。
Graph Builder( Variables( X( :x ), Y( :y ) ), Elements( Points( X, Y, Legend( 3 ) ) ) );
この JSL ステートメントは、正弦波グラフを表示しました。
次のステートメントは、スクリプトの実行を単純に一時停止して、データの最小値と最大値の実際の検索に移る前に、グラフを 5 秒間表示できるようにします。
Wait( 5 );
JSL の残りの部分は、コードの実際の作業部分であり、最初に各正弦波の最大点と最小点を見つけ、次に、
各波の上位および下位のデータ ポイント。
// 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>
この分析をデータに適用するには、まず、生成したサンプル データ テーブルのような構造の JMP データ テーブルにデータを入力する必要があります。次に、データ列に X と Y という名前が付けられていると仮定すると、次のスクリプトを実行するだけで、新しいテーブルを使用してデータを分析し、各波の最小値と最大値を見つけることができます。
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 ) );
この詳細な返信を書くために時間を割いていただき、ありがとうございます! 私はそれをうまく機能させました。これは素晴らしいことです。ありがとうございました。
回答が役に立った場合は、[解決策として受け入れる] をクリックしてください。 このソリューションがあなたを助けたことを他の人に強調します。 
こんにちは。時間の経過に伴う角度として測定された周期的な動きのモーション データがあります。 ピークの最小値と最大値を抽出する方法はありますか(私は初心者なので簡単な説明が可能です)。 以下に例を示します。 私はこれを手動で行っていますが、多数のピークを含むデータがあるため、より効率的な方法が必要です。 どうもありがとう
