Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用循环中的收敛条件来更新矩阵_Python_Loops_Numpy_Matrix_Convergence - Fatal编程技术网

如何在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