%matplotlib inline
在科学计算和工程领域,偏微分方程(PDE)的求解一直是一个复杂且耗时的任务。Scikit-fdiff是一个旨在简化这一过程的Python库,它通过有限差分法(Finite Difference Method)来离散化空间导数,并结合方法线(Method of Lines)将PDE转化为高维常微分方程(ODE),从而利用标准的ODE数值积分方法进行求解。
Scikit-fdiff适用于以下场景:
Scikit-fdiff可以通过PyPI和Conda安装:
!pip install scikit-fdiff -i https://pypi.mirrors.ustc.edu.cn/simple/
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求解二维浅水方程的完整示例:
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")
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)
simulation = Simulation(model, initial_fields, dt=.1, tmax=1)
container = simulation.attach_container()
tmax, final_fields = simulation.run()
79f1a7 running: t: 1: : 10it [00:09, 1.09it/s]
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无疑是一个值得尝试的选择。