矢量化for循环的结果

时间:2014-02-04 17:11:30

标签: matlab loops for-loop double

我试着循环寻找答案,但我只能找到矢量整个双循环,这不是我需要的(除非我的程序可以)。我也尝试为T值制作一个for循环,但我无法对结果进行矢量化。我相信这篇文章会很有用,因为它引入了2D Ising模型,它在Matlab中作为初学者的练习非常受欢迎。我找到了很多这个问题的解决方案,但我真的想按照自己的方式去做。这是我的问题:

程序的输出仅为一个温度T = 0.5的meanE。但我的目标是接收一个填充meanE的向量(meanE的每个值必须与不同的温度相对应)。温度范围必须为T = -0.1:2.7:100。 T出现在“if”状态。非常感谢您的帮助。等不及你的建议。

tic
N=10;
T=0.5;
n=3000;

t=rand(N+4);
t(t>0.5)=+1;
t(t<0.5)=-1;

% Bounary condidtions. Here we will use "technical" matrix N+4xN+4
% and on its basis we will be doing further calculations for
% our "mian" matrix NxN

t(2:N+3,2)=t(2:N+3,N+2); t(2:N+3,3)=t(2:N+3,N+3);
t(2,2:N+3)=t(N+2,2:N+3); t(3,2:N+3)=t(N+3,2:N+3);

t(2:N+3,4)=t(2:N+3,N+4); t(2:N+3,1)=t(2:N+3,N+1);
t(1,2:N+3)=t(N+1,2:N+3); t(4,2:N+3)=t(N+4,2:N+3);



E=zeros(n,1);
for r=1:n

    % t_flipped is t matrix with one randomly flipped spin

    t_flipped=t;
    rs = randi([3, N+2], [1, 2]);
    t_flipped(rs(1,1),rs(1,2))=-t(rs(1,1),rs(1,2));

    % E is the total energy of NxN matrix derived from t matrix
    % It is not necessary to calculate total energy of matrix with
    % flipped spin, so there is no formula for this operation

    E_elements=2*t(3:N+2,3:N+2).*t(3:N+2,4:N+3)+2*t(3:N+2,3:N+2).*t(4:N+3,3:N+2);
    E(r)=-sum(E_elements(:));

    % We calculate energy difference dE between two considered matrices
    % using submatrices u and f that contain element with unfliped(u)/flipped(f)
    % spin and his nearest neighbours

    u=t(rs(1,1)-2:rs(1,1)+2,rs(1,2)-2:rs(1,2)+2);
    f=t_flipped(rs(1,1)-2:rs(1,1)+2,rs(1,2)-2:rs(1,2)+2);


    Energy_u_elements=u(2:4,2:4).*u(2:4,3:5)+u(2:4,2:4).*u(2:4,1:3)+...
                      u(2:4,2:4).*u(3:5,2:4)+u(2:4,2:4).*u(1:3,2:4);
    Energy_u=-sum(Energy_u_elements(:));

    Energy_f_elements=f(2:4,2:4).*f(2:4,3:5)+f(2:4,2:4).*f(2:4,1:3)+...
                      f(2:4,2:4).*f(3:5,2:4)+f(2:4,2:4).*f(1:3,2:4);
    Energy_f=-sum(Energy_f_elements(:));

    dE=Energy_f-Energy_u;

    % Acceptance condition

    if dE<0 || rand(1)<exp(-dE/T)
        t(rs(1,1),rs(1,2))=-t(rs(1,1),rs(1,2));
    end
end

    meanE= sum(E(n*0.6:n))/(n-n*0.6)
toc

我添加了一些评论。希望有所帮助。但是真的有必要了解整个计划吗?这是物理问题,遗憾的是这些糟糕的矩阵相关公式是必要的。

程序有一个输出,这是一个固定T(温度)的meanE。所以我需要做一个for循环,所以我可以接收不同T值的其他meanE值(范围是T = -0.1:2.7:100)就是这样。请告诉我还有什么我应该解释或更清楚。当然非常感谢您的建议。

0 个答案:

没有答案