跳转至

缩短编译时间

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

使用便于编译的表达式

  • 除非实测证明 SymPy 化简能缩小特定表达式,否则保持 simplify=False;化简本身 也可能很耗时;
  • 优先使用 x * xx ** 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_dynamicsPhase.set_integralPhase.set_phase_constraintPhase.set_boundary_conditionSystem.set_objectiveSystem.set_system_constraint

缓存只对应一个确定模型

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

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