将数组和嵌套迭代转换为Python

ajsxfq5m  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(82)

我想把这个vba代码变成python,但是我陷入了嵌套循环。下面是vba代码和结果

表格公式x1c 0d1x:

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:Headwork编号。
  • 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_真实的:(K_真实的= QR / QD)。
  • Gap_K:前一次迭代和当前迭代的K_真实的之间的差异。Gap_K表示K_真实的的变化。
  • 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)
cygmwpex

cygmwpex1#

  • Python和Python代码有不同的逻辑。

让我们比较HW=1上的迭代。
如果当前行(行号为2)的Gap_K<0.01(J2中的公式),则验证验证代码。

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

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

while any(gap > 0.01 for gap in Gap_K)

相关问题