簡體   English   中英

用python計算復雜的數學方程式

[英]Computing complex math equations in python

是否有任何簡化計算方程式的庫或技術?

采取以下兩個示例:

  • 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 =向量[[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)中提取數據,並將結果輸出到數據庫中。 一切都搞清楚了。 我只是在努力評估方程本身。

謝謝 :)

要對兩個具有相同維數的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])

那應該讓您開始。

此類任務的常見解決方案是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的所有P_i_j的和,而Aj是所有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教程

順便說一句,有兩個數學模塊,nzmath和mpmath,比Carter擁有肝葯的東西更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM