PaddlePaddle/PaddleScience

【快乐开源】完善PaddleScience对符号计算(symbolic computation)功能的支持

HydrogenSulfate opened this issue · 1 comments

This project will be mentored by @HydrogenSulfate

背景

符号计算又称计算机代数计算,通俗地说就是用计算机推导数学公式,如对表达式进行因式分解、化简、微分、积分、解代数方程、求解常微分方程等。PaddleScience 目前的方程计算路径主要通过用户传递 Equation 下子类内置的 python function,或者手写的 python function,这种方式虽然给用户带来了较高的方程构造自由度,但损失了简便性和可读性,用户需要手写完整的 python 代码,从接受输入,到计算所有的中间变量,最后返回计算结果。下面通过一个简单的例子来说明符号计算和手写 python 代码的区别,假设我们需要计算如下一条比较复杂的表达式:

$$ navier_{x} = \rho(\dfrac{\partial^2 u}{\partial t^2}) - (\lambda + \mu)(\dfrac{\partial^2 u}{\partial x^2}+\dfrac{\partial^2 v}{\partial y \partial x} + \dfrac{\partial^2 w}{\partial z \partial x}) - \mu(\dfrac{\partial^2 u}{\partial x^2} + \dfrac{\partial^2 u}{\partial y^2} + \dfrac{\partial^2 u}{\partial z^2}) $$

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)

使用符号计算,除了上述优点,还有以下优势:

  1. 借助第三方库 latex2sympy,可直接将 latex 代码转换成 sympy 表达式,降低用户使用 sympy 的门槛
  2. sympy 公式也可以转换成 latex 代码,如下所示
    image
  3. sympy 公式可以在 notebook 中可视化,在终端以 Unicode 可视化,如下所示
    image
    image

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. 参考资料

奖励

800 京东卡

close due the following PR is merged: