如何在Python中使用循环中的收敛条件来更新矩阵
我有一个原始矩阵如何在Python中使用循环中的收敛条件来更新矩阵,python,loops,numpy,matrix,convergence,Python,Loops,Numpy,Matrix,Convergence,我有一个原始矩阵 originalOD = np.array([[1,2,4], [3,2,3], [4,2,2]]) #### Now we can sum productions and attractions#### originalD=np.sum(originalOD,axis=0) originalO=np.sum(originalOD,axis=1) 并希望将“原创”和“原创”融合到: targetD=np.array([16,9,9]) targetO=np.array([1
originalOD = np.array([[1,2,4], [3,2,3], [4,2,2]])
#### Now we can sum productions and attractions####
originalD=np.sum(originalOD,axis=0)
originalO=np.sum(originalOD,axis=1)
并希望将“原创”和“原创”融合到:
targetD=np.array([16,9,9])
targetO=np.array([14,8,12])
我正尝试使用一些收敛条件在循环中执行此操作:
Convergence=0
while True:
xD=targetD/originalD
newOD=originalOD*xD
newD=np.sum(newOD,axis=0)
xO=targetO/originalO
newOD=originalOD*xO
newO=np.sum(newOD,axis=1)
Convergence = (sum(newO)/sum(targetO)+sum(newD)/sum(targetD))/2
print('Converged:', Convergence)
if Convergence<1.01 and Convergence>0.99:
break
else:
continue
关于代码中要更改的内容有什么想法吗?看起来您无法更新while循环中的矩阵(OD)以及起点和终点总计,因此当前在每个循环中,您只是应用从原始矩阵导出的相同因子。请尝试以下操作:
newOD=originalOD
newD=np.sum(newOD,axis=0)
newO=np.sum(newOD,axis=1)
Convergence=0
while True:
xD=targetD/newD
newOD=newOD*xD
newD=np.sum(newOD,axis=0)
xO=targetO/newO
newOD=newOD*xO
newO=np.sum(newOD,axis=1)
Convergence = (sum(newO)/sum(targetO)+sum(newD)/sum(targetD))/2
print('Converged:', Convergence)
if Convergence<1.01 and Convergence>0.99:
break
else:
continue
newOD=originalOD
newD=np.sum(newOD,轴=0)
newO=np.和(newOD,轴=1)
收敛=0
尽管如此:
xD=targetD/newD
newOD=newOD*xD
newD=np.sum(newOD,轴=0)
xO=目标/新目标
newOD=newOD*xO
newO=np.和(newOD,轴=1)
收敛=(求和(newO)/求和(targetO)+求和(newD)/求和(targetD))/2
打印('聚合:',聚合)
如果收敛0.99:
打破
其他:
持续
您可能还想考虑将最大迭代次数添加到计算中,因为Furess不能保证收敛,尤其是如果您有稀疏矩阵。
您的收敛措施没有使用循环中正在更改的任何内容。所以他们也不是changing@KPLauritzen谢谢-这是一句很有帮助的话!我现在已经修改了,但仍然无法更改后续循环中的任何内容。您使用循环进行此操作有什么原因吗?@MadPhysicast谢谢!是-我有一个区域之间的行程矩阵(即originalOD),我还知道从区域到区域的总行程是多少,即targetD和targetO。这就是为什么我试图修改原始矩阵,使其能够匹配目标值。newOD=originalOD
newD=np.sum(newOD,axis=0)
newO=np.sum(newOD,axis=1)
Convergence=0
while True:
xD=targetD/newD
newOD=newOD*xD
newD=np.sum(newOD,axis=0)
xO=targetO/newO
newOD=newOD*xO
newO=np.sum(newOD,axis=1)
Convergence = (sum(newO)/sum(targetO)+sum(newD)/sum(targetD))/2
print('Converged:', Convergence)
if Convergence<1.01 and Convergence>0.99:
break
else:
continue