计算python中的复杂数学方程

时间:2010-05-26 11:33:35

标签: python math numpy equation

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

采取以下两个例子:

  • F = B * {[a * b * sumOf(所有i''的A / B'')] / [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到j = n]

    其中:

    n是区域数

    T = vector [[1,2,A_1_2,P_1_2],...,[i,j,A_i_j,P_i_j]]

    F = vector [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 个答案:

答案 0 :(得分:4)

对两个具有相同维度的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])

这应该让你开始。

答案 1 :(得分:3)

此类任务的常见解决方案是NumPy

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

以下是基于您想要的示例:

  

T_ij = [P_i * A_i * F_i_j] / [   SumOf [Aj * F_i_j] // j = 1到j = n   ]

     

其中:          n是区域数

     

T = vector [[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都是   所有我的所有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

答案 2 :(得分:3)

顺便提一下,有几个数学模块,nzmath和mpmath 比卡特有肝丸更多的东西。

LL