Vectors must be same length help
20 ビュー (過去 30 日間)
古いコメントを表示
Hello. I'm trying to make a single plot that overlays the numerical values of all the unknowns of the system of linear equations versus the iterations conducted in the Gauss-Seidel method. However, for some reason it's showing that there's an error and that vectors must be the same length, but I'm confused as to how I can solve this. Can anyone help out?
clear
clc
close all
%Definition of coefficient matrix, vector of constants, and initial solution:
A = [9 2 -3 -1 1; 0 10 -2 5 2; 0 -2 8 4 0; -1 3 0 -6 2; -1 3 2 -1 7];
b = [-34; 23; 60; -23; -39];
x = ones(1,length(b));
%Determines the number of rows (m) and columns (n) in A:
[m,n] = size(A);
%Creates an auxiliary matrix, and auxiliary vectors:
c = zeros(m,n);
d = zeros(m,1);
%Defines initial error (100%), tolerance, and initial iteration:
ea = 100;
tol = 0.01;
iter = 1;
%Prints the header of table to user:
disp('Iter x1 x2 x3 x4 Max_Error')
fprintf('%d %9.4f %9.4f %9.4f %9.4f %9.4f\n', iter-1, x(1),x(2),x(3),x(4),ea)
%Gauss-Seidel iterative method:
while ea > tol
for i = 1:n
%Computes vector of coefficients:
d(i) = b(i)/A(i,i);
%Computation of coefficient matrix "c":
for j = 1:m
if i == j
c(i,j) = 0; %Diagonal of matrix "c" is full of zeros
else
c(i,j) = A(i,j)/A(i,i); %For non-diagonal elements
end
end
%Calculates new solution:
x_new(i) = d(i) -c(i,:)*x(:);
%Calculates new error:
ea_vect(i) = abs((x_new(i) - x(i))/x_new(i)*100);
%Updates to the new solution:
x(i) = x_new(i);
end
%Determines the maximum error among the unknowns, to check convergence:
ea = max(ea_vect);
%Prints results to the user:
fprintf('%d %9.4f %9.4f %9.4f %9.4f %9.4f\n', iter, x(1),x(2),x(3),x(4),ea)
%Updates iteration:
iter = iter + 1;
end
figure;
hold on;
colors = ['r', 'g', 'b', 'm', 'c'];
labels = {'x1', 'x2', 'x3', 'x4', 'x5'};
for i = 1:size(x, 1)
plot(1:iter, x(i, :), 'Color', colors(i));
end
hold off;
grid on;
xlabel('Iterations');
ylabel('Unknowns');
legend(labels);
1 件のコメント
Dyuman Joshi
2023 年 7 月 11 日
編集済み: Dyuman Joshi
2023 年 7 月 11 日
The value of iter after the while loop is 14, thus 1:iter has 14 elements, whereas x has only 5 columns.
How can you plot 14 points against 5 points?
"I'm trying to make a single plot that overlays the numerical values of all the unknowns of the system of linear equations versus the iterations conducted in the Gauss-Seidel method"
Do you want to plot solution vs no of iterations taken to obtain the solution? If not, please specify / provide more information regarding this.
回答 (1 件)
Menika
2023 年 7 月 11 日
Hi,
The error you are encountering is due to the mismatch in the dimensions of the x variable. In your code, you have initialized x as a row vector : x = ones(1,length(b));, but later in the while loop, you are updating x as a column vector x(i) = x_new(i);.
You can modify the initialization of x to be a column vector instead in line 7:
x = ones(length(b), 1);
Hope it helps!
2 件のコメント
参考
カテゴリ
Help Center および File Exchange で Operating on Diagonal Matrices についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!