【快乐开源】完善PaddleScience对符号计算(symbolic computation)功能的支持
HydrogenSulfate opened this issue · 1 comments
This project will be mentored by @HydrogenSulfate
背景
符号计算又称计算机代数计算,通俗地说就是用计算机推导数学公式,如对表达式进行因式分解、化简、微分、积分、解代数方程、求解常微分方程等。PaddleScience 目前的方程计算路径主要通过用户传递 Equation 下子类内置的 python function,或者手写的 python function,这种方式虽然给用户带来了较高的方程构造自由度,但损失了简便性和可读性,用户需要手写完整的 python 代码,从接受输入,到计算所有的中间变量,最后返回计算结果。下面通过一个简单的例子来说明符号计算和手写 python 代码的区别,假设我们需要计算如下一条比较复杂的表达式:
1.1 Python Function
目前 PaddleScience 使用手写 python function,如下所示,可以看到整体流程比较繁琐。会出现无法避免的if-else判断,容易出现不小心写错的情况,可读性差
# step1. 手写 python function
def navier_x_compute_func(out):
x, y, u, v = (
out["x"],
out["y"],
out["u"],
out["v"],
)
duxvywz = jacobian(u, x) + jacobian(v, y)
duxxuyyuzz = hessian(u, x) + hessian(u, y)
if self.dim == 3:
z, w = out["z"], out["w"]
duxvywz += jacobian(w, z)
duxxuyyuzz += hessian(u, z)
navier_x = (
-(self.lambda_ + self.mu) * jacobian(duxvywz, x) - self.mu * duxxuyyuzz
)
if self.time:
t = out["t"]
navier_x += rho * hessian(u, t)
return navier_x
# step2. 传入必要的数据,计算方程结果
out = {....}
navier_x_value = navier_x_compute_func(out)
1.2 Sympy 符号计算
在使用符号计算的情况下,结构更加清晰,可读性大大增强,并且支持公式打印,不容易写错
# step1. 定义 navier_x 的符号化公式
navier_x = (
rho * ((u.diff(t)).diff(t))
- (lambda_ + mu) * (u.diff(x) + v.diff(y) + w.diff(z)).diff(x)
- mu * ((u.diff(x)).diff(x) + (u.diff(y)).diff(y) + (u.diff(z)).diff(z))
)
# 将符号计算公式转换成 function,这一步由代码内部完成,不需要用户转换
navier_x_compute_func = symbolic_to_function(navier_x)
# step2. 传入必要的数据,计算方程结果
out = {....}
navier_x_value = navier_x_compute_func(out)
使用符号计算,除了上述优点,还有以下优势:
- 借助第三方库 latex2sympy,可直接将 latex 代码转换成 sympy 表达式,降低用户使用 sympy 的门槛
- sympy 公式也可以转换成 latex 代码,如下所示
- sympy 公式可以在 notebook 中可视化,在终端以 Unicode 可视化,如下所示
2. 收益
2.1 开发者个人收益
- 从 Sympy(github 11.1K star) 入手,了解、熟悉符号计算
- 了解符号计算和数值计算在计算机中的结合方式,以符号计算指导数值计算的过程
2.2 PaddleScience 收益
- 提升 Equation 模块的可读性
- 在支持 python func 的基础上,同时支持 sympy 表达式
3. 开发流程
3.1 安装 PaddleScience
下载安装 PaddleScience 套件:https://paddlescience-docs.readthedocs.io/zh/latest/zh/install_setup/#121-git
注:本任务不涉及复杂几何,因此不需要安装 pymesh、open3d 等安装文档中提及的可选安装包
3.2 代码开发
参考 sympy to func project 设计方案进行开发
3.3 整理代码并提交PR
参考 PaddleScience文档-贡献指南-整理代码并提交
4. 参考资料
- 【SymPy】(一)SymPy简介_二进制人工智能的博客-CSDN博客
- https://www.jc2182.com/sympy/sympy-jiaocheng.html
- https://docs.sympy.org/latest/index.html
奖励
800 京东卡