Why do I keep getting "Index exceeds matrix dimensions" while solving partial differential equation?

2 次查看(过去 30 天)
So I have a computational fluid dynamics problem to solve the generalized Burger equation. Using two different PDE schemes. But I keep getting this error "Index exceeds matrix dimensions." The thing that is puzzling me is I didn't specify any dimensions. So I don't know how to fix it.
for x = 1:X
ub(1,x+1) = 0.5*(1+atan(250*(x-20)));
end
% Solving the Burger equation
for n = 1:T
u(n+1,1) = 0;
for j = 2:X-1
Fnj1 = 0.5*u(n,j+1)*(1-u(n,j+1));
Fnj = 0.5*u(n,j)*(1-u(n,j));
******Fbnj = 0.5*ub(n,j+1)*(1-ub(n+1,j));***************Here is where it says the error is
Fbnj1 = 0.5*ub(n+1,j-1)*(1-ub(n+1,j-1));
% Predictor
ub(n+1,j) = u(n,j)-dt/dx*(Fnj1-Fnj)+r*(u(n,j+1)-...
2*u(n,j)+u(n,j-1));
% Corrector
u(n+1,j) = 0.5*(u(n,j)+ub(n+1,j)-(dt/dx)*(Fbnj-...
Fbnj1)+r*(ub(n+1,j+1)-2*ub(n+1,j)+ub(n+1,j-1)));
end
u(n+1,X) = 1;
end

回答(4 个)

KSSV
KSSV 2016-12-2
Check line 9 u(n+1,1) = 0 and line 11 0.5*u(n,j+1). In line line 9 you said u is a row vector and in line you are treating u as a matrix. That's why there is a error. You have to initialize u properly.
  3 个评论

请先登录,再进行评论。


Walter Roberson
Walter Roberson 2016-12-2
Follow the execution from the beginning. The first iteration of "for n", n will be assigned 1. You have
u(n+1,1) = 0;
so that is u(2,1) = 0; and that will act to create the previously non-existent array u, implicitly defining u(1,1) = 0 (matrix extension fills empty slots with 0), and explicitly defining u(2,1) = 0
Then you start the "for j" loop, in which the j first gets assigned 2. You proceed from there to the next line which has
Fnj1 = 0.5*u(n,j+1)*(1-u(n,j+1));
which uses u(1,3) because n = 1 and j = 2. But u(1,3) does not exist. Your code will fail before you reach the line you marked,
Fbnj = 0.5*ub(n,j+1)*(1-ub(n+1,j));
From this we deduce that the code you posted is not your actual code, or possibly that you had a u variable left over from a previous execution, with some value in it that we cannot guess at.
  1 个评论
Walter Roberson
Walter Roberson 2016-12-2
Your loop
for x = 1:X
ub(1,x+1) = 0.5*(1+atan(250*(x-20)));
end
starts with ub undefined, so the first iteration assigns to ub(1,2), implicitly assigning 0 to ub(1,1) because of matrix extension automatically filling with 0. The next iteration assigns to ub(1,3) and so on to ub(1,X+1) which is ub(1,42)
You start the for n loop with n = 1. You start the for j loop with j = 2. You reach
Fb(n,j) = 0.5*ub(n+1,j)*(1-ub(n+1,j));
this calls upon ub(1+1,2) which is ub(2,2) . But you have not assigned anything to ub(2,:) yet. You do not assign anything to ub(2,:) until two lines further on,
ub(n+1,j) = u(n,j)-dt/dx*(F(n,j+1)-F(n,j))+r*(u(n,j+1)-...
2*u(n,j)+u(n,j-1));
which would assign to ub(2,2)
I would have thought it likely in a 2D PDE that you would be wanting to use ub(n,:) in your predictions of ub(n+1,:) but you do not do so.

请先登录,再进行评论。


