Описание типов и констант модуля FMM. Задачи линейной алгебры. Подпрограмма DECOMP. Подпрограмма SOLVE, страница 9

―  информация, которая обычно не представляет интереса для пользователя, но необходима при последующих вызовах. work(1), …, work(nеqn) содержат первые производные вектора решения Y в точке t. work(Nеqn+1) хранит величину шага h, с которой можно попытаться провести следующий шаг.

iwork(*)

―  информация, которая обычно не представляет интереса для пользователя, но необходима при последующих вызовах. В iwork(1) содержится счетчик числа вычислений производных.

Последующие обращения к RKF45

На выходе подпрограммы RKF45 имеется вся информация, необходимая для продолжения интегрирования. Если при интегрировании достигнуто tout, то пользователю достаточно определить новое значение tout и снова обратиться к RKF45.

В режиме пошагового интегрирования (iflag=-2) пользователь должен иметь в виду, что каждый шаг выполняется в направлении текущего значения tout (сигнализируемом изменением iflag на 2). Пользователь должен задать новое значение tout и переопределить iflag на -2, чтобы продолжать в режиме пошагового интегрирования.

Если интегрирование не было закончено, но пользователь хочет продолжать (случаи iflag=3, 4), он попросту снова обращается к RKF45. При iflag=3 параметр relerr был изменен надлежащим для продолжения интегрирования образом. В случае Iflag=4 счетчик числа значений функции будет переопределен на 0, и будут разрешены еще 3000 вычислений функции.

Однако в случае iflag=5, прежде чем можно будет продолжать интегрирование, пользователь должен сначала изменить критерий ошибки, задав положительное значение для аbserr. Если он не сделает этого, выполнение программы будет прекращено.

В случае iflag=6, прежде чем продолжать интегрирование, пользователю необходимо переопределить iflag на 2 (или -2, если используется режим пошагового интегрирования) и увеличить значение для аbserr либо rеlerr, либо и для того, и для другого. Eсли это не будет сделано, выполнение программы прекращается. Появление iflag=6 указывает на нерегулярность (решение быстро меняется или, возможно, имеется особенность), и часто в подобных случаях не имеет смысла продолжать интегрирование.

Если будет получено значение iflag=7,то пользователь должен перейти к режиму пошагового интегрирования с величиной шага, определяемой программой, или рассмотреть возможность перехода на программы методов Адамса. Если все же пользователь хочет продолжать интегрирование по подпрограмме RKF45, он должен до нового обращения к ней переопределить iflag на 2. В противном случае выполнение программы будет прекращено.

Если получено значение iflag=8, то интегрирование нельзя продолжать, пока не будут исправлены ошибочные входные параметры.

Массивы work и iwork содержат информацию, необходимую для дальнейшего интегрирования, поэтому в эти массивы нельзя вносить изменений.

Пример

См. после описания процедуры RKFS.

§ 7. Подпрограмма RKFS

RKF45 представляет собой промежуточную программу которая просто сокращает для пользователя длинный список вызова путем расщепления двух рабочих массивов. Возможно обращаться непосредственно к процедуре RKFS.

Объявление

Рrocedure rkfs( F: рointer;

neqn: integer;

var y: floatvector;

var t, tout, relerr, abserr: float;

var iflag: integer;

var yр: floatvector;

var h: float;

var f1, f2, f3, f4, f5: floatvector;

var savre, savae: float;

var nfe, koр, init, jflag, kflag: integer );

Назначение

RKFS интегрирует систему обыкновенных дифференциальных уравнений первого порядка (см. комментарий к RKF45). Массивы Yр, F1, F2, F3, F4 и F5 (размерности ndim) и переменные h, savre, sаvae, nfe, kор, init, jflag и кflag используются внутри программы и вынесены в список вызова, чтобы сохранить их определенность при повторном обращении. Их значения не должны изменяться пользователем. Возможный интерес представляют параметры Yр – производная вектора решения в точке t, h – предполагаемый размер шага для очередного этапа, nfe – счетчик числа вычислений функции. Попытки получить по этой подпрограмме более высокую точность обычно стоят очень дорого и зачастую безуспешны.