前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Scikit-fdiff | 二维浅水方程计算与可视化

Scikit-fdiff | 二维浅水方程计算与可视化

作者头像
用户11172986
发布2025-03-21 17:28:25
发布2025-03-21 17:28:25
5600
代码可运行
举报
文章被收录于专栏:气python风雨气python风雨
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
复制
%matplotlib inline

Scikit-fdiff | 二维浅水方程计算与可视化

引言

在科学计算和工程领域,偏微分方程(PDE)的求解一直是一个复杂且耗时的任务。Scikit-fdiff是一个旨在简化这一过程的Python库,它通过有限差分法(Finite Difference Method)来离散化空间导数,并结合方法线(Method of Lines)将PDE转化为高维常微分方程(ODE),从而利用标准的ODE数值积分方法进行求解。

Scikit-fdiff的核心特点

  1. 符号化离散化:Scikit-fdiff使用Sympy进行符号化离散化,能够自动生成ODE的精确雅可比矩阵。
  2. 多种后端支持:目前支持Numpy和Numba作为后端,能够将符号化的ODE转化为高效的数值计算例程。
  3. 灵活的求解器:支持Scipy中的标准ODE求解器,并提供了一些专门优化的求解器,能够利用雅可比矩阵的快速计算。
  4. 模拟处理工具:提供实时显示、结果持久化、后处理接口等实用功能。

适用场景

Scikit-fdiff适用于以下场景:

  • 模型原型设计:当你需要快速验证模型时,Scikit-fdiff能够提供非最优但准确的解决方案。
  • 刚性问题的求解:对于刚性系统,Scikit-fdiff提供了高阶隐式求解器和自适应时间步长控制。
  • 简单几何域:由于有限差分法的限制,Scikit-fdiff主要适用于矩形几何域。

安装

Scikit-fdiff可以通过PyPI和Conda安装:

