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
相关产品推荐
相关产品推荐

