在用牛顿法在python和simpi上解决一个问题的过程中,我遇到了一个不愉快的情况。在这个问题中,在符号形式上,借助于simpi,生成一个方程组,方程的数目取决于一定的参数n,然后计算雅可比,也算出符号形式,然后把雅可比中的变量的值向量替换成这个符号雅可比。由符号Jacobian对数值Jacobian的计算如下:
matrix_jacobian_analitic_view=matrix_jacobian.subs(value_vector_var) . 另外,为了完成这项任务,我制作了一个时间传感器,其结果被记录在熊猫的数据中。从这个计时器中,我看到计算中最大的时间花在计算数值雅可比上。Simpy会拒绝这项任务,我不能。因此,我要求你们告诉我一种减少计算雅可比数值的时间的方法。
发布于 2022-06-04 18:41:32
@hpauli和Oscar Benjamin,你好。我找到了一种加速计算雅可比数值的方法。没有任何鞭打。解决办法是:
matrix_jacobian_np=np.array(matrix2numpy(matrix_jacobian)),
然后在循环中
while i_jac_shape<=(matrix_jac_np.shape[0]-1):
jac_i=matrix_jacobian[i_jac_shape,:]
symbols_jac_i=jac_i.free_symbols
symbols_jac_i=list(symbols_jac_i)
index_var,symbol_list=get_symbol_in_jac(symbols_jac_i,n)在队伍中:
get_symbol_in_jac(symbols_jac_i,n)我得到变量本身和索引,例如变量T4,index =4。在接收到变量及其索引之后,我得到了i-th近似值集( i-th近似值集= vector_var_value )的这个特定变量的值。此外,我处于上述循环“而i_jac_shape<=(矩阵_jac_np.form-1)”我用它的值代替了变量:
jac_i=jac_i.subs(value_vector_var_new)在原始的渐近矩阵= matrix_jacobian中进行替换:
matrix_jacobian[i_jac_shape,:]=jac_i[0,:]在这一点上,上述循环结束。
matrix_jacobian_analitic_view=np.array(matrix2numpy(matrix_jacobian),dtype='float32')
结果表明,第一次迭代的数值雅可比计算时间为~= 37秒,下一次迭代的数值雅可比计算时间为~= 10秒,利用上述程序给出的计算时间~=2.0-2.5秒。
P.S.一段时间前出现了一个非常奇怪的故事:让下面的一组变量出现在象征性的Jacobian中:
vector_var_jacobian=[T1,T2,T3,y1,y2,y3]这些变量的值向量是(例如):
vector_var_value=[1,2,15,10,5,4,3,6,7,8]在变量集上指定的vector_var_value
vector_var_system_equations=[T0,T1,T2,T3,y0,y1,y2,y3,y4]现在,如果不采取初步行动,做手术:
value_vector_var_new=list(zip_longest(vector_var_jacobian,vector_var_value, fillvalue='-'))和
matrix_jacobian=matrix_jacobian.subs(value_vector_var_new)然后,而不是使用正确的值集执行.subs操作
vector_var_value=[2,15,10,3,6,7]对于Jacobian中的一组变量:
vector_var_jacobian=[T1,T2,T3,y1,y2,y3]渐近将使用一组值执行.subs操作:
vector_var_value=[1,2,15,10,5,4]对于符号Jacobian中的一组变量矩阵:
vector_var_jacobian=[T1,T2,T3,y1,y2,y3]自然地,在算法的作用下,得到了错误的雅可比矩阵(以数值形式)。
我认为,关于符号表达式中数字的替换的书面文章将是有用的。
https://stackoverflow.com/questions/72466015
复制相似问题