代码语言:javascript
代码运行次数:0
运行
复制
!pip install scikit-fdiff -i https://pypi.mirrors.ustc.edu.cn/simple/
代码语言:javascript
代码运行次数:0
运行
复制
Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/
Requirement already satisfied: scikit-fdiff in /opt/conda/lib/python3.9/site-packages (0.7.0)
Requirement already satisfied: xarray in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (2024.2.0)
Requirement already satisfied: appdirs in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (1.4.4)
Requirement already satisfied: matplotlib in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (3.8.3)
Requirement already satisfied: boltons in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (24.1.0)
Requirement already satisfied: fuzzywuzzy in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (0.18.0)
Requirement already satisfied: sympy<1.6 in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (1.5.1)
Requirement already satisfied: tqdm in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (4.66.2)
Requirement already satisfied: cloudpickle in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (2.0.0)
Requirement already satisfied: attrs in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (21.4.0)
Requirement already satisfied: pyyaml in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (5.4.1)
Requirement already satisfied: joblib in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (1.3.2)
Requirement already satisfied: numpy in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (1.26.4)
Requirement already satisfied: cached-property in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (1.5.2)
Requirement already satisfied: more-itertools in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (10.6.0)
Requirement already satisfied: streamz in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (0.6.4)
Requirement already satisfied: loguru in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (0.7.3)
Requirement already satisfied: dask in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (2024.2.0)
Requirement already satisfied: cachetools in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (5.3.3)
Requirement already satisfied: python-forge in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (18.6.0)
Requirement already satisfied: path.py in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (12.5.0)
Requirement already satisfied: scipy in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (1.11.4)
Requirement already satisfied: holoviews in /opt/conda/lib/python3.9/site-packages (from scikit-fdiff) (1.15.4)
Requirement already satisfied: mpmath>=0.19 in /opt/conda/lib/python3.9/site-packages (from sympy<1.6->scikit-fdiff) (1.2.1)
Requirement already satisfied: importlib-metadata>=4.13.0 in /opt/conda/lib/python3.9/site-packages (from dask->scikit-fdiff) (7.0.1)
Requirement already satisfied: partd>=1.2.0 in /opt/conda/lib/python3.9/site-packages (from dask->scikit-fdiff) (1.2.0)
Requirement already satisfied: fsspec>=2021.09.0 in /opt/conda/lib/python3.9/site-packages (from dask->scikit-fdiff) (2022.3.0)
Requirement already satisfied: click>=8.1 in /opt/conda/lib/python3.9/site-packages (from dask->scikit-fdiff) (8.1.3)
Requirement already satisfied: toolz>=0.10.0 in /opt/conda/lib/python3.9/site-packages (from dask->scikit-fdiff) (0.12.1)
Requirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.9/site-packages (from dask->scikit-fdiff) (23.2)
Requirement already satisfied: pandas>=0.20.0 in /opt/conda/lib/python3.9/site-packages (from holoviews->scikit-fdiff) (2.0.3)
Requirement already satisfied: colorcet in /opt/conda/lib/python3.9/site-packages (from holoviews->scikit-fdiff) (3.0.1)
Requirement already satisfied: panel>=0.13.1 in /opt/conda/lib/python3.9/site-packages (from holoviews->scikit-fdiff) (0.14.4)
Requirement already satisfied: pyviz-comms>=0.7.4 in /opt/conda/lib/python3.9/site-packages (from holoviews->scikit-fdiff) (2.3.2)
Requirement already satisfied: param<2.0,>=1.9.3 in /opt/conda/lib/python3.9/site-packages (from holoviews->scikit-fdiff) (1.13.0)
Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib->scikit-fdiff) (4.33.3)
Requirement already satisfied: contourpy>=1.0.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib->scikit-fdiff) (1.2.0)
Requirement already satisfied: pillow>=8 in /opt/conda/lib/python3.9/site-packages (from matplotlib->scikit-fdiff) (9.4.0)
Requirement already satisfied: python-dateutil>=2.7 in /opt/conda/lib/python3.9/site-packages (from matplotlib->scikit-fdiff) (2.8.2)
Requirement already satisfied: importlib-resources>=3.2.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib->scikit-fdiff) (5.7.1)
Requirement already satisfied: pyparsing>=2.3.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib->scikit-fdiff) (3.0.9)
Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.9/site-packages (from matplotlib->scikit-fdiff) (0.11.0)
Requirement already satisfied: kiwisolver>=1.3.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib->scikit-fdiff) (1.4.2)
Requirement already satisfied: path in /opt/conda/lib/python3.9/site-packages (from path.py->scikit-fdiff) (17.1.0)
Requirement already satisfied: zict in /opt/conda/lib/python3.9/site-packages (from streamz->scikit-fdiff) (3.0.0)
Requirement already satisfied: six in /opt/conda/lib/python3.9/site-packages (from streamz->scikit-fdiff) (1.16.0)
Requirement already satisfied: tornado in /opt/conda/lib/python3.9/site-packages (from streamz->scikit-fdiff) (6.4.2)
Requirement already satisfied: setuptools in /opt/conda/lib/python3.9/site-packages (from streamz->scikit-fdiff) (62.2.0)
Requirement already satisfied: zipp>=0.5 in /opt/conda/lib/python3.9/site-packages (from importlib-metadata>=4.13.0->dask->scikit-fdiff) (3.8.0)
Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.9/site-packages (from pandas>=0.20.0->holoviews->scikit-fdiff) (2022.1)
Requirement already satisfied: tzdata>=2022.1 in /opt/conda/lib/python3.9/site-packages (from pandas>=0.20.0->holoviews->scikit-fdiff) (2024.1)
Collecting bokeh<2.5.0,>=2.4.0
  Downloading https://mirrors.ustc.edu.cn/pypi/packages/15/06/706a9c43436cd0c3e2f4b94e93ae837e74965e59565c596b727974a74169/bokeh-2.4.3-py3-none-any.whl (18.5 MB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m18.5/18.5 MB[0m [31m79.2 MB/s[0m eta [36m0:00:00[0m00:01[0m00:01[0m