Ben McDaniel
Ben McDaniel 2016-12-2
Okay. Here is the whole code because a similar version worked on a different problem.
clear variables;
clc;
T=18; % Time
X=41; % # of mesh points
ne=3;
nu=0.6;
dx=1; % mesh spacing
c=1;
dt=0.5;
v=(c*dt)/dx;
r=0.001*(dt/dx^2);
u = zeros(1,X); % Creates 1x41 matrix for analytical solution
u_e = zeros(1,X); % Creates 1x41 matrix for exact Sol
% Solving I.C. from x=1 to x=41
for x = 1:X
u(1,x) = 0.5*(1+atan(250*(x-20)));
end
F = 0.5*u-0.5*u.^2;
Fb = zeros(1,X);
% Using predictor with IC
for x = 1:X
ub(1,x+1) = 0.5*(1+atan(250*(x-20)));
end
% Solving the Burger equation
for n = 1:T
u(n+1,1) = 0;
for j = 2:X-1
F(n,j+1) = 0.5*u(n,j+1)*(1-u(n,j+1));
F(n,j) = 0.5*u(n,j)*(1-u(n,j));
Fb(n,j) = 0.5*ub(n+1,j)*(1-ub(n+1,j));
Fb(n,j-1) = 0.5*ub(n+1,j-1)*(1-ub(n+1,j-1));
% Predictor
ub(n+1,j) = u(n,j)-dt/dx*(F(n,j+1)-F(n,j))+r*(u(n,j+1)-...
2*u(n,j)+u(n,j-1));
% Corrector
u(n+1,j) = 0.5*(u(n,j)+ub(n+1,j)-(dt/dx)*(Fbnj-...
Fbnj1)+r*(ub(n+1,j+1)-2*ub(n+1,j)+ub(n+1,j-1)));
end
u(n+1,X) = 1;
end
% Solving for the exact solution
for n = 1:18
for x = 1:X
u_e(n,x) = 0.5*(1+atan(250*(x-20)));
end
end
x = 1:X;
% Comparison Graph
plot(x,u(n+1,j),x,u_e(n,x)),title('MacCormack Method'),grid on;
  3 个评论
Ben McDaniel
Ben McDaniel 2016-12-10
I managed to change some indices and get that equation to work, and I made a few changes but I still keep getting the "predictor" equation coming up with the matrix dimension error. How can I fix this? I really suck with matlab apparently. This problem has been driving me crazy.

请先登录,再进行评论。


Ben McDaniel
Ben McDaniel 2016-12-10
编辑:Ben McDaniel 2016-12-10
Here is the current version.
clear variables;
clc;
T=18; % Time
X=41; % # of mesh points
dx=1; % mesh spacing
c=1;
dt=1;
v=(c*dt)/dx;
r=0.001*(dt/(dx^2));
u = zeros(T,X); % Creates 18x41 matrix for analytical solution
u_e = zeros(T,X); % Creates 18x41 matrix for exact Sol
ub = zeros(T,X); % Creates 18x41 matrix for predictor
% Solving I.C. from x=1 to x=41
for x = 1:X
u(1,x) = 0.5*(1+atan(250*(x-20)));
end
F = 0.5*u-0.5*u.^2;
% Using predictor with IC
for x = 1:X
ub(1,x) = 0.5*(1+atan(250*(x-20)));
end
% Solving the Burger equation
for n = 1:dt:T
u(n,1) = 0;
for j = 2:(X+1)
F1 = 0.5*u(n,j+1)*(1-u(n,j+1));
F = 0.5*u(n,j)*(1-u(n,j));
% Predictor
ub(n+1,j) = u(n,j)-(dt/dx)*(F1-F)+...
r*(u(n,j+1)-2*u(n,j)+u(n,j-1));
% Corrector
Fb = 0.5*ub(n+1,j)*(1-ub(n+1,j));
Fb1 = 0.5*ub(n+1,j-1)*(1-ub(n+1,j-1));
u(n+1,j) = (0.5)*((u(n,j)+ub(n+1,j)-(dt/dx)*(Fb-Fb1)+...
r*(ub(n+1,j+1)-(2*ub(n+1,j))+ub(n+1,j-1))));
end
u(n,X) = 1;
end
% Solving for the exact solution
for n = 1:T
for x = 1:X
u_e(n,x) = 0.5*(1+atan(250*(x-20)));
end
end
x = 1:X;
% Comparison Graph
plot(x,u(5,j),x,u_e(5,x)),title('MacCormack Method'),grid on;
  1 个评论
Walter Roberson
Walter Roberson 2016-12-10
In the line
F1 = 0.5*u(n,j+1)*(1-u(n,j+1));
your j can be as large as X+1 and then you add 1 to it, so you could be accessing a subscript as large as X+2
You initialized
u = zeros(T,X); % Creates 18x41 matrix for analytical solution
which is only length X, and your loop
for x = 1:X
u(1,x) = 0.5*(1+atan(250*(x-20)));
end
never writes past X
Your corrector does have
u(n+1,j) = (0.5)*((u(n,j)+ub(n+1,j)-(dt/dx)*(Fb-Fb1)+...
r*(ub(n+1,j+1)-(2*ub(n+1,j))+ub(n+1,j-1))));
and since j can be as large as X+1 that could potentially extend u to X+1 columns, but it cannot extend it to X+2 columns . And, besides, you would already have failed out on the
F1 = 0.5*u(n,j+1)*(1-u(n,j+1));
line when j is X, trying to access u(n,X+1) in the loop iteration before you could potentially extend u to width X+1.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Mathematics 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by