Scilab中的Jacobi方法,我的实现有什么问题

时间:2014-05-29 17:14:39

标签: scilab

HY,

我在Scilab中有以下Jacobi方法实现,但我接受了错误,

   function [x]= Jacobi(A,b)
[n m] = size (A); // determinam marimea matricei A

//我们检查矩阵是否是二次

if n<>m then
    error('Matricea ar trebui sa fie patratica');
    abort;
end

我们初始化零矩阵

  x = zeros(n,1) // matrice cu zerouri x = [0, 0 ... 0]

// initializarea variabilelor
Itmax=1000.; //numar maxim de iteratii
eps=0.0000000000000001 // toleranta maxima

nrit=0;
ready=0;
while (ready==0)
    for i=1:n
        s=0
        for j=1:n
            if i<>j then
                s=A(i,j)+x(j);
            end
        end
        y(i)=(1/A(i,i))*(b(i)-s);
    end
 abso = norm(x(1),y(1));
 for i=2:n
     if abso<norm(x(i),y(i)) then
         abso=norm(x(i),y(i));
     end
 end
 nrit=nrit+1;
 if((nrit==Itmax)|(abso<eps))  then
     ready=1;
 end
 x=y;
end
for i=1:n
    disp(y(i),'Rezidurile medii');
end
x

它有什么问题!

诚恳,

1 个答案:

答案 0 :(得分:0)

我不知道你得到了什么错误,我注意到实现中也存在一些问题,但你可以使用下面的代码,它可以正常工作:

Jacobi Alghoritm

function [x]= Jacobi(A,b)
[n m] = size (A); // determinam marimea matricei A
if n<>m then
    error('Matricea ar trebui sa fie patratica');
end

// initializarea variabilelor
x = zeros(n,1) // matrice cu zerouri x = [0, 0 ... 0]
Itmax=1000.; //numar maxim de iteratii
eps=0.0000000000000001 // toleranta maxima
nrit=0;
ready=0;

while (ready==0)
    for i=1:n
        s=0
        for j=1:n
            if i<>j then
                s=s+A(i,j)*x(j);
            end
        end
        y(i)=(1/A(i,i))*(b(i)-s);
    end
    abso = abs(x(1)-y(1));
    for i=2:n
        if abso<abs(x(i)-y(i)) then
            abso=abs(x(i)-y(i));
        end
    end
    nrit=nrit+1;
    if((nrit==Itmax)|(abso<eps))  then
        ready=1;
    end
    x=y;
end

我们假设您将其保存在〜/ Jacobi.sci

的文件中

用法(在Scilab中)

-->exec('~/Jacobi.sci', -1)
-->Jacobi([3,-1,-1;-1,3,1;2,1,4],[1,3,7])
 ans  =

    1.  
    1.  
    1.