import numpy as np import matplotlib.pyplot as plt # 设置模拟参数 D = 0.12# 热扩散率 L = 20 # 模拟深度 T = 365 * 10 # 模拟时间 h = 0.1 # 栅格大小 dt = 0.01 # 时间步长 N = int(T / dt) # 时间步数 M = int(L / h) + 1 # 深度格点数 K = int(T / 90*dt) # 画图次数 # 初始化温度分布 T0 = np.ones(M) * 10 T0[0] = 10 + 12 # 表面温度 T0[-1] = 11 # 深度为20米处温度 # 初始化温度矩阵 T = np.zeros((M, N)) T[:, 0] = T0 # 进行数值求解 for n in range(1, N): for i in range(1, M - 1): T[i, n] = T[i, n-1] + D * dt / h**2 * (T[i+1, n-1] - 2*T[i, n-1] + T[i-1, n-1]) # 边界条件 if not np.all(T[:,n]==0): T[0, n] =10 + 12 * np.sin(2 * np.pi * n * dt / T) T[-1, n] =11 else: break # 每隔90天画一次图 if n % int(T / 90*dt) == 0: plt.plot(T[:, n], np.linspace(0, L, M), label=f'{n*dt/365:.0f} year') plt.legend() # 显示温度轮廓图 plt.xlabel('Temperature (°C)') plt.ylabel('Depth (m)') plt.title('Temperature Profile') plt.gca().invert_yaxis() plt.show()程序报错,devide by zero encountered in divide,如何改正
时间: 2024-03-23 11:37:36 浏览: 21
这个错误一般出现在除数为零的情况下,可能是在计算中某个地方没有考虑到分母为零的情况。在这个程序中,可能是因为除数 `h` 或者 `T` 为零导致的。你可以检查一下这两个变量,看看是否有问题。另外,你可以尝试在计算时加上容错判断,如下:
```python
if h == 0 or T == 0:
continue
else:
T[i, n] = T[i, n-1] + D * dt / h**2 * (T[i+1, n-1] - 2*T[i, n-1] + T[i-1, n-1])
```
这样就可以避免因为除数为零而导致的错误。
相关问题
import numpy as np import matplotlib.pyplot as plt # 设置模拟参数 D = 0.12# 热扩散率 L = 20 # 模拟深度 T = 365 * 10 # 模拟时间 h = 0.1 # 栅格大小 dt = 0.01 # 时间步长 N = int(T / dt) # 时间步数 M = int(L / h) + 1 # 深度格点数 K = int(T / 90) # 画图次数 # 初始化温度分布 T0 = np.ones(M) * 10 T0[0] = 10 + 12 # 表面温度 T0[-1] = 11 # 深度为20米处温度 # 初始化温度矩阵 T = np.zeros((M, N)) T[:, 0] = T0 # 进行数值求解 for n in range(1, N): for i in range(1, M - 1): T[i, n] = T[i, n-1] + D * dt / h**2 * (T[i+1, n-1] - 2*T[i, n-1] + T[i-1, n-1]) # 边界条件 if T.all()!=0: T[0, n] ==10 + 12 * np.sin(2 * np.pi * n * dt / T) and T[-1, n] ==11 else: break # 每隔90天画一次图 if n % int(T / 4) == 0: plt.plot(T[:, n], np.linspace(0, L, M), label=f'{n*dt/365:.0f} year') plt.legend() # 显示温度轮廓图 plt.xlabel('Temperature (°C)') plt.ylabel('Depth (m)') plt.title('Temperature Profile') plt.gca().invert_yaxis() plt.show()为什么这个代码画不出图
这个代码有两个问题:
1. 在边界条件的处理中,应该使用赋值操作`=`而不是相等比较操作`==`。因此需要将 `T[0, n] ==10 + 12 * np.sin(2 * np.pi * n * dt / T)` 和 `T[-1, n] ==11` 修改为 `T[0, n] =10 + 12 * np.sin(2 * np.pi * n * dt / T)` 和 `T[-1, n] =11`。
2. 在每隔90天画一次图的条件判断中,应该使用 `n % int(T / (90*dt)) == 0` 而不是 `n % int(T / 4) == 0`,因为要画图的时间间隔是90天,而不是总时间的四分之一。
修改后的代码如下:
```
import numpy as np
import matplotlib.pyplot as plt
# 设置模拟参数
D = 0.12 # 热扩散率
L = 20 # 模拟深度
T = 365 * 10 # 模拟时间
h = 0.1 # 栅格大小
dt = 0.01 # 时间步长
N = int(T / dt) # 时间步数
M = int(L / h) + 1 # 深度格点数
K = int(T / (90*dt)) # 画图次数
# 初始化温度分布
T0 = np.ones(M) * 10
T0[0] = 10 + 12 # 表面温度
T0[-1] = 11 # 深度为20米处温度
# 初始化温度矩阵
T = np.zeros((M, N))
T[:, 0] = T0
# 进行数值求解
for n in range(1, N):
for i in range(1, M - 1):
T[i, n] = T[i, n-1] + D * dt / h**2 * (T[i+1, n-1] - 2*T[i, n-1] + T[i-1, n-1])
# 边界条件
if T.all()!=0:
T[0, n] = 10 + 12 * np.sin(2 * np.pi * n * dt / T)
T[-1, n] = 11
else:
break
# 每隔90天画一次图
if n % int(T / (90*dt)) == 0:
plt.plot(T[:, n], np.linspace(0, L, M), label=f'{n*dt/365:.0f} year')
plt.legend()
# 显示温度轮廓图
plt.xlabel('Temperature (°C)')
plt.ylabel('Depth (m)')
plt.title('Temperature Profile')
plt.gca().invert_yaxis()
plt.show()
```
这样就可以画出正确的温度轮廓图了。
在Windows系统下编写一个python程序:铝棒长为L=1.,计算绝热体中的铝棒的热传导方程。
好的,这里是一个Python程序来计算绝热体中的铝棒的热传导方程:
```python
import numpy as np
import matplotlib.pyplot as plt
# 铝棒参数
L = 1.0 # 长度
N = 100 # 离散化点数
dx = L / N # 离散化步长
k = 237.0 # 热导率
c = 900.0 # 比热容
p = 2700.0 # 密度
alpha = k / (c * p) # 热扩散系数
T0 = 100.0 # 初始温度
# 初始化温度分布
T = np.zeros(N)
T.fill(T0)
# 迭代计算绝热体中的热传导方程
t_final = 100.0 # 最终时间
dt = 0.01 # 时间步长
t = 0.0
while t < t_final:
# 计算下一个时间步长的温度分布
T_next = np.zeros(N)
T_next[0] = T[0] + alpha * dt / dx**2 * (T[1] - T[0])
T_next[N-1] = T[N-1] + alpha * dt / dx**2 * (T[N-2] - T[N-1])
for i in range(1, N-1):
T_next[i] = T[i] + alpha * dt / dx**2 * (T[i+1] - 2*T[i] + T[i-1])
# 更新温度分布
T = T_next
# 前进时间
t += dt
# 绘制结果
x = np.linspace(0, L, N)
plt.plot(x, T)
plt.xlabel('Position (m)')
plt.ylabel('Temperature (C)')
plt.show()
```
这个程序比之前的程序更简单,因为它只计算了绝热体中的铝棒的热传导方程,并且没有考虑任何边界条件。它只是简单地迭代计算温度分布随时间的演化,并在计算完成后绘制结果。请注意,这个程序使用了一些简化的假设,例如铝棒是均匀的,并且热传导是一维的。如果您有更详细的需求,您可能需要使用更复杂的模型和算法来解决问题。