亲爱的 JMP 社区成员,
我有一个可以连续循环温度的烤箱(从热到冷,然后从冷到热并重复......)。
烤箱提供温度与时间的记录。
如果我们绘制温度@Y 轴、时间@X 轴,我们会得到附图。
我们需要计算特定温度范围内的温度变化率(在本例中为 0dgC 到 130dgC 之间)。
例如:
绿色固定信息指的是减速(从 130dgc 到 0dgc)。
利用相应的时间,我们可以计算出温度变化率(130 除以时间差)。
紫色固定信息指的是上升 (从 0dgC 到 130dgc)。
然后我们采取同样的方法计算温度变化率。
绿色(下降)和紫色(上升)= 1 个周期
在这种情况下,我们需要计算这里整个几个周期的所有上升和下降。
实际上,为了举例目的我们仅展示了几个循环,但实际上有数百个循环。
我的问题是如何计算每个周期的上升和下降并将其存储在另一个数据表中?
当然,也可以手动完成,但这太繁琐了。
我们可以通过任何自动化方式或“更简化”的方式来做到这一点吗?
我附上了数据。
烤箱仅记录 2 列数据(时间和温度)。没有循环数据(第 1 个循环、第 2 个循环...等)。
抱歉发了这么长的邮件,感谢您的建议。
Br,
克里斯
例如,您可以通过使用公式来实现这一点。您可以先添加州列

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