index must be positive integer or logical

1 Ansicht (letzte 30 Tage)
MF
MF am 31 Mär. 2016
Kommentiert: Torsten am 31 Mär. 2016
I am using an explicit/implicit scheme for Gravity waves in one dimension and I'm using the following code.
ntot = 100;
jmax = 100;
j = 50;
h=10; dx = 1000; dt = 0.5;
a = (dt*h)/dx;
for j = 1:((n+1)) %Initial conditions
U(:,1)=0;
U(jmax/2,1) =100;
end
for n=1:ntot+1 %Boundary conditions
U(1,n) = 1;
U(n+1,n) = 0;
end
for n = 1:ntot;
for j = 1:jmax-1;
N(j,n+1) = N(j,n)-a*(U(j+1/2,n)-U(j-1/2,n));
U(j+1/2,n) =U(j+1/2,n+1) - B*(N(j,n+1)-N(j+1,n+1));
end
end
hold on
plot(N(:,n+1));
plot (U(:,n));
However, when running it, an error "Attempted to access U(1.5,1); index must be a positive integer or logical." is being displayed. I understand why it is displaying such error (because j is located in the middle of each cell i.e. j is found at 0.5, 1.5, 2.5 etc...and matlab does not read such index. Is there a way how I can solve this problem please. Thanks
  1 Kommentar
Jan
Jan am 31 Mär. 2016
Please use the "{} Code" button to format your code. Currently it is hard to read.

Melden Sie sich an, um zu kommentieren.

Antworten (3)

KSSV
KSSV am 31 Mär. 2016
If you have a array/ matrix, the indices (i,j) must be integers. They cannot be fractions, zeros or negatives. You are accessing U(1.5,1). It is not allowed.
  1 Kommentar
MF
MF am 31 Mär. 2016
Yes I know that, but how can I modify my code so that it reads j (which falls in the middle of n) since j is a disturbance in the middle of the domain..

Melden Sie sich an, um zu kommentieren.


Jan
Jan am 31 Mär. 2016
The intention of your code is not clear. E.g. this is meaningless:
for j = 1:((n+1)) %Initial conditions
U(:,1) = 0;
U(jmax/2,1) = 100;
end
The body of the loop does not depend on the loop counter j, such that you set the the elements n times to the same value. Why?
It is hard to suggest how to solve the problem of the non-integer indices, because the code does not contain any comments which explain the purpose. All we see is a failing code, so how could we fix it? Perhaps you should simply multiply all indices by 2. Or you could replace U(1.5) by (U(1)+U(2))/2, if this satisfies your needs.
  2 Kommentare
MF
MF am 31 Mär. 2016
Ok, it looks like I didn't explained properly.
I've attached the equations I' working on. After arranging them I got these:
N(j,n+1) = N(j,n)-a*(U(j+1/2,n)-U(j-1/2,n)); (a = dt*/dx)
U(j+1/2,n) =U(j+1/2,n+1) - B*(N(j,n+1)-N(j+1,n+1)); (B = dt*g/dx).
Then I had to implement an explicit/implicit scheme and initialize the water level (i.e. j = 50) with an initial disturbance in the middle of the domain.
ntot = 100; %number of time steps
jmax = 100; %size of domain
j = 50; %initial perturbation
h=10; dx = 1000; dt = 0.5;
Since j in the equations (as attached in the image) contains a 1/2, I have no idea how I can solve it. Hope I explained it better now. Thanks
Torsten
Torsten am 31 Mär. 2016
I don't understand your problem.
Just save the values you would have stored in U(j+1/2,n) now in U(j+1,n) (i.e. shift the j-index by 1/2 to the right).
Best wishes
Torsten.

Melden Sie sich an, um zu kommentieren.


Image Analyst
Image Analyst am 31 Mär. 2016

Kategorien

Mehr zu MATLAB finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by