我想把这个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)
1条答案
按热度按时间cygmwpex1#
让我们比较
HW=1
上的迭代。如果当前行(行号为2)的Gap_K<0.01(J2中的公式),则验证验证代码。
Py代码尝试验证
Item of Gap_K list<0.01
,Gap_K
列表中有4个项目。