Как настроить несколько циклов вместе? - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь понять расположение петель for, чтобы они были в правильном порядке.Я не уверен, где поставить J цикл в этом коде.Цель этого цикла - изменить скорость u с течением времени, используя u=2*sin(2*pi*T).Это u помещается в уравнение адвекции 1D против ветра, которое затем наносится на график, чтобы показать, что происходит со временем.На данный момент, с текущей настройкой, график неподвижен в начальной позиции.Может ли кто-нибудь дать несколько полезных советов о том, как следует упорядочивать циклы for?Спасибо.

clear;
clc;
%Set initial values
xmin=0; 
xmax=1;
N=101; %Amount of segments
dt= 0.0001; % Time step
t=0; % t initial
tmax=2; % Run this test until t=2
T=t:dt:tmax
u=2*sin(2*pi*T); %Velocity

dx = (xmax - xmin)/100; %finding delta x from the given information
x =xmin-dx : dx : xmax+dx; %setting the x values that will be plugged in

h0= exp(-(x- 0.5).^2/0.01); %Initial gaussian profile for t=0
h = h0;
hp1=h0;
nsteps =tmax/dt; % total number of steps taken
for n=1 : nsteps
    h(1)=h(end-2); %Periodic B.C
    h(end)=h(2);

        for i =2 : N+1 
            for j=1:nsteps
                if u>0            
                hp1(i) = h(i) - 2*sin(2*pi*T(j))*dt/dx *( h(i)-h(i-1)); %Loop to solve the FOU 
            elseif u<0            
                hp1(i) = h(i) - 2*sin(2*pi*T(j))*dt/dx*(h(i+1)-h(i)); %downwind
                end
            end
        end

    t=t+dt; %Increase t after each iteration
    h= hp1; %have the new hp1 equal to h for the next step
    initial= exp(-(x- 0.5).^2/0.01); % The initial plot when t =0
    %hold on

    %plot(x,initial,'*') %plot initial vs moving
    plot(x,h,'o-')
    pause(0.001);
    %hold off


    %plot(x,initial) %plot end value
end

1 Ответ

1 голос
/ 05 марта 2019

Я не в состоянии оценить, правильно ли вы реализовали алгоритм, поэтому я не могу сказать, правильна ли последовательность for loops и вычисления, которые вы выполняете внутри них, тем не менее, есть ошибкакак вы определили секцию if.

Учтите, что переменная u на самом деле является массивом.

В вашей секции if:

 if u>0
    hp1(i) = h(i) - 2*sin(2*pi*T(j))*dt/dx *( h(i)-h(i-1)); %Loop to solve the FOU
 elseif u<0
    hp1(i) = h(i) - 2*sin(2*pi*T(j))*dt/dx*(h(i+1)-h(i)); %downwind
 end

вы проверяете весь массив, поэтому результат, являющийся u массивом, представляет собой массив logical (0 1) значений (по одному для каждого элемента массива u);это делает if неспособным поймать условие, которое вы ищете.

Вы должны изменить раздел if, чтобы только один элемент из u тестировался на каждой итерации, уведомление если u (j)> 0 вместо , если u> 0 (то же самое для else):

 if u(j)>0
    hp1(i) = h(i) - 2*sin(2*pi*T(j))*dt/dx *( h(i)-h(i-1)); %Loop to solve the FOU
 elseif u(j)<0
    hp1(i) = h(i) - 2*sin(2*pi*T(j))*dt/dx*(h(i+1)-h(i)); %downwind
 end

сейчас, при каждом изменении значение j-thиз массива u проверено.

Опять же, я не в состоянии судить, верен ли алгоритм, поэтому я не могу сказать, решит ли эта простая модификация проблему.

Ниже приведен рисунок, который я получил после первой итерации внешнего цикла, изменив условие if, как описано выше.

enter image description here

...