缩短编译时间¶
接收符号表达式的方法会先求导,再用 Numba 编译向量化的函数值、梯度和 Hessian。 当表达式图很大时,这一步可能比数值求解本身更耗时。只修改边界常数或网格时,通常 不需要重新编译所有函数。
使用便于编译的表达式¶
- 除非实测证明 SymPy 化简能缩小特定表达式,否则保持
simplify=False;化简本身 也可能很耗时; - 优先使用
x * x或x ** 2这类普通代数表达式,不要间接调用pow(x, 2.0); - 在不损害可读性的前提下整理重复子表达式,没有数值理由时不要盲目展开紧凑公式。
复用已经配置的函数¶
各个 set_* 方法彼此解耦。例如,更换边界条件后不需要再次调用 set_dynamics。
若阶段已经通过 System.set_phase 加入系统,修改阶段后调用一次 System.update()
即可刷新系统层索引和导数数据;该操作远快于重新编译无关的符号函数。
缓存生成的函数¶
- 为一个确定的模型配置创建专用缓存目录。
- 把目录路径传给相应的
cache参数:
支持缓存的方法包括 Phase.set_dynamics、Phase.set_integral、
Phase.set_phase_constraint、Phase.set_boundary_condition、
System.set_objective 和 System.set_system_constraint。
缓存只对应一个确定模型
修改表达式、符号顺序、导数选项或其他会影响生成函数的输入后,不要继续复用原缓存。 应改用独立目录或重新生成缓存。过期函数可能对错误模型给出表面上合理的数值结果。
自定义生成函数及其稀疏导数布局见跳过符号微分。