You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VBA转Python:数组嵌套迭代问题求助(代码结果不一致)

K因子迭代代码:VBA转Python的逻辑差异排查

我需要将一段实现K因子迭代的VBA代码转换为Python,但嵌套循环逻辑上出现问题,导致Python代码运行结果与原VBA代码不一致。以下是原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:取水口编号(Headwork number)
  • QL:原始数据
  • QA:剩余水量,计算公式为当前QL与上一轮QS之和(QA = QL + QS)
  • QD:原始数据
  • K:迭代使用的K因子,范围从1到0.2,步长0.01
  • QR:取水口取水量,取K*QD与QA的最小值
  • QS:QA与QR的差值(QS = QA - QR)
  • K_real:实际K值,计算公式为QR / QD
  • Gap_K:当前K_real与上一轮K_real的差值,反映K_real变化量
  • Status_Gap:迭代收敛状态,若Gap_K ≤ 0.01则为1,否则为0

我编写的Python代码

def calculate_water_flow(QL, QD, K):
    num_HW = len(QL)
    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)

内容的提问来源于stack exchange,提问作者Muhammad Kafiansyah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 20:22:14