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

问题描述 投票:0回答:1

我想把这个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 是上一次迭代中 QL 和 QS 的总和 (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 与当前迭代的 K_real 之间的差异。 Gap_K表示K_real的变化。
  • Status_Gap:间隙状态,显示Gap_K是否小于或 等于0.01。如果间隙_K <= 0.01, then Status_Gap is 1; otherwise, Status_Gap is 0. Status_Gap indicates whether the iteration is approaching convergence.

这是我的 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 loops nested-loops
1个回答
0
投票
  • VBA 和 Python 代码有不同的逻辑。

我们来比较一下

HW=1
上的交互。

VBA 代码验证 Gap_K <0.01 (formula in J2) for current row (row# is 2).

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

Py 代码尝试验证

Item of Gap_K list<0.01
Gap_K
列表中有 4 项。

while any(gap > 0.01 for gap in Gap_K)
© www.soinside.com 2019 - 2024. All rights reserved.