― информация, которая обычно не представляет интереса для пользователя, но необходима при последующих вызовах. 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.
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 – счетчик числа вычислений функции. Попытки получить по этой подпрограмме более высокую точность обычно стоят очень дорого и зачастую безуспешны.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.