首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少字符数据转换为数值数据的时间

减少字符数据转换为数值数据的时间
EN

Stack Overflow用户
提问于 2022-06-01 17:41:26
回答 1查看 58关注 0票数 0

在用牛顿法在python和simpi上解决一个问题的过程中,我遇到了一个不愉快的情况。在这个问题中,在符号形式上,借助于simpi,生成一个方程组,方程的数目取决于一定的参数n,然后计算雅可比,也算出符号形式,然后把雅可比中的变量的值向量替换成这个符号雅可比。由符号Jacobian对数值Jacobian的计算如下:

代码语言:javascript
复制
matrix_jacobian_analitic_view=matrix_jacobian.subs(value_vector_var) . 

另外,为了完成这项任务,我制作了一个时间传感器,其结果被记录在熊猫的数据中。从这个计时器中,我看到计算中最大的时间花在计算数值雅可比上。Simpy会拒绝这项任务,我不能。因此,我要求你们告诉我一种减少计算雅可比数值的时间的方法。

EN

回答 1

Stack Overflow用户

发布于 2022-06-04 18:41:32

@hpauli和Oscar Benjamin,你好。我找到了一种加速计算雅可比数值的方法。没有任何鞭打。解决办法是:

  1. I遍历符号Jacobian矩阵中的每一行,之前将渐近矩阵转换为numpy矩阵:

matrix_jacobian_np=np.array(matrix2numpy(matrix_jacobian)),

然后在循环中

代码语言:javascript
复制
    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)

在队伍中:

代码语言:javascript
复制
    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)”我用它的值代替了变量:

代码语言:javascript
复制
    jac_i=jac_i.subs(value_vector_var_new)

在原始的渐近矩阵= matrix_jacobian中进行替换:

代码语言:javascript
复制
    matrix_jacobian[i_jac_shape,:]=jac_i[0,:]

在这一点上,上述循环结束。

  1. 将渐近矩阵= matrix_jacobian转换为numpy矩阵:

matrix_jacobian_analitic_view=np.array(matrix2numpy(matrix_jacobian),dtype='float32')

结果表明,第一次迭代的数值雅可比计算时间为~= 37秒,下一次迭代的数值雅可比计算时间为~= 10秒,利用上述程序给出的计算时间~=2.0-2.5秒。

P.S.一段时间前出现了一个非常奇怪的故事:让下面的一组变量出现在象征性的Jacobian中:

代码语言:javascript
复制
    vector_var_jacobian=[T1,T2,T3,y1,y2,y3]

这些变量的值向量是(例如):

代码语言:javascript
复制
    vector_var_value=[1,2,15,10,5,4,3,6,7,8]

在变量集上指定的vector_var_value

代码语言:javascript
复制
    vector_var_system_equations=[T0,T1,T2,T3,y0,y1,y2,y3,y4]

现在,如果不采取初步行动,做手术:

代码语言:javascript
复制
    value_vector_var_new=list(zip_longest(vector_var_jacobian,vector_var_value, fillvalue='-'))

代码语言:javascript
复制
    matrix_jacobian=matrix_jacobian.subs(value_vector_var_new)

然后,而不是使用正确的值集执行.subs操作

代码语言:javascript
复制
    vector_var_value=[2,15,10,3,6,7]

对于Jacobian中的一组变量:

代码语言:javascript
复制
    vector_var_jacobian=[T1,T2,T3,y1,y2,y3]

渐近将使用一组值执行.subs操作:

代码语言:javascript
复制
    vector_var_value=[1,2,15,10,5,4]

对于符号Jacobian中的一组变量矩阵:

代码语言:javascript
复制
    vector_var_jacobian=[T1,T2,T3,y1,y2,y3]

自然地,在算法的作用下,得到了错误的雅可比矩阵(以数值形式)。

我认为,关于符号表达式中数字的替换的书面文章将是有用的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72466015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档