如何做出一块完美的牛排

Yicheng 于 2026-02-22 发布

下午3:30,我突然想起来——今晚答应做牛排的。

平时我的操作很简单:烤箱设到65°C,把牛排丢进去一下午,最后猛火两面各煎1-2分钟,醒几分钟切了就上桌。效果就不错。

但今天不一样。只有2小时窗口。凭经验我知道,65°C根本来不及把肉从里到外热透。于是我妥协了——用上了木头烤炉,并且把温度设到了100°C。

结果嘛……居然也还行,但牛排表面看起来是稍微有点干,但是烟熏环带来的粉色又弥补了一点颜色的问题。

所以我就好奇了,用热力学和Python算一下:到底该提前多久做牛排?

问题:需要多久,牛排中心才能达到 65°C(Medium Well)?


第一步:建个模型

做几个工程假设(强行拍脑袋+问AI,误差肯定是有的):

  1. 大平壁模型:牛排长宽无限大,热量只从上下两面进来。特征距离 = 半厚度 $L = 0.02$ m。
  2. 纯水假设:肉里70%+是水,剩下的油脂碳水蛋白质也和水差不多吧,这里就直接用水的参数:
    • 导热系数 $k = 0.6$ W/(m·K)
    • 密度 $\rho = 1000$ kg/m³
    • 比热容 $c_p = 4184$ J/(kg·K)

热扩散率: \(\alpha = \frac{k}{\rho c_p} \approx 1.434 \times 10^{-7} \text{ m}^2/\text{s}\)

第二步:算毕奥数

热量到牛排中心,分两步:

  1. 空气 → 牛排表面(对流换热)
  2. 表面 → 中心(内部导热)

这两步的”阻力”的对比,就是毕奥数($Bi$): \(Bi = \frac{h \cdot L}{k}\) 烤箱热风 $h \approx 25$ W/(m²·K),算出来 $Bi \approx 0.833$。

这说明空气传热效率比较低。跟水浴慢煮完全不能比——烤箱的空气对流是最大瓶颈。

还有辐射热没算。烤箱70°C时,辐射虽然不是主力,但也不能忽略。 线性化处理一下,算个等效辐射传热系数:

叠加得到等效总传热系数: \(h_{eff} = h_{conv} + h_{rad} = 25 + 7.13 \approx 32.13 \text{ W/(m}^2\cdot\text{K)}\)

最终: \(Bi = \frac{h_{eff} \cdot L}{k} = \frac{32.13 \times 0.02}{0.6} \approx 1.071\)

第三步:解方程

中心点的无量纲温度: \(\Theta_c^* = \frac{T_c - T_\infty}{T_i - T_\infty} = \frac{65 - 70}{4 - 70} \approx 0.0758\)

非稳态导热的解析解是个傅里叶级数,用第一项近似: \(\Theta_c^* = C_1 \cdot \exp(-\zeta_1^2 \cdot Fo)\)

其中 $\zeta_1$ 来自超越方程 $\zeta_1 \tan(\zeta_1) = Bi$。

这里就让G大师帮我些个 Python 解:

import math
from scipy.optimize import fsolve

def calculate_steak_time():
    # --- 物理常数与初始条件 ---
    k = 0.6          # 导热系数 W/(m·K)
    rho = 1000       # 密度 kg/m^3
    cp = 4184        # 比热容 J/(kg·K)
    L = 0.02         # 半厚度 m (4cm / 2)
    h_conv = 25      # 对流传热系数 W/(m^2·K)
    
    T_oven = 70      # 烤箱空气与内壁的统一温度 °C
    T_c = 65         # 目标中心温度 °C
    T_i = 4          # 初始冷藏温度 °C
    
    # --- 辐射参数 ---
    epsilon = 0.85   # 牛排表面的热辐射率
    sigma = 5.67e-8  # 斯蒂芬-玻尔兹曼常数 W/(m^2·K^4)

    # 1. 辐射换热线性化 (转化为等效辐射传热系数 h_rad)
    T_surr_K = T_oven + 273.15
    T_s_avg_K = 50 + 273.15 # 估算表面平均温度为 50°C
    h_rad = epsilon * sigma * (T_surr_K**2 + T_s_avg_K**2) * (T_surr_K + T_s_avg_K)
    
    # 2. 计算等效总传热系数 (h_eff) 
    h_eff = h_conv + h_rad
    T_eff = T_oven 
    
    # 3. 计算热扩散率 alpha 和 新的毕奥数 Bi
    alpha = k / (rho * cp)
    Bi = (h_eff * L) / k
    
    # 4. 求解超越方程 zeta * tan(zeta) = Bi
    def transcendental_eq(zeta):
        return zeta * math.tan(zeta) - Bi
    zeta_1 = fsolve(transcendental_eq, 0.8)[0]
    
    # 5. 计算傅里叶级数系数 C_1 和无量纲温度 theta_star
    C_1 = (4 * math.sin(zeta_1)) / (2 * zeta_1 + math.sin(2 * zeta_1))
    theta_star = (T_c - T_eff) / (T_i - T_eff)
    
    # 6. 计算傅里叶数 (Fo) 并反推真实时间
    Fo = -math.log(theta_star / C_1) / (zeta_1**2)
    t_seconds = Fo * (L**2) / alpha
    t_hours = t_seconds / 3600
    
    print(f"等效辐射传热系数 (h_rad): {h_rad:.2f} W/(m²·K)")
    print(f"等效总传热系数 (h_eff): {h_eff:.2f} W/(m²·K)")
    print(f"毕奥数 (Bi): {Bi:.4f}")
    print(f"==== 结论 ====")
    print(f"预计耗时: {t_hours:.2f} 小时 ({t_seconds:.0f} 秒)")

if __name__ == "__main__":
    calculate_steak_time()

跑一下:

==== 结论 ====
预计耗时: 2.69 小时 (9674 秒)

理论与现实

Python 说是 2.69 小时

但实际厨房里,我的经验是 3-4 小时,甚至可以更久,3小时有时候肉还感觉有点生,4-5小时就不错了。

分析情况,当中心温度到 60°C 以后,跟 70°C 烤箱的温差只剩 10°C——驱动力太小了,热传导就非常慢了。

更重要的一点:水分蒸发。肉表面一直在蒸发,带走大量潜热,温度更难升上去。这里可以考虑报上锡纸/盖保鲜膜等操作。

所以用 Wood Pellet Grill 熏烤时,我一般把炉温拉到 110°C - 125°C,并且在经过一定时间的Smoke后,我会用锡纸包裹避免表面进失水影响升温。

好吃的肉