Я не в состоянии оценить, правильно ли вы реализовали алгоритм, поэтому я не могу сказать, правильна ли последовательность 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
, как описано выше.