Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
HydrogenSulfate opened this issue Jul 21, 2023 · 1 comment
Assignees

Comments

@HydrogenSulfate
Copy link
Collaborator

HydrogenSulfate commented Jul 21, 2023

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 京东卡

@luotao1
Copy link
Collaborator

luotao1 commented Aug 30, 2023

close due the following PR is merged:

@luotao1 luotao1 closed this as completed Aug 30, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Development

No branches or pull requests

2 participants