使用py-pde定义并求解含偏导数的非线性PDE遇问题
解决py-pde求解复杂PDE时结果无变化的问题
问题背景
要求解的偏微分方程为:
$$
\frac{\partial p}{\partial t} = -x_2 \frac{\partial p}{\partial x_1} + 0.2p + (0.2x_2 + x_1) \frac{\partial p}{\partial x_2} + 0.2 \frac{\partial^2 p}{\partial x_2^2}
$$
编写代码后发现求解结果和初始条件完全一致,没有任何演化。
原代码问题分析
- 缺失numpy导入:代码中使用了
np命名空间但未导入numpy,会导致运行报错。 - PDE表达式语法错误:
- 直接用
x1、x2无法被py-pde的表达式解析器识别为网格坐标; - 二阶偏导的写法
diff(p, x2, order = 2)不符合库的语法规范,库不支持关键字参数指定阶数。
- 直接用
- 上述语法错误导致PDE未被正确解析,求解器实际上没有执行任何演化计算,结果自然和初始条件一致。
修正后的代码
import pde import numpy as np # 补上缺失的numpy导入 grid = pde.CartesianGrid([[-3, 3]]*2, 100) # 初始化二维高斯分布 mean = np.array([1, 1]) cov = np.eye(2)/9 inv_cov = 9*np.eye(2) norm_factor = 1 / (2 * np.pi * np.sqrt(np.linalg.det(cov))) x1, x2 = grid.axes_coords X1, X2 = np.meshgrid(x1, x2, indexing='ij') X = np.dstack((X1, X2)) initial_condition = norm_factor * np.exp(-0.5 * np.einsum('...i,ij,...j->...', X - mean, inv_cov, X - mean)) p0 = pde.ScalarField(grid, initial_condition) # 修正PDE表达式:用grid.x/grid.y引用坐标,修正二阶偏导写法 myPDE = pde.PDE({ 'p': '-grid.y * diff(p, grid.x) + 0.2*p + (0.2*grid.y + grid.x)*diff(p, grid.y) + 0.2*diff(p, grid.y, 2)' }) # 求解并对比结果 result = myPDE.solve(p0, t_range=5, dt=1e-3) # 可视化验证 p0.plot(title="初始条件") result.plot(title="t=5时的演化结果")
关键修复说明
- 网格坐标引用:在py-pde的字符串表达式中,必须通过
grid.x、grid.y(对应二维网格的两个坐标轴)来引用坐标变量,不能直接用自定义的x1、x2。 - 二阶偏导写法:二阶偏导数需要用
diff(p, 轴变量, 2)的格式,其中第三个参数直接写阶数,不能用order=2的关键字参数。 - 添加可视化:通过
plot方法可以直观看到初始条件和演化后的结果差异,验证求解是否正常运行。
内容的提问来源于stack exchange,提问作者GigaByte123
相关产品推荐
相关产品推荐

