VBA 到 Python 用于数组和嵌套迭代

VBA to Python for array and nested iteration

提问人:Muhammad Kafiansyah 提问时间:10/13/2023 最后编辑:Kostas NitafMuhammad Kafiansyah 更新时间:10/14/2023 访问量:60

问:

我想将这个 vba 代码制作成 python,但我陷入了嵌套循环。这是 vba 代码和结果

表公式

Sub iter_K()

num_HW = 4


For i = 1 To num_HW
    For k = 1 To 0.01 Step -0.01
        Range(Cells(1 + i, 5), Cells(1 + num_HW, 5)) = k
        'Cells(1 + i, 5) = k
        status_gap = Cells(1 + i, 10)
        If status_gap = 1 Then Exit For
    Next k
Next i


End Sub

以下是表中各列的说明:

  • HW:头工作号。
  • QL:数据。
  • QA:最终数量,表示每个中的剩余数量 迭 代。QA 是上一次迭代 (QA = QL + QS)。
  • QD:数据。
  • K:每次迭代中使用的 K 因子。K 范围为 1 至 0.2 英寸 每次迭代的步长为 0.01。
  • QR:K*QD和QA之间的最小值,表示多少 由HW拍摄。
  • QS:QA和QR的区别(QS=QA-QR)。
  • K_real:(K_real = QR/QD)。
  • Gap_K:上一次迭代与当前迭代的K_real差。Gap_K表示K_real的变化。
  • Status_Gap:差距状态,显示Gap_K是否小于或 等于 0.01。如果 Gap_K <= 0.01,则 Status_Gap 为 1;否则 Status_Gap为 0。Status_Gap指示迭代是否为 接近收敛。

这是我的 python 代码,但它没有返回与 vba 脚本相同的结果:

def calculate_water_flow(QL, QD, K):
    num_HW = len(QL)
    n = 1
    QA = []
    QR = []
    QS = []
    K_real = []
    Gap_K = []

    for i in range(0, num_HW):
        if i == 0:
            qa = QL[i]
        else:
            qa = QL[i] + (QS[i - 1] if i >= 1 else 0)
        QA.append(qa)

        qr = min(K * QD[i], qa)
        QR.append(qr)

        qs = qa - qr
        QS.append(qs)

        k_real = qr / QD[i]
        K_real.append(k_real)

    Gap_K = [0] + [K_real[i] - K_real[i - 1] for i in range(1, num_HW)]

    return QA, QR, QS, K_real, Gap_K

def print_results(QA, QR, QS, K_real, Gap_K, iterations):
    num_HW = len(QA)

    print("HW\tQL\tQA\tQD\tK\tQR\tQS\tK_real\tGap_K\tStatus_Gap")
    for i in range(num_HW):
        status_gap = 1 if Gap_K[i] <= 0.01 else 0
        print(f"{i + 1}\t{QL[i]}\t{QA[i]:.2f}\t{QD[i]}\t{K:.2f}\t{QR[i]:.2f}\t{QS[i]:.2f}\t{K_real[i]:.2%}\t{Gap_K[i]:.2%}\t{status_gap}")
    
    print(f"Total iterations: {iterations}")

if __name__ == "__main__":
    QL = [50, 30, 80, 60]
    QD = [100, 150, 120, 80]
    K = 1  
    iteration = 0  

    QA, QR, QS, K_real, Gap_K = calculate_water_flow(QL, QD, K)
    while any(gap > 0.01 for gap in Gap_K):
        iteration += 1
        K -= 0.01
        if K < 0.01:
            K = 0.01
        QA, QR, QS, K_real, Gap_K = calculate_water_flow(QL, QD, K)
    
    print_results(QA, QR, QS, K_real, Gap_K, iteration)


Python Excel VBA 嵌套循环

评论

6赞 Some programmer dude 10/13/2023
OT:请注意,用大写字母书写,即使是标题,也被认为是大喊大叫。对你想帮助你的人大喊大叫是非常不礼貌的。
0赞 Muhammad Kafiansyah 10/16/2023
好吧,对不起伙计们;)

答:

0赞 taller 10/14/2023 #1
  • VBA 和 Python 代码具有不同的逻辑。

让我们比较一下 上的迭代。HW=1

VBA代码验证当前行(row#为2)的Gap_K<0.01(J2中的公式)。

            status_gap = Cells(1 + i, 10)
            If status_gap = 1 Then
                Exit For
            End If

Py代码尝试验证,列表中有4个项目。Item of Gap_K list<0.01Gap_K

while any(gap > 0.01 for gap in Gap_K)