Unable to perform assignment because the left and right sides have a different number of elements.

1 view (last 30 days)
I would like to use code of SOR method. Here is the code:
% SOR ALGORITHM 7.3
%
% To solve Ax = b given the parameter w and an initial approximation
% x(0):
%
% INPUT: the number of equations and unknowns n; the entries
% A(I,J), 1<=I, J<=n, of the matrix A; the entries
% B(I), 1<=I<=n, of the inhomogeneous term b; the
% entries XO(I), 1<=I<=n, of x(0); tolerance TOL;
% maximum number of iterations N; parameter w (omega).
%
% OUTPUT: the approximate solution X(1),...,X(n) or a message
% that the number of iterations was exceeded.
syms('OK', 'AA', 'NAME', 'INP', 'N', 'I', 'J', 'A', 'X1');
syms('TOL', 'NN', 'W', 'K', 'ERR', 'S', 'FLAG', 'OUP');
TRUE = 1;
FALSE = 0;
fprintf(1,'This is the SOR Method for Linear Systems.\n');
OK = FALSE;
fprintf(1,'The array will be input from a text file in the order:\n');
fprintf(1,'A(1,1), A(1,2), ..., A(1,n+1) \n');
fprintf(1,'A(2,1), A(2,2), ..., A(2,n+1),\n');
fprintf(1,'..., A(n,1), A(n,2), ..., A(n,n+1)\n\n');
fprintf(1,'Place as many entries as desired on each line, but \n');
fprintf(1,'separate entries with at least one blank.\n');
fprintf(1,'The initial approximation should follow in same format.\n\n\n');
fprintf(1,'Has the input file been created? - enter Y or N.\n');
AA = input(' ','s');
if AA == 'Y' | AA == 'y'
fprintf(1,'Input the file name in the form - drive:\\name.ext\n');
fprintf(1,'for example: A:\\DATA.DTA\n');
NAME = input(' ','s');
INP = fopen(NAME,'rt');
OK = FALSE;
while OK == FALSE
fprintf(1,'Input the number of equations - an integer.\n');
N = input(' ');
if N > 0
A = zeros(N,N+1);
X1 = zeros(1,N);
for I = 1 : N
for J = 1 : N+1
A(I,J) = fscanf(INP, '%f',1);
end;
end;
for I = 1 : N
X1(I) = fscanf(INP, '%f',1);
end;
% use X1 for X0
OK = TRUE;
fclose(INP);
else
fprintf(1,'The number must be a positive integer.\n');
end;
end;
OK = FALSE;
while OK == FALSE
fprintf(1,'Input the tolerance.\n');
TOL = input(' ');
if TOL > 0
OK = TRUE;
else
fprintf(1,'Tolerance must be a positive number.\n');
end;
end;
OK = FALSE;
while OK == FALSE
fprintf(1,'Input maximum number of iterations.\n');
NN = input(' ');
if NN > 0
OK = TRUE;
else
fprintf(1,'Number must be a positive integer.\n');
end;
end;
fprintf(1,'Input parameter w (omega)\n');
W = input(' ');
% use W for omega
else
fprintf(1,'The program will end so the input file can be created.\n');
end;
if OK == TRUE
% STEP 1
K = 1;
OK = FALSE;
% STEP 2
while OK == FALSE & K <= NN
% ERR is used to test accuracy - it measures the infinity norm
ERR = 0;
% STEP 3
for I = 1 : N
S = 0;
for J = 1 : N
S = S-A(I,J)*X1(J);
end;
S = W*(S+A(I,N+1))/A(I,I);
if abs(S) > ERR
ERR = abs(S);
end;
X1(I) = X1(I)+S;
end;
% STEP 4
if ERR <= TOL
OK = TRUE;
% process is complete
else
% STEP 5
K = K+1;
% STEP 6 - is not used since only one vector is required
end;
end;
if OK == FALSE
fprintf(1,'Maximum Number of Iterations Exceeded.\n');
% STEP 7
% procedure completed unsuccessfully
else
fprintf(1,'Choice of output method:\n');
fprintf(1,'1. Output to screen\n');
fprintf(1,'2. Output to text file\n');
fprintf(1,'Please enter 1 or 2.\n');
FLAG = input(' ');
if FLAG == 2
fprintf(1,'Input the file name in the form - drive:\\name.ext\n');
fprintf(1,'for example: A:\\OUTPUT.DTA\n');
NAME = input(' ','s');
OUP = fopen(NAME,'wt');
else
OUP = 1;
end;
fprintf(OUP, 'SOR ITERATIVE METHOD FOR LINEAR SYSTEMS\n\n');
fprintf(OUP, 'The solution vector is :\n');
for I = 1 : N
fprintf(OUP, ' %11.8f', X1(I));
end;
fprintf(OUP, '\nusing %d iterations with\n', K);
fprintf(OUP, 'Tolerance %.10e in infinity-norm\n', TOL);
fprintf(OUP, 'with Parameter %.10e\n', W);
if OUP ~= 1
fclose(OUP);
fprintf(1,'Output file %s created successfully \n',NAME);
end;
end;
end;
And my data matrix is:
1 -0.5 0 0 0 0 0
-0.5 1 -0.5 0 0 0 0
0 -0.5 1 -0.5 0 0 0
0 0 -0.5 1 -0.5 0 0
0 0 0 -0.5 1 -0.5 0
0 0 0 0 -0.5 1 -0.5
0 0 0 0 0 -0.5 1
But I got error like this:
Has the input file been created? - enter Y or N.
Y
Input the file name in the form - drive:\name.ext
for example: A:\DATA.DTA
ALG073.DTA
Input the number of equations - an integer.
7
Unable to perform assignment because the left and right sides have a different number of elements.
Error in ALG073 (line 47)
X1(I) = fscanf(INP, '%f',1);
Can anyone help?

Accepted Answer

Walter Roberson
Walter Roberson on 25 Nov 2020
When you enter 7 then the code expects to read 7 lines with 8 values per line (though as the prompts hint you can put as many values per line as you want, but the order will be groups of 8 values go into each row)
After that the file needs 7 numeric initial values.
The data matrix you posted is only 7x7 not 7x8. If your file then what you intend as 7 initial values they would be read in as the rest of the A values. Then when the code went to read the initial values it would not find any.

More Answers (0)

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!