为何数组迭代的时候参数u在更新,但是b一直不更新??实在不知道问题在哪


#1

在提问之前请确定你已经努力阅读了文档,并且尝试自己在互联网上搜索。

请尽可能提供你的demo代码或者GitHub的gist地址。

# code
```u = ones(npw)
 u = u/norm(u)
 b = u
 λ1 = 0.0
 erro = 1.0
 H, G, I = hamiltonian(atoms, model, v1, v2)
 # begin  iteration 
  while erro > 0.001
   H1 = zeros(npw,npw)
   v = zeros(4*mmax+1,4*mmax+1)
   for G1=1:npw,G2=1:npw 
      v[I[G1,1]-I[G2,1]+2*mmax+1,I[G1,2]-I[G2,2]+2*mmax+1] += b[G1]*b[G2]
   end
 # update Hamitonion
   for G1=1:npw,G2=1:npw
      H1[G1,G2] = H[G1,G2] + v[I[G1,1]-I[G2,1]+2*mmax+1,I[G1,2]-I[G2,2]+2*mmax+1]
   end
   D, Ψ =(eigen(H1)...,)
   λ = sort(D)[1:npw]
   erro = abs(λ[1]-λ1)
   println("the first eigenvalue is", λ[1])
   λ1 = λ[1]
   index = sortperm(D)[1]
   b = u
   u = Ψ[:,index]
  end

#2

你可能需要把你的示例代码再简化一下,现在这个样子其他人时跑不起来的,也就是复现不了你说的问题。

应该再把 bug 无关的的代码删一删,比如 hamiltonian 函数你并没有给出,如果它对 bug 的复现没影响就直接给定它的输出结果,也就是 H, G, I 的值就行了。代码里 npw, mmax 看上去也没有给值。


化简代码试了下,可能是变量作用域的问题

u = ones(2)
b = u
i = 4
println("[$i] u=$u; b=$b")
while i > 0
   # global i, u, b
   println("[$i] u=$u; b=$b")
   
   b = u
   u .+= 1
   i -= 1
end

以上这段直接运行报错

julia>

[4] u=[1.0, 1.0]; b=[1.0, 1.0]
ERROR: LoadError: UndefVarError: i not defined
Stacktrace:
...

去掉注释就没问题

julia>

[4] u=[1.0, 1.0]; b=[1.0, 1.0]
[4] u=[1.0, 1.0]; b=[1.0, 1.0]
[3] u=[2.0, 2.0]; b=[2.0, 2.0]
[2] u=[3.0, 3.0]; b=[3.0, 3.0]
[1] u=[4.0, 4.0]; b=[4.0, 4.0]

但是还是建议不要用全局变量,Julia 里就应该多用函数,而不是把 julia 当脚本写
以上代码放到函数里就没什么问题了。

u = ones(2)
b = u
i = 4
println("[$i] u=$u; b=$b")

function test(i, u, b)
    while i > 0
        # global i, u, b
        println("[$i] u=$u; b=$b")

        b = u
        u .+= 1
        i -= 1
    end
    u, b
end

test(i, u, b) |> println

测试

julia>

[4] u=[1.0, 1.0]; b=[1.0, 1.0]
[4] u=[1.0, 1.0]; b=[1.0, 1.0]
[3] u=[2.0, 2.0]; b=[2.0, 2.0]
[2] u=[3.0, 3.0]; b=[3.0, 3.0]
[1] u=[4.0, 4.0]; b=[4.0, 4.0]
([5.0, 5.0], [5.0, 5.0])

#3

十分感谢!习惯了matlab,刚开始用julia确实很多地方需要注意。