Оказывается вычисление yj[j] = y[j]; находилось внутри while{...}, Хотя по хорошему должно находится в конце цикла по дискретному времени for (j = 1; j < N; j++){...}.
Точно! Мне сразу не понравилось то место, где находился этот оператор.
И я опять задаюсь вопросом в чем измеряется это дискретное время. Видимо я сам задаю это время и мне надо его вычислить с помощью t которое растет до
.
Было бы понятно, если бы именно время
t ограничивалось пределом
1e6. Но, посмотрите, там же ограничивается
tau:
if (tau>1e6) tau = 1e6;А
tau — это не само время, а шаг по времени, прибавка. Это подтверждается операторами
t = t + tau; // получили следующий момент времени прибавкой шагаbeta[0] = Tgran(1,t); // и использовали время для вычисления граничного значенияА для шага вообще непонятно, 1) зачем его увеличивать в геометрической прогрессии и 2) зачем его доводить до огромного значения
1e6. (Кстати, в программе все величины вычисляются в системе СИ, так что
1e6 — это миллион секунд, то есть одиннадцать с половиной суток.) Шаг по времени во многих методах постоянный, в других методах — адаптивный, он уменьшается там, где функция совершает частые колебания, и увеличивается на более плавных и спокойных участках. Но чтобы каждый раз тупо, независимо ни от чего, умножать шаг
tau на
1.1 — этого я не понимаю.
Можно было бы подумать, что на самом деле ограничиваться должно время, а в программе ошибка. Но дело в том, что вот так делать
if (t>1e6) t = 1e6;тоже нет никакого смысла. Если время достигло предельного значения, надо просто выходить из цикла, а не удерживать его искусственно на этом предельном значении.