【问题标题】:Computing complex math equations in python在 python 中计算复杂的数学方程
【发布时间】:2010-05-26 11:33:35
【问题描述】:

是否有任何库或技术可以简化计算方程?

举以下两个例子:

  • F = B * { [ a * b * sumOf (A / B ''' for all i ''' ) ] / [ sumOf(c * d * j) ] }

    地点:

    F = 从 i 到 j 的成本

    B、a、b、c、d、j 都是格式为 [ [zone_i, zone_j, cost_of_i_to_j], [..]] 的向量

    这应该产生一个向量 F [ [1,2, F_1_2], ..., [i,j, F_i_j] ]

  • T_ij = [ P_i * A_i * F_i_j] / [ SumOf [ Aj * F_i_j ] // j = 1 to 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 将是所有 P_i_j 对于所有 j 的总和,Aj 将是所有 P_j 对于所有 i 的总和

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

计算一些因子,比如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)中提取数据并将结果输出到数据库中。这一切都想通了。我只是在努力评估方程式本身。

谢谢:)

【问题讨论】:

    标签: python math numpy equation


    【解决方案1】:

    要对两个具有相同维度的 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】:

      此类任务的常见解决方案是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], ..., [i, j, A_i_j, P_i_j] ]

      F = 向量 [1, 2, F_1_2], ..., [i, j, F_i_j]

      所以 P_i 将是所有的总和 所有 j 和 Aj 的 P_i_j 将是 所有 i 的所有 P_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 来说,您正在努力实现的目标确实是一份理想的工作。如果你准备好学习这个工具,我建议你去Numpy tutorial

      【讨论】:

      • 你能举一个简单的例子来说明如何计算 A_1,2 = P_1 / [sumOF (A_j * F_1,2) ]。我以前研究过 numpy,但我不知道如何进行这种类型的计算
      【解决方案3】:

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

      LL

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-20
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多