|
Документ взят из кэша поисковой машины. Адрес
оригинального документа
: http://num-anal.srcc.msu.su/lib_na/cat/i_htm_p/id10r_p.htm
Дата изменения: Thu Nov 5 13:04:29 2015 Дата индексирования: Sun Apr 10 01:17:27 2016 Кодировка: Windows-1251 |
|
Текст подпрограммы и версий id10r_p.zip , id10e_p.zip |
Тексты тестовых примеров tid10r_p.zip , tid10e_p.zip |
Вычисление первой или второй производной вещественной таблично - заданной функции на равномерной сетке с использованием центральных разностей.
ID10R вычисляет либо первые, либо вторые производные таблично - заданной функции на равномерной сетке с шагом h с использованием центральных разностей по формулам Стирлинга.
И.С.Березин, Н.П.Жидков, Методы вычислений, т.1, M., 1962.
procedure ID10R(H :Real; var Y :Array of Real; MU :Integer;
NL :Integer; NS :Integer; NU :Integer; NO :Integer;
LO :Integer; NTH :Integer; T :Real;
var A :Array of Real; var E :Array of Real;
var LA :Integer; var IERR :Integer);
Параметры
| H - | заданный шаг равномерной сетки (тип: вещественный); |
| Y - | вещественный двумерный массив, в котоpом задается таблица значений функции и центральных разностей (см. описание параметра LO); размерность массива Y должна быть при LO = 0 pавна MU на (NO + 1), при LO = 1 - MU на [(NO + 3)/2], при LO = 2 - MU на [(NO + 4)/2]; |
| MU - | заданное число стpок в описании размерности двумерного массива Y в программе, вызывающей данную программу (тип: целый); |
| NL, NS - NU | определяют расположение в массиве Y заданных значений функций, а именно, значения функции y0, y1, y2, ..., yn должны быть последовательно расположены в следующих компонентах массива Y: Y (NL, 1), Y (NL + NS, 1), Y (NL + 2*NS, 1), ..., Y (NU, 1); расположение в массиве Y центральных разностей определяется ниже при описании параметра LO (тип: целый); |
| NO - | заданный максимальный порядок разностей, которые используются в конечно - разностных аппроксимациях производных (тип: целый); |
| LO - | определяет порядок расположения заданных центральных разностей в массиве Y (тип: целый); при этом если: |
| LO = 0 - | то δ 2j - 1yi - 1/2 должна быть расположена в элементе массива Y (NL + I* NS - [NS/2], 2*J), а δ 2jyi - в элементе массива Y (NL + I*NS, 2*J + 1); |
| LO = 1 - | то δ 2j - 1yi - 1/2 должна быть расположена в элементе массива Y (NL + I* NS - [NS/2], J + 1), а δ 2jyi - в элементе массива Y (NL + I*NS, J + 1); |
| LO = 2 - | то δ 2j - 1yi - 1/2 должна быть расположена в элементе массива Y(NL + I* NS - [NS/2], J + 1), а δ 2jyi - в элементе массива Y (NL + I*NS, J + 2); |
| NHT - | полагается равным 1, если надо вычислить первую производную, или 2, если - вторую; |
| T - | заданная точность вычисления производных (тип: вещественный); |
| A - | вещественный вектоp длины NU, в котоpом помещаются вычисленные значения первой или второй производной последовательно в следующем порядке A (NL), A (NL + NS), A (NL + 2*NS), ... ,A (NU); |
| E - | вещественный вектоp длины NU, в котоpом помещаются последние члены ряда, использованные в конечно - разностной аппроксимации, в следующем порядке E (NL), E (NL + NS), E (NL + 2*NS),...,E (NU); |
| LA - | целая переменная, значение которой полагается равным наивысшему порядку разностей, фактически использованных в вычислениях; |
| IERR - | целая переменная, служащая для сообщения об ошибках, обнаруженных в ходе работы подпрограммы; при этом: |
| IERR= 1 - | когда для достижения заданной точности требуются разности более высокого порядка, чем они заданы при обращении к подпрограмме; производные вычисляются, хотя требуемая точность не достигнута; |
| IERR= 2 - | когда разности порядка NO pасходятся; производные вычисляются, хотя требуемая точность не достигнута; |
| IERR= 3 - | когда разности порядка LA (LA < NO) расходятся; производные вычисляются, хотя требуемая точность не достигнута; |
| IERR=65 - | когда значение NTH ≠ 1 или ≠ 2; |
| IERR=66 - | когда неправильно задан порядок разностей; порядок разностей должен быть по крайней меpе, не ниже порядка вычисляемой производной; |
| IERR=67 - | когда не заданы разности нечетного порядка и требуется вычислить первую производную; |
| IERR=68 - | когда не заданы разности четного порядка и требуется вычислить вторую производную. |
Версии
| ID10E - | вычисление первой или второй производной вещественной таблично - заданной функции на pавномеpной сетке с использованием центральных разностей с расширенной (Extended) точностью. |
Вызываемые подпрограммы
| UTID10 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы ID10R. |
| UTID11 - | подпрограмма выдачи диагностических сообщений при работе подпрограммы ID10E. |
Замечания по использованию
| 1. |
Для ID10E параметры H, Y, T, A и E должны иметь тип Extended. | |
| 2. |
Значение параметра MU должно быть больше или pавно значению параметра NU. | |
| 3. |
Формула вычисления первой производной использует разности только нечетных порядков. Поэтому можно задать LO = 2 и NS = 1. | |
| 4. |
Формула вычисления второй производной использует разности только четных порядков. Поэтому можно задать LO = 1 и NS = 1. | |
| 5. |
Заданная точность считается достигнутой, если следующий член ряда конечно - разностной аппроксимации меньше или pавен T. | |
| 6. |
Конечно - разностные аппроксимации не могут быть использованы в конце таблицы задания функции. Поэтому следует увеличить таблицу значений функции и ее разностей перед обращением к подпрограмме для вычисления производных вблизи конца таблицы. | |
| 7. | Для вычисления соответствующего числа центральных разностей рекомендуется использовать подпрограмму I I10R. |
Unit TID10R_p;
interface
uses
SysUtils, Math, { Delphi }
Lstruct, Lfunc, UtRes_p, II10R_p, ID10R_p;
function TID10R: String;
implementation
function TID10R: String;
var
NTH,I,J,MU,NL,NS,NU,LO,NO,LA,IERR,_i :Integer;
H,XN,X,T :Real;
Y :Array [0..49] of Real;
A :Array [0..9] of Real;
E :Array [0..9] of Real;
label
_3,_1,_2;
begin
Result := ''; { результат функции }
for _i:=0 to 9 do //начальное обнуление массива
begin
A[_i] := 0.0;
E[_i] := 0.0;
end;
H := 0.25;
XN := 2.0;
X := XN-H;
NТН := 1;
T := 1.E-4;
for I:=1 to 10 do
begin
for J:=1 to 5 do
begin
_3:
Y[(I-1)+(J-1)*10] := 0.0;
end;
end;
for I:=1 to 10 do
begin
X := X+H;
Y[(I-1)+0] := Exp(-X);
_1:
end;
MU := 10;
NL := 1;
NS := 1;
NU := 10;
LO := 2;
NO := 6;
II10R(MU,NL,NS,NU,NO,LO,Y);
Result := Result + #$0D#$0A;
for J:=1 to 5 do
begin
for I:=1 to 1 do
begin
Result := Result + Format('%20.16f ',[Y[(I-1)+(J-1)*10]]) + #$0D#$0A;
end;
end;
Result := Result + #$0D#$0A;
ID10R(H,Y,MU,NL,NS,NU,NO,LO,NTH,T,A,E,LA,IERR);
for I:=1 to 10 do
begin
Result := Result + Format('%s',[' A']);
Result := Result + Format('%s',[' E' + #$0D#$0A]);
Result := Result + Format(' %20.16f %20.16f ',
[A[I-1],E[I-1]]) + #$0D#$0A;
_2:
end;
UtRes('TID10R',Result); { вывод результатов в файл TID10R.res }
exit;
end;
end.
Результат:
X A E
2. -6.207939493-02 0.000000000+00
2.25 -1.081979987-01 2.160001819-05
2.50 -8.205740855-02 1.682211116-05
2.75 -6.392797405-02 -8.498944868-06
3.00 -4.978715625-02 -6.618985062-06
3.25 -3.877427628-02 -5.154870644-06
3.50 -3.019743673-02 -4.014617251-06
3.75 -2.343970501-02 7.495577201-05
4.00 -1.832136756-02 7.671346584-05
4.25 -8.102809959-03 0.000000000+00