You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何区分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:32:45