如何区分matplotlib绘制的近乎重合的PDE数值解曲面?
问题描述
我需要在一张图中绘制3个曲面,展示有限差分法求解PDE时,计算步数增加后结果逐渐逼近精确解的过程。但目前初始计算结果就和精确解非常接近,导致图中曲面完全无法区分。我试过调整网格尺度(计算结果存在y1,精确解存在u),但没效果。希望不用编译后的交互工具就能展现曲面间距,相关代码如下:
import matplotlib.pyplot as plt import numpy as np from matplotlib import cm a = 0.25 M1, M2, M3, M4, M5 = 100, 200, 400, 100, 100 N1, N2, N3, N4, N5 = 40, 80, 160, 80, 20 nu1, nu2, nu3, nu4, nu5 = 0.8, 0.8, 0.8, 0.4, 1.6 h1, h2, h3, h4, h5 = 1/M1, 1/M2, 1/M3, 1/M4, 1/M5 tau1, tau2, tau3, tau4, tau5 = (nu1 * h1)/a, (nu2 * h2)/a, (nu3 * h3)/a, (nu4 * h4)/a, (nu5 * h5)/a Mp1, Mp2, Mp3, Mp4, Mp5 = 10, 20, 40, 10, 10 T1, T2, T3, T4, T5 = N1*tau1, N2*tau2, N3*tau3, N4*tau4, N5*tau5 def net(M, N, nu, h, tau, T): x = np.arange(0, 1+h, h) # len(x) = 101 t = np.arange(0, T+tau, tau) # len(t) = 41 y_start = 1 + 4*x y_board = np.exp(t) rights = 1+np.exp(t) y_ans = np.zeros((N+1, M+1)) # y_ans.shape = (101,41) for j in range(M+1): y_ans[0][j] = y_start[j] # rows for n in range(N+1): y_ans[n][0] = y_board[n] # columns for n in range(0, N): for j in range(1, M+1): y_ans[n+1][j] = nu*y_ans[n][j-1] + (1-nu)*y_ans[n][j] + tau*rights[n] u = np.zeros((N+1, M+1)) for n in range(N + 1): for j in range(M + 1): u[n][j] = 4 * x[j] + np.exp(t[n]) return(y_ans, u, x, t) y1, u1, x1, t1 = net(M1, N1, nu1, h1, tau1, T1) fig = plt.figure() ax1 = fig.add_subplot(1, 1, 1, projection='3d') X1, Y1 = np.meshgrid(np.linspace(0, 1, M1+1), np.linspace(0, T1, N1+1)) ax1.plot_surface(X1, Y1, u1, cmap=cm.BuGn, linewidth=1, antialiased=False, label = 'y1') ax1.plot_surface(X1, Y1, y1, cmap=cm.Reds, linewidth=1, antialiased=False, label = 'y1') plt.show()
内容的提问来源于stack exchange,提问作者Alena
相关产品推荐
相关产品推荐