[?25hRequirement already satisfied: typing-extensions in /opt/conda/lib/python3.9/site-packages (from panel>=0.13.1->holoviews->scikit-fdiff) (4.7.1)
Requirement already satisfied: requests in /opt/conda/lib/python3.9/site-packages (from panel>=0.13.1->holoviews->scikit-fdiff) (2.27.1)
Requirement already satisfied: pyct>=0.4.4 in /opt/conda/lib/python3.9/site-packages (from panel>=0.13.1->holoviews->scikit-fdiff) (0.5.0)
Requirement already satisfied: markdown in /opt/conda/lib/python3.9/site-packages (from panel>=0.13.1->holoviews->scikit-fdiff) (3.5.2)
Requirement already satisfied: bleach in /opt/conda/lib/python3.9/site-packages (from panel>=0.13.1->holoviews->scikit-fdiff) (5.0.0)
Requirement already satisfied: locket in /opt/conda/lib/python3.9/site-packages (from partd>=1.2.0->dask->scikit-fdiff) (1.0.0)
Requirement already satisfied: Jinja2>=2.9 in /opt/conda/lib/python3.9/site-packages (from bokeh<2.5.0,>=2.4.0->panel>=0.13.1->holoviews->scikit-fdiff) (3.1.2)
Requirement already satisfied: webencodings in /opt/conda/lib/python3.9/site-packages (from bleach->panel>=0.13.1->holoviews->scikit-fdiff) (0.5.1)
Requirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.9/site-packages (from requests->panel>=0.13.1->holoviews->scikit-fdiff) (2024.2.2)
Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.9/site-packages (from requests->panel>=0.13.1->holoviews->scikit-fdiff) (3.3)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/conda/lib/python3.9/site-packages (from requests->panel>=0.13.1->holoviews->scikit-fdiff) (1.26.9)
Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.9/site-packages (from requests->panel>=0.13.1->holoviews->scikit-fdiff) (2.0.12)
Requirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.9/site-packages (from Jinja2>=2.9->bokeh<2.5.0,>=2.4.0->panel>=0.13.1->holoviews->scikit-fdiff) (2.1.1)
Installing collected packages: bokeh
  Attempting uninstall: bokeh
    Found existing installation: bokeh 3.4.3
    Uninstalling bokeh-3.4.3:
      Successfully uninstalled bokeh-3.4.3
[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
jupyter-bokeh 4.0.5 requires bokeh==3.*, but you have bokeh 2.4.3 which is incompatible.[0m[31m
[0mSuccessfully installed bokeh-2.4.3

模型设置

以下是一个使用Scikit-fdiff求解二维浅水方程的完整示例:

代码语言:javascript
代码运行次数:0
运行
复制
from skfdiff import Model, Simulation
import pylab as pl
import numpy as np
from scipy.signal.windows import gaussian

# 定义模型
model = Model(["-(dx((H + h) * u) + dy((H + h) * v))",
               "-(u * dxu + v * dyu) - g * dxh + nu * (dxxu + dyyu)",
               "-(u * dxv + v * dyv) - g * dyh + nu * (dxxv + dyyv)"],
               ["h(x, y)", "u(x, y)", "v(x, y)"],
               parameters=["H(x, y)", "nu", "g"],
               boundary_conditions="periodic")

设置初始条件

代码语言:javascript
代码运行次数:0
运行
复制
L = 10
x = y = np.linspace(-L / 2, L / 2, 56)
xx, yy = np.meshgrid(x, y, indexing="ij")
h = (gaussian(x.size, x.size // 20)[:, None] *
     gaussian(y.size, y.size // 20)[None, :]) + 1
h = np.roll(h, 12, axis=0)
h = np.roll(h, 12, axis=1)
H = np.zeros_like(h)
u = np.zeros_like(h)
v = np.zeros_like(h)
initial_fields = model.Fields(x=x, y=y, h=h, u=u, v=v,
                              H=H, g=9.81, nu=0)

运行模拟

代码语言:javascript
代码运行次数:0
运行
复制
simulation = Simulation(model, initial_fields, dt=.1, tmax=1)
container = simulation.attach_container()
tmax, final_fields = simulation.run()
代码语言:javascript
代码运行次数:0
运行
复制
79f1a7 running: t: 1: : 10it [00:09,  1.09it/s]                        

可视化结果

代码语言:javascript
代码运行次数:0
运行
复制
import matplotlib.pyplot as plt
# 使用 matplotlib 可视化结果
plt.figure(figsize=(10, 8))

# 绘制高度场 h
plt.subplot(2, 2, 1)
plt.contourf(xx, yy, container.data.h[-1], levels=50, cmap='viridis')
plt.colorbar(label='Height (h)')
plt.title('Height Field (h)')
plt.xlabel('x')
plt.ylabel('y')

# 绘制速度场 u
plt.subplot(2, 2, 2)
plt.contourf(xx, yy, container.data.u[-1], levels=50, cmap='plasma')
plt.colorbar(label='Velocity (u)')
plt.title('Velocity Field (u)')
plt.xlabel('x')
plt.ylabel('y')

# 绘制速度场 v
plt.subplot(2, 2, 3)
plt.contourf(xx, yy, container.data.v[-1], levels=50, cmap='plasma')
plt.colorbar(label='Velocity (v)')
plt.title('Velocity Field (v)')
plt.xlabel('x')
plt.ylabel('y')

# 绘制总速度场 magnitude
speed = np.sqrt(container.data.u[-1]**2 + container.data.v[-1]**2)
plt.subplot(2, 2, 4)
plt.contourf(xx, yy, speed, levels=50, cmap='inferno')
plt.colorbar(label='Speed Magnitude')
plt.title('Speed Magnitude')
plt.xlabel('x')
plt.ylabel('y')

plt.tight_layout()
plt.show()

总结

Scikit-fdiff是一个强大的工具,特别适用于模型原型设计和刚性问题的求解。尽管它在处理复杂几何域时存在局限性,但对于简单几何域的问题,它能够提供快速且准确的解决方案。如果你正在寻找一个能够快速验证模型的工具,Scikit-fdiff无疑是一个值得尝试的选择。

参考

  • Scikit-fdiff官方文档
  • Scikit-fdiff GitHub仓库
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气python风雨 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Scikit-fdiff | 二维浅水方程计算与可视化
    • 引言
    • Scikit-fdiff的核心特点
    • 适用场景
    • 安装
    • 模型设置
    • 设置初始条件
    • 运行模拟
    • 可视化结果
    • 总结
    • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档