Azzera filtri
Azzera filtri

Error: Incorrect dimensions for matrix multiplication

4 visualizzazioni (ultimi 30 giorni)
Janee
Janee il 13 Ott 2023
Commentato: Torsten il 13 Ott 2023
I have the following code which is an iterative solver that solves for a linear poisson's equation as a simple test:
clearvars; clc; close all;
N=30;
[D,x] = cheb(N); D2 = D^2;
D2(N+1,:) = D(N+1,:); %Neumann BC at left endpoint (x=-1), esp w/ D
D2 = D2(2:N+1,2:N+1); %Dirichlet BC at right endpoint (x=1)
u = (exp(4*x) - 4*exp(-4)*(x-1)-exp(4))/16; %w/ BCs ux(-1)=u(1)=0
n =ones(size(u));
%build source term
dndx = D *n;
dudx = D *u;
prod1 = dndx .* dudx;
du2dx = D * dudx;
prod2 = n .*du2dx;
invN = (1./n) ;
source = prod1(2:N) + prod2(2:N);
uold = ones(size(u(2:N)));
max_iter =500;
err_max = 1e-8;
for iterations = 1:max_iter
phikmax_old = (max(abs(uold)));
duoldx = D(2:N,2:N) *uold;
dnudx = dndx(2:N) .* duoldx;
ffh = source;
RHS = ffh - dnudx;
Stilde = invN(2:N) .* RHS;
unew = D2\[Stilde;0];
phikmax = (max(abs(unew)));
if phikmax < err_max
it_error = err_max /2;
else
it_error = abs( phikmax - phikmax_old) / phikmax;
end
if it_error < err_max
break;
end
uold = unew;
end
unew = [0;unew];
figure
plot(x,unew,'--rs',x,(u));
legend('Num solution','Exact solution')
Function cheb:
function [ D, x ] = cheb ( N )
if ( N == 0 )
D = 0.0;
x = 1.0;
return
end
x = cos ( pi * ( 0 : N ) / N )';
c = [ 2.0; ones(N-1,1); 2.0 ] .* (-1.0).^(0:N)';
X = repmat ( x, 1, N + 1 );
dX = X - X';
D = ( c * (1.0 ./ c )' ) ./ ( dX + ( eye ( N + 1 ) ) );
D = D - diag ( sum ( D' ) );
return
end
I get the correct solution at the first iteraion " for iterations = 1 %1:max_iter" then after that I get the error:
Error using *
Incorrect dimensions for matrix multiplication. Check that the number of columns in the first matrix matches the number of
rows in the second matrix. To perform elementwise multiplication, use '.*'.
Error in Filename (line 298)
duoldx = D(2:N,2:N) *uold;
which I believe it has to do with uold not being same size as unew? How can I fix that? Thanks
  1 Commento
Mathieu NOE
Mathieu NOE il 13 Ott 2023
hello
your array uold has length = 29 at the first iteration and 30 at the second (when you do: uold = unew;)
there is something to fix in your code when you update some data as their dimensions change (and should not) as the loop iterates

Accedi per commentare.

Risposte (1)

Torsten
Torsten il 13 Ott 2023
You set uold = unew, but unew is 30x1 instead of 29x1.
Since D(2:N,2:N) is 29x29, MATLAB errors in the next iteration when you try to compute
duoldx = D(2:N,2:N) *uold;
  2 Commenti
Janee
Janee il 13 Ott 2023
I can see that it's just I am not sure how to adjust it to work.
Torsten
Torsten il 13 Ott 2023
Maybe by setting
uold = unew(2:N);
instead of
uold = unew;
?
But it's just to make the code work technically without knowledge about what you have programmed.

Accedi per commentare.

Categorie

Scopri di più su Creating and Concatenating Matrices in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by