跳转至

缩短编译时间

接收符号表达式的方法会先求导,再用 Numba 编译向量化的函数值、梯度和 Hessian。 当表达式图很大时,这一步可能比数值求解本身更耗时。只修改边界常数或网格时,通常 不需要重新编译所有函数。

使用便于编译的表达式

  • 除非实测证明 SymPy 化简能缩小特定表达式,否则保持 simplify=False;化简本身 也可能很耗时;
  • 优先使用 x * x 或 x ** 2 这类普通代数表达式,不要间接调用 pow(x, 2.0);
  • 在不损害可读性的前提下整理重复子表达式,没有数值理由时不要盲目展开紧凑公式。

复用已经配置的函数

各个 set_* 方法彼此解耦。例如,更换边界条件后不需要再次调用 set_dynamics。 若阶段已经通过 System.set_phase 加入系统,修改阶段后调用一次 System.update() 即可刷新系统层索引和导数数据;该操作远快于重新编译无关的符号函数。

缓存生成的函数

  1. 为一个确定的模型配置创建专用缓存目录。
  2. 把目录路径传给相应的 cache 参数:
phase.set_dynamics(..., cache="./cache/my_model")

支持缓存的方法包括 Phase.set_dynamics、Phase.set_integral、 Phase.set_phase_constraint、Phase.set_boundary_condition、 System.set_objective 和 System.set_system_constraint。

缓存只对应一个确定模型

修改表达式、符号顺序、导数选项或其他会影响生成函数的输入后,不要继续复用原缓存。 应改用独立目录或重新生成缓存。过期函数可能对错误模型给出表面上合理的数值结果。

自定义生成函数及其稀疏导数布局见跳过符号微分。