import numpy as np import matplotlib.pyplot as plt from scipy.integrate import quad from scipy.optimize import fsolve plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文显示问题 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题 # ============================== # 材料参数设定(以钆镓石榴石为例) # ============================== Tc = 2.0 # 居里温度 (K) H_max = 5.0 # 最大磁场强度 (T) C_m = 10.0 # 磁热容 (J/(kg·K)) mu0 = 4*np.pi*1e-7 # 真空磁导率 # ============================== # 磁熵变计算函数 (ΔS_M) # ============================== def delta_SM(T, H): """磁熵变积分公式 ΔS_M = ∫(∂M/∂T)_H dH""" # 简化假设:M = M_sat * (1 - (T/Tc)^1.5) ,在H足够大时近似 M_sat = 1.0 # 饱和磁化强度 (A/m) dMdT = -1.5 * M_sat * (T**(0.5))/Tc**1.5 # 导数项 return quad(lambda h: dMdT, 0, H)[0] # 对H积分 # ============================== # 温度-熵关系模型 # ============================== def entropy(T, H=0): """总熵 = 磁熵 + 晶格熵""" S_mag = delta_SM(T, H) S_lattice = C_m * np.log(T) if T > 0 else -np.inf # 处理边界情况 return S_mag + S_lattice def temperature(S_target, H): """求解给定熵和磁场时的温度""" def f(T): return entropy(T, H) - S_target try: return fsolve(f, x0=Tc)[0] except: return np.nan # ============================== # 磁制冷循环模拟 # ============================== # 初始状态 T_initial = 1.5 # 初始温度 (K) # 等温磁化 (A→B) T1 = T_initial S1 = entropy(T1, H=0) S2 = entropy(T1, H=H_max) # 绝热退磁 (B→C) H_steps_rev = np.linspace(H_max, 0, 100) S_BC = np.full_like(H_steps_rev, S2) T_BC = [temperature(s, h) for s, h in zip(S_BC, H_steps_rev)] # 等温退磁 (C→D) T2 = np.nanmin(T_BC) S3 = entropy(T2, H=0) S4 = entropy(T2, H=H_max) # 绝热磁化 (D→A) H_steps_mag = np.linspace(0, H_max, 100) S_DA = np.full_like(H_steps_mag, S3) T_DA = [temperature(s, h) for s, h in zip(S_DA, H_steps_mag)] # ============================== # 绘图 # ============================== plt.figure(figsize=(12, 6)) # 温熵图 (T-S图) plt.subplot(1,2,1) T_range = np.linspace(0.5, 3, 100) for H in [0, H_max]: S = [entropy(T, H) for T in T_range] plt.plot(S, T_range, label=f'H={H} T') # 绘制循环路径 plt.plot([S1, S2], [T1, T1], 'r--', label='等温磁化') # A→B plt.plot([entropy(t, h) for t, h in zip(T_BC, H_steps_rev)], T_BC, 'g--', label='绝热退磁') # B→C plt.plot([S3, S4], [T2, T2], 'b--', label='等温退磁') # C→D plt.plot([entropy(t, h) for t, h in zip(T_DA, H_steps_mag)], T_DA, 'm--', label='绝热磁化') # D→A plt.xlabel('熵 S (J/kg·K)') plt.ylabel('温度 T (K)') plt.title('温熵图 (T-S Diagram)') plt.grid(True) plt.legend() # 磁制冷循环图 plt.subplot(1,2,2) H_cycle = np.concatenate([ np.linspace(0, H_max, 100), np.linspace(H_max, 0, 100), np.linspace(0, -H_max, 100), np.linspace(-H_max, 0, 100) ]) T_cycle = np.concatenate([ [T1]*100, T_BC, [T2]*100, T_DA ]) plt.plot(H_cycle, T_cycle, 'r-') plt.xlabel('磁场强度 H (T)') plt.ylabel('温度 T (K)') plt.title('磁制冷循环温度变化') plt.grid(True) plt.tight_layout() plt.show() 帮我详细讲解其中的每一个函数
时间: 2025-06-05 13:49:51 浏览: 30
以下是对代码中每个函数的详细讲解,包括它们的作用、实现细节以及相关背景知识。
---
### 1. **`delta_SM(T, H)`**
#### 功能:
计算磁熵变(ΔS_M),即磁场强度从0到H变化时的磁熵变化量。
#### 实现细节:
- 使用了简化假设:磁化强度 \( M \) 与温度 \( T \) 的关系为 \( M = M_{\text{sat}} \cdot (1 - (T/T_c)^{1.5}) \),其中 \( M_{\text{sat}} \) 是饱和磁化强度。
- 磁熵变公式为 \( \Delta S_M = \int (\partial M / \partial T)_H dH \)。
- 计算导数项 \( \partial M / \partial T \) 并通过数值积分(`quad` 函数)求解磁熵变。
#### Python代码:
```python
def delta_SM(T, H):
"""磁熵变积分公式 ΔS_M = ∫(∂M/∂T)_H dH"""
M_sat = 1.0 # 饱和磁化强度 (A/m)
dMdT = -1.5 * M_sat * (T**(0.5)) / Tc**1.5 # 导数项
return quad(lambda h: dMdT, 0, H)[0] # 对H积分
```
#### 解释:
- `quad` 是 SciPy 中的数值积分函数,用于计算定积分。
- `dMdT` 表示磁化强度随温度的变化率。
- 积分范围是从 0 到给定的磁场强度 \( H \)。
---
### 2. **`entropy(T, H=0)`**
#### 功能:
计算总熵,包括磁熵和晶格熵。
#### 实现细节:
- 总熵由两部分组成:磁熵 \( S_{\text{mag}} \) 和晶格熵 \( S_{\text{lattice}} \)。
- 晶格熵公式为 \( S_{\text{lattice}} = C_m \cdot \ln(T) \),其中 \( C_m \) 是磁热容。
- 当温度 \( T \leq 0 \) 时,晶格熵被设置为负无穷大以避免对数运算中的错误。
#### Python代码:
```python
def entropy(T, H=0):
"""总熵 = 磁熵 + 晶格熵"""
S_mag = delta_SM(T, H)
S_lattice = C_m * np.log(T) if T > 0 else -np.inf # 处理边界情况
return S_mag + S_lattice
```
#### 解释:
- `delta_SM(T, H)` 计算磁熵。
- `C_m * np.log(T)` 计算晶格熵。
- 边界条件处理:当 \( T \leq 0 \) 时,返回负无穷大以避免对数运算中的数学错误。
---
### 3. **`temperature(S_target, H)`**
#### 功能:
根据给定的熵值 \( S_{\text{target}} \) 和磁场强度 \( H \),反推出对应的温度 \( T \)。
#### 实现细节:
- 定义了一个内部函数 `f(T)`,表示当前温度下的熵与目标熵之间的差值。
- 使用 `fsolve` 函数求解方程 \( f(T) = 0 \) 的根。
- 如果求解失败(例如没有找到合适的解),返回 `np.nan`。
#### Python代码:
```python
def temperature(S_target, H):
"""求解给定熵和磁场时的温度"""
def f(T):
return entropy(T, H) - S_target
try:
return fsolve(f, x0=Tc)[0]
except:
return np.nan
```
#### 解释:
- `fsolve` 是 SciPy 中的非线性方程求解器,用于找到使 \( f(T) = 0 \) 的 \( T \) 值。
- 初始猜测值为居里温度 \( T_c \)。
- 如果求解失败(例如超出定义域或无解),返回 `np.nan`。
---
### 4. **磁制冷循环模拟**
#### 功能:
模拟一个完整的磁制冷循环,包括等温磁化、绝热退磁、等温退磁和绝热磁化四个阶段。
#### 实现细节:
- **等温磁化 (A→B)**:保持温度不变,增加磁场强度,记录熵的变化。
- **绝热退磁 (B→C)**:保持熵不变,减少磁场强度,记录温度的变化。
- **等温退磁 (C→D)**:保持温度不变,减少磁场强度,记录熵的变化。
- **绝热磁化 (D→A)**:保持熵不变,增加磁场强度,记录温度的变化。
#### Python代码:
```python
# 初始状态
T_initial = 1.5 # 初始温度 (K)
# 等温磁化 (A→B)
T1 = T_initial
S1 = entropy(T1, H=0)
S2 = entropy(T1, H=H_max)
# 绝热退磁 (B→C)
H_steps_rev = np.linspace(H_max, 0, 100)
S_BC = np.full_like(H_steps_rev, S2)
T_BC = [temperature(s, h) for s, h in zip(S_BC, H_steps_rev)]
# 等温退磁 (C→D)
T2 = np.nanmin(T_BC)
S3 = entropy(T2, H=0)
S4 = entropy(T2, H=H_max)
# 绝热磁化 (D→A)
H_steps_mag = np.linspace(0, H_max, 100)
S_DA = np.full_like(H_steps_mag, S3)
T_DA = [temperature(s, h) for s, h in zip(S_DA, H_steps_mag)]
```
#### 解释:
- 使用 `np.linspace` 生成磁场强度的变化序列。
- 在绝热过程中,通过 `temperature` 函数计算对应温度。
- 熵值在绝热过程中保持不变。
---
### 5. **绘图**
#### 功能:
绘制温熵图(T-S图)和磁制冷循环图。
#### 实现细节:
- **温熵图**:绘制不同磁场强度下的温度-熵曲线,并标记磁制冷循环路径。
- **磁制冷循环图**:绘制磁场强度随时间变化时的温度变化曲线。
#### Python代码:
```python
plt.figure(figsize=(12, 6))
# 温熵图 (T-S图)
plt.subplot(1,2,1)
T_range = np.linspace(0.5, 3, 100)
for H in [0, H_max]:
S = [entropy(T, H) for T in T_range]
plt.plot(S, T_range, label=f'H={H} T')
# 绘制循环路径
plt.plot([S1, S2], [T1, T1], 'r--', label='等温磁化') # A→B
plt.plot([entropy(t, h) for t, h in zip(T_BC, H_steps_rev)], T_BC, 'g--', label='绝热退磁') # B→C
plt.plot([S3, S4], [T2, T2], 'b--', label='等温退磁') # C→D
plt.plot([entropy(t, h) for t, h in zip(T_DA, H_steps_mag)], T_DA, 'm--', label='绝热磁化') # D→A
plt.xlabel('熵 S (J/kg·K)')
plt.ylabel('温度 T (K)')
plt.title('温熵图 (T-S Diagram)')
plt.grid(True)
plt.legend()
# 磁制冷循环图
plt.subplot(1,2,2)
H_cycle = np.concatenate([
np.linspace(0, H_max, 100),
np.linspace(H_max, 0, 100),
np.linspace(0, -H_max, 100),
np.linspace(-H_max, 0, 100)
])
T_cycle = np.concatenate([
[T1]*100,
T_BC,
[T2]*100,
T_DA
])
plt.plot(H_cycle, T_cycle, 'r-')
plt.xlabel('磁场强度 H (T)')
plt.ylabel('温度 T (K)')
plt.title('磁制冷循环温度变化')
plt.grid(True)
plt.tight_layout()
plt.show()
```
#### 解释:
- 使用 `matplotlib` 绘制图形。
- 温熵图展示了不同磁场强度下的温度-熵关系。
- 磁制冷循环图展示了磁场强度变化时的温度变化。
---
###
阅读全文
相关推荐


















