代码之家  ›  专栏  ›  技术社区  ›  dassouki

用python计算复杂的数学方程

  •  1
  • dassouki  · 技术社区  · 16 年前

    有没有简化计算公式的库或技术?

    举两个例子:

    • f=b*[a*b*sumof(a/b'''表示所有i'')]/[sumof(c*d*j)]

      在哪里?

      F=从I到J的成本

      b,a,b,c,d,j都是格式为[[区域i,区域j,成本_i到j],[…]的向量。

      这将产生一个向量f[[1,2,f_1_2],…,[i,j,f_i_j]]

    • t ou i j=[p ou i*a ou i*f ou i ou j]/[sumof[a j*f ou i ou j]//j=1至j=n]

      在哪里?

      n是区域数

      t=向量[[1,2,a_1_2,p_1_2],…,[i,j,a_i_j,p_i_j]]

      f=矢量[1,2,f_1_2],…,[i,j,f_i_j]

      所以,p_i是所有j的p_i_j之和,aj是所有i的p_j之和。

    我不确定我在寻找什么,但也许是这些方程或方法的解析器来处理向量之间的多重乘法和积?

    为了计算一些因素,例如a_j,这是我使用的

    from collections import defaultdict
    
    A_j_dict = defaultdict(float)
    for A_item in TG: A_j_dict[A_item[1]] += A_item[3]
    

    虽然这很好,但我真的觉得这是一种蛮力/黑客方法,在我们想要添加更多变量或参数的情况下是无法维护的。你有什么数学公式解析器可以推荐吗?

    边注: 这些方程用于模拟旅行。目前,我使用Excel来解很多这些方程;我发现这个过程是令人生畏的。我宁愿转移到python,它直接从我们的数据库(postgres)中提取数据,并将结果输出到数据库中。所有的事情都解决了。我只是在努力评估方程本身。

    谢谢)

    3 回复  |  直到 11 年前
        1
  •  4
  •   dwf    16 年前

    要对两个具有相同维度的numpy数组进行元素相乘,只需“a*b”。

    In [1]: a = arange(50)
    
    In [2]: b = ones(50) * 2
    
    In [3]: a
    Out[3]: 
    array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
           17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
           34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49])
    
    In [4]: b
    Out[4]: 
    array([ 2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,
            2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,
            2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,
            2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.,  2.])
    
    In [5]: a * b
    Out[5]: 
    array([  0.,   2.,   4.,   6.,   8.,  10.,  12.,  14.,  16.,  18.,  20.,
            22.,  24.,  26.,  28.,  30.,  32.,  34.,  36.,  38.,  40.,  42.,
            44.,  46.,  48.,  50.,  52.,  54.,  56.,  58.,  60.,  62.,  64.,
            66.,  68.,  70.,  72.,  74.,  76.,  78.,  80.,  82.,  84.,  86.,
            88.,  90.,  92.,  94.,  96.,  98.])
    
    In [6]: (a * b).sum()
    Out[6]: 2450.0
    

    如果你能用矩阵乘法写东西,你可以用 dot() :

    In [7]: A = arange(25).reshape((5,5))
    
    In [8]: X = arange(5)
    
    In [9]: A
    Out[9]: 
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14],
           [15, 16, 17, 18, 19],
           [20, 21, 22, 23, 24]])
    
    In [12]: dot(A, X) # Sum_j A[i,j] * X[j] for all i
    Out[12]: array([ 30,  80, 130, 180, 230])
    

    你应该开始了。

        2
  •  3
  •   Eric O. Lebigot    16 年前

    这种任务的常见解决方案是 NumPy .

    你的方程看起来足够接近向量和矩阵方程,numpy的数组和矩阵应该非常有用。

    下面是一个基于所需内容的示例:

    T_Ij=[P_I*A_I*F_I_J],/[ sumof[aj*f_i_j]//j=1至j=n ]

    在哪里? n是区域数

    t=矢量[[1,2,a_1_2,p_1_2], ……

    f=向量[1,2,f_1_2],…,[i, J,Fiijj]

    所以我是所有人的总和 所有j和aj的p_i_j等于 为了我所有的人

    这可以通过以下方法计算:

    import numpy as np
    A = np.array([…]); P = np.array(…)  # Vectors (1D arrays)
    F = np.array([[…], […],…])  # 2D array
    T = (P*A*F.T).T/np.dot(F, A)
    

    您可以看到,由于numpy的存在,最终的结果以非常紧凑的形式表示。numpy数组计算也非常快。

    你想达到的目标对麻木的人来说真的是一份理想的工作。如果您准备好学习这个工具,我建议您通过 Numpy tutorial .

        3
  •  3
  •   Louis Lancton    14 年前

    顺便说一下,有几个数学模块,nzmath和mpmath 比卡特的肝药片还多。

    陆上通信线

    推荐文章