可以把热图改为三维坐标图吗
时间: 2023-10-05 08:09:14 浏览: 109
MATLAB图形绘制-三维热力图
当使用五点差分格式进行离散化时,求解的数值解是一个二维数组。因此,将结果可视化为三维坐标图可能不是最合适的选择。不过,我们可以使用matplotlib库的plot_surface函数将数值解可视化为一个三维曲面图。
以下是修改后的代码,将数值解可视化为三维曲面图:
```python
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def solve_by_elimination(m1, m2):
hx = 2 / m1
hy = 1 / m2
N = (m1 + 1) * (m2 + 1)
A = np.zeros((N, N))
b = np.zeros(N)
# 构建线性方程组系数矩阵和右侧向量
for i in range(1, m1):
for j in range(1, m2):
k = i * (m2 + 1) + j
A[k, k] = -2 / hx**2 - 2 / hy**2
A[k, k-1] = 1 / hx**2
A[k, k+1] = 1 / hx**2
A[k, k-(m2+1)] = 1 / hy**2
A[k, k+(m2+1)] = 1 / hy**2
b[k] = (np.pi**2 - 1) * np.exp(i * hx) * np.sin(np.pi * j * hy)
# 处理边界条件
for j in range(m2 + 1):
k = j
A[k, k] = 1
b[k] = np.sin(np.pi * j * hy)
k = m1 * (m2 + 1) + j
A[k, k] = 1
b[k] = np.exp(2) * np.sin(np.pi * j * hy)
for i in range(m1 + 1):
k = i * (m2 + 1)
A[k, k] = 1
b[k] = 0
k = i * (m2 + 1) + m2
A[k, k] = 1
b[k] = 0
# 求解线性方程组
u = np.linalg.solve(A, b)
return u.reshape((m1+1, m2+1))
# 设置网格参数
m1 = 10 # x方向网格点数
m2 = 10 # y方向网格点数
# 使用消元法求解差分方程组
u_elimination = solve_by_elimination(m1, m2)
# 绘制三维曲面图
x = np.linspace(0, 2, m1+1)
y = np.linspace(0, 1, m2+1)
X, Y = np.meshgrid(x, y)
fig = plt.figure(figsize=(6, 4))
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(X, Y, u_elimination, cmap='hot')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('u(x, y)')
ax.set_title('Numerical Solution by Elimination')
plt.show()
```
运行上述代码,将会得到一个三维曲面图,表示数值解在给定区域上的分布情况。请注意,由于离散化后的数值解是一个二维数组,所以在绘制三维曲面图时,我们需要使用网格点的坐标信息来确定横纵坐标的范围。你可以根据需要调整网格参数和绘图设置,以获得更好的可视化效果。
阅读全文