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

使用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}
$$
编写代码后发现求解结果和初始条件完全一致,没有任何演化。

原代码问题分析

  1. 缺失numpy导入:代码中使用了np命名空间但未导入numpy,会导致运行报错。
  2. PDE表达式语法错误:
    • 直接用x1、x2无法被py-pde的表达式解析器识别为网格坐标;
    • 二阶偏导的写法diff(p, x2, order = 2)不符合库的语法规范,库不支持关键字参数指定阶数。
  3. 上述语法错误导致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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:16:14