Matlab 雅可比到高斯塞德尔

Matlab 雅可比到高斯塞德尔,matlab,numerical-methods,Matlab,Numerical Methods,我需要把我的雅可比码重新构造成高斯-赛德尔码。我试过很多方法,但到目前为止都没有效果。这是我的当前代码。我需要做什么才能把这个代码改成Gauss Seidel function z=jacobi(A,B) C=A; D=B; [N N]=size(A); for i=1:N C(i,:)=-C(i,:)/A(i,i); C(i,i)=0; D(i)=D(i)/A(i,i); end x=zeros(N,1); y=C*x+D; m=0; while(norm(x-y)&g

我需要把我的雅可比码重新构造成高斯-赛德尔码。我试过很多方法,但到目前为止都没有效果。这是我的当前代码。我需要做什么才能把这个代码改成Gauss Seidel

function z=jacobi(A,B)
C=A; D=B; [N N]=size(A);
for i=1:N
    C(i,:)=-C(i,:)/A(i,i);
    C(i,i)=0;
    D(i)=D(i)/A(i,i);
end
x=zeros(N,1);
y=C*x+D;
m=0;
while(norm(x-y)>0.00000001 && m<100)
    x=y;
    y=C*x+D;
    m=m+1;
end
z=y;
end
函数z=jacobi(A,B)
C=A;D=B;[N]=尺寸(A);
对于i=1:N
C(i,:)=-C(i,:)/A(i,i);
C(i,i)=0;
D(i)=D(i)/A(i,i);
结束
x=零(N,1);
y=C*x+D;
m=0;

虽然(norm(x-y)>0.00000001&&m雅可比解算器和高斯-赛德尔解算器之间的区别在于,当您在当前迭代中解变量
x_i
时,您需要使用来自先前变量的信息(
x_1,x_2,…,x_{i-1}
)作为当前变量解决方案的一部分,
x_i
。对于Jacobi,您只需使用上一次迭代的解决方案来制定当前解决方案。对于Gauss Seidel,对于您求解的每个变量,必须使用从当前迭代计算的前一个变量的解决方案作为e您关注的变量的解决方案

同样地,对于特定版本的代码(虽然不是最优的…),您只需添加一个
for
循环,在该循环中,我们一次求解一个变量,然后继续将此信息输入到其他变量中。这必须在
while
循环中完成,因为这是您进行迭代的地方

因此:

function z=gaussseidel(A,B) %// Change the function name
C=A; D=B; [N N]=size(A);
for i=1:N
    C(i,:)=-C(i,:)/A(i,i);
    C(i,i)=0;
    D(i)=D(i)/A(i,i);
end
x=zeros(N,1);
y=C*x+D;
m=0;
while(norm(x-y)>0.00000001 && m<100)
    x=y;
    %// Change here
    for idx = 1 : N
        if idx == 1 %// Case where we are solving for the first variable
            y(idx) = C(idx,:)*x + D(idx);
        else %// Everything else
            y(idx) = C(idx,1:idx-1)*y(1:idx-1) + C(idx,idx:end)*x(idx:end) + D(idx);
        end
    end
    m=m+1;
end
z=y;
end
function z=gaussseidel(A,B)%//更改函数名
C=A;D=B;[N]=尺寸(A);
对于i=1:N
C(i,:)=-C(i,:)/A(i,i);
C(i,i)=0;
D(i)=D(i)/A(i,i);
结束
x=零(N,1);
y=C*x+D;
m=0;

而(norm(x-y)>0.00000001&&m重组代码的另一个版本。 顺便说一句,这段代码并不比jacobi代码快,但可以在较少的迭代中找到解决方案

function [z,m]=seidel(A,B)
C=A; D=B; [N N]=size(A);
for i=1:N
 C(i,:)=-C(i,:)/A(i,i);
 C(i,i)=0;
 D(i)=D(i)/A(i,i);
end
x=zeros(N,1);
m=0;
while (m<100)
 t=x;
 m=m+1;
 for j=1:N
   y(j)=C(j,:)*x+D(j);
   x(j)=y(j);
 end
 if(norm(x-t)<0.00000001)
    break;
 end
end
z=y';
end
函数[z,m]=seidel(A,B)
C=A;D=B;[N]=尺寸(A);
对于i=1:N
C(i,:)=-C(i,:)/A(i,i);
C(i,i)=0;
D(i)=D(i)/A(i,i);
结束
x=零(N,1);
m=0;

虽然(mHey Ray,代码运行得很好,但与我的jacobi代码相比,进行微积分需要太多的时间。不应该是Seidel比tan jacobi快?对不起,我的英语很好,但我是厄瓜多尔人。@PetherZavala-没问题。是的,它应该比jacobi收敛得快,但就计算速度而言,什么我知道没有更快的速度。原因是因为
for
循环。这是我能想到的唯一方法,在给定的代码中,我可以实现Gauss-Seidel更改。你需要使用当前迭代中的变量来计算其余变量的解。因此,没有一种方法可以除非你使用循环,否则我会考虑这样做。