親愛的 JMP 社群:
我有一個可以連續循環溫度的烤箱(從熱到冷,然後從冷到熱,然後重複...)。
烤箱提供溫度與時間的記錄。
如果我們繪製溫度@Yaxis,時間@Xaxis,我們會得到附圖。
我們需要計算特定溫度範圍內(本例為 0dgC 到 130dgC)內的溫度變化率是多少。
例如:
綠色固定資訊指的是斜坡下降(從 130dgc 到 0dgc)。
根據對應的時間,我們可以計算出溫度變化率(130 除以時間差)。
紫色固定資訊指的是斜坡上升(從 0dgC 到 130dgc)。
然後我們用同樣的方法來計算溫度變化率。
綠色(斜坡下降)和紫色(斜坡上升)= 1 個週期
在這種情況下,我們需要計算整個幾個週期的所有上升和下降。
實際上,出於範例目的,我們只顯示了幾個週期,但實際上有數百個週期。
我的問題是我們如何計算每個週期的上升和下降並將其儲存在另一個資料表中?
當然,也可以手動完成,但這太繁瑣了。
我們可以透過任何自動化方式或「更簡化」的方式來做到這一點嗎?
我附上數據。
烤箱僅記錄 2 列資料(時間和溫度)。沒有週期資料(第一個週期、第二個週期...等)。
抱歉,郵件很長,感謝您的建議。
兄弟,
克里斯
例如,您可以透過使用公式來做到這一點。您可以從新增狀態列開始

If(
0 < :Temp Profile < 130 & Dif(:Temp Profile) < 0, curstate = "Down Ramp",
0 < :Temp Profile < 130 & Dif(:Temp Profile) > 0, curstate = "Ramp Up",
curstate = "No Ramp"
)
然後您可以從那裡添加更多計算。
嗨@ChrisLooi ,
除了@jthi的想法之外,我還想添加一些更多的 JSL,以幫助您在可能處理的數百(數千?)個週期中實現自動化。以下是一些應該適用於整個資料集的程式碼,儘管它僅針對您提供的資料集進行了測試(謝謝,這樣做確實有很大幫助!)。我沒有評論代碼,但如果有任何部分沒有意義,請告訴我,我會解釋它的作用。
Names Default To Here( 1 );
dt = Current Data Table();
dt << New Column( "State",
"Character",
"Nominal",
Formula(
If(
0 <= :Temp Profile < 130 & Dif( :Temp Profile ) < 0, "Ramp down",
0 <= :Temp Profile < 130 & Dif( :Temp Profile ) > 0, "Ramp up",
"No Ramp"
)
)
);
dt << New Column( "Cycle No", "Numeric", "Ordinal" );
dt << New Column( "Phase", "Character", "Nominal" );
l = 1;
:"Cycle No"n[1] = 1;
For( i = 2, i <= N Rows( dt ) - 1, i++,
If(
(:State[i] == :State[i - 1]), :"Cycle No"n[i] = l,
((:State[i] != :State[i - 1]) & (:State[i] == "Ramp down" & :State[i - 1] == "No Ramp")),
:"Cycle No"n[i] = l;
:Phase[i] = "Start";,
((:State[i] != :State[i - 1]) & (:State[i] == "No Ramp" & :State[i - 1] == "Ramp down")),
:"Cycle No"n[i] = l;
:Phase[i - 1] = "End";,
((:State[i] != :State[i - 1]) & (:State[i] == "Ramp up" & :State[i - 1] == "No Ramp")),
:"Cycle No"n[i] = l;
:Phase[i] = "Start";,
((:State[i] != :State[i - 1]) & (:State[i] == "No Ramp" & :State[i - 1] == "Ramp up")),
:Phase[i - 1] = "End";
l++;
:"Cycle No"n[i] = l;
)
);
:"Cycle No"n[N Row( dt )] = l;
dt << Row Selection( Select Where( :Phase == "Start" ) );
dt << Row Selection( Select Where( :Phase == "End" ), Current Selection( "Extend" ) );
dtsubset = dt << Subset( Selected Rows( 1 ), Selected columns only( 0 ), Suppress Formula Eval( 1 ) );
dt << Clear Select;
dt_results = dtsubset << Summary(
Group( :State, :Cycle No ),
Mean( :Time ),
Mean( :Temp Profile ),
Subgroup( :Phase ),
Freq( "None" ),
Weight( "None" ),
statistics column name format( "column" ),
Link to original data table( 0 )
);
Close( dtsubset, no save );
dt_results << New Column( "Temp Rate Change (°C/sec)",
"Numeric",
"Continuous",
Formula( (:"Temp Profile, End"n - :"Temp Profile, Start"n) / (:"Time, End"n - :"Time, Start"n) )
);
dt_results << Sort( By( :Cycle No, :"Time, End"n, :State ), Order( Ascending, Ascending, Ascending ), Replace Table, Suppress Formula Eval( 0 ) );
dt_results << Delete Columns( :"N Rows"n );
當然,您可以透過添加更改感興趣的溫度範圍的功能(此處將其硬編碼為 0 和 130)來使其更加靈活,但這也會增加一些複雜性。
無論如何,希望這有幫助!
DS