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
它有什么问题!
诚恳,
答案 0 :(得分:0)
我不知道你得到了什么错误,我注意到实现中也存在一些问题,但你可以使用下面的代码,它可以正常工作:
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
的文件中-->exec('~/Jacobi.sci', -1)
-->Jacobi([3,-1,-1;-1,3,1;2,1,4],[1,3,7])
ans =
1.
1.
1.