ния функции f [ x), заданной в п точках x h К г < и , является линейная интерполяция по двум точкам.
Д ля лю бого х, х , < х < х „ , значение / ( х ) приближенно заменяется формулой
f { x ) - P { x ) = . f { x ) X‘ +l Х + f { x i+l) X Х‘ Х , < * < * |+ 1,
І + 1 І І + 1 л і
описывающей прямую , которая проходит по двум точкам (хь / ( х () и (xi+1, / ( x i+1)) плоскости (х, у).
Напиш ем програм м у линейной интерполяции в двух вариантах:
1) когда f (x) задан а таблично с постоянны м ш агом ; 2) с пе
ременным.
В а р и а н т 1.
Входные данные: / ( x f), 1 х 0, Һ, х;
выходные данные: р (х).
Основным м ом ентом алгоритм а линейной интерполяции явля
ется поиск интервала [xb x i+ 1], котором у принадлеж ит точка х, где производится вычисление р(х). Ч тобы найти номер /, следует вычислить целую часть дроби [(x — x^/h]. Среди библиотечных функций ф ортран а есть соответствую щ ая функция IN T (X ), реали
зую щ ая выделение целой части. П оэтом у програм м а м ож ет иметь следующий вид:
F U N C T IO N A3S0(Y,N,X1,H,X) REA L Y (N),X 1 ,H ,P,X M ,X M 1 IN T E G E R N,M
С В Х О Д Н Ы Е П А РА М ЕТРЫ
С Y (N )— М А ССИ В ЗН А Ч Е Н И Й Ф У Н К Ц И И С N — РА ЗМ Е РН О С Т Ь М АССИВА
С Н — Ш АГ Т А Б Л И Ц Ы
С X - К О О РД И Н А Т А , В К О ТО РО Й П РО И ЗВ О Д И ТС Я С И Н Т Е Р П О Л Я Ц И Я
С В Ы Х О Д Н Ы Е П А РА М ЕТРЫ
С A3S0 П Р И Б Л И Ж Е Н Н О Е ЗН А Ч Е Н И Е Ф У Н К Ц И И В С Т О Ч К Е X
М = IN T((X —Х1)/Н) ХМ = Х1 + М*Н Х М 1 = Х М + Н
р = (Y(M )*(XM 1 - X) + Ү(М + 1 M X - Х М ))/Н A3S0 = Р
R E T U R N EN D В а р и а н т 2.
Входные данные: х ь /( х ,) , 1 < г < и, z;
выходные данные: p(z). Будем предполагать, что z ¥=хп. В этом варианте поиск интервала [х;, х ;+ 1], содерж ащ его точку z, м ож но провести различными способами. Воспользуемся просты м перебо
ром , а именно: в цикле по г, 1 < г < и , используем логический оператор IF. К огда выражение в скобках станет истинным, цикл прекратим. И м еем соответствую щ ий ф рагмент
93
1=1
1 IF (Z .G E .X (I).A N D .Z .L T .X (I+ 1)) G O TO 2 1 = 1 + 1
GO TO 1 2
Теперь полная програм м а мож ет быть полностью представлена следую щим образом:
F U N C T IO N A3S1(X,Y,N,Z) REA L X (N ),Y (N ),P,Z IN T E G E R N,I 1=1
1 IF (Z .G E .X (I).A N D .Z .L T .X (I+ 1)) GO TO 2 1 = 1 + 1
G O TO 1
2 P = (Y(I)*(X(I + 1) - Z) + Y(I + 1 )*(Z - X(I)))/(X(I + 1 ) - X(I)) A3S1 = P
R E T U R N E N D
3.3.4. Интегрирование. В качестве элементарного алгоритм а численного интегрирования примем ф ормулу Симпсона
, / т т - 1 \
С = з ( / о + 4 / м - 1 + 2 X /2i + /2J .
Здесь Һ— ш аг по оси х, f = / ( х ;), 0 < / <2т, x i+l — х ; = /г (см.
рис. 7.7). Д ля написания программы вычисления Q по значе
ниям функции f заметим, что она м ож ет быть представлена в виде
6 = (/2i + 4/2 i+ l+ /2 i+ 2 ^ - Каж дое слагаемое в сумме имеет вид
f ( x ) + 4 f { x + h ) + f ( x + 2 h ) ,
где х = x 2i, х 0 = а. П оэтом у для вычисления суммы м ож но использо
вать следующий фрагмент:
Q = 0.
Х = А
DO 1 1 = 2,N,2
Q = Q + F(X) + 4.*F(X + H) + F(X + 2.*H) 1 Х = Х + 2.*Н
Здесь N = 2m, Н = /г, А = а. Теперь уже не представляет труда оф орм ить соответствую щ ую программу:
F U N C T IO N A4S0 (A, B ,N ,F) R EA L A ,B ,H ,Q
IN T E G E R N
С ВХ О Д Н Ы Е П А РА М ЕТРЫ
С А Н И Ж Н И Й П РЕ Д Е Л И Н Т Е Г РИ РО В А Н И Я С В — ВЕРХ Н И Й П РЕ Д Е Л И Н Т Е Г РИ РО В А Н И Я
С N Ч Е Т Н О Е Ч И С Л О ОТРЕЗКОВ И Н Т Е ГРИ РО В А Н И Я С Ғ - И М Я ВНЕШ НЕЙ Ф У Н К Ц И И ВИДА
С REAL F U N C T IO N F(X) С REAL X
С В Ы Ч И С Л Я Ю Щ Е Й ЗН А Ч Е Н И Е П О Д И Н Т Е Г Р А Л Ь Н О Й С Ф У Н К Ц И И
С A4S0 — П Р И Б Л И Ж Е Н Н О Е ЗН А Ч Е Н И Е И Н Т Е ГРА Л А Н = (В —A )/N
Q = 0.
Х = А
DO 1 1 = 2 ,N,2
Q = Q + F(X ) + 4.*F (X + H) + F (X + 2.*H) 1 Х = Х + 2.*Н
Q = Q * H /3 A4S0 = Q R E T U R N EN D
В гл. 7 показано, что оценка погреш ности приближенного значения интеграла мож ет бы ть получена вычислением Q, с ш агом Н, затем Q 2 с ш агом Н /2 , а абсолю тная погреш ность е определя
ется выражением (по правилу Рунге) е = 1 0 1 - 0 2 1 /1 5 - Вычислим
2
| exp(sinx)</.x:
о
с числом отрезков разбиения интервала [0, 2], равны м N = 1 0 0 , 200.
Результаты (приближенное значение интеграла Q 2 и ошибку е) будем вы давать на терминал:
R EA L A ,B ,E ,Q 1,Q 2 IN T E G E R N E X TER N A L F
D A TA А ,В ,N /О.,2., 100/
Q 1 = A4S0 (A, B, N, F) Q2 = A4S0 (A, B,2 * N, F) E = ABS((Q1 —Q2)/15.) W R ITE (5,1) Q2.E
1 F O R M A T (2X,E13.6,2X,E13.6) EN D
С ВНЕШ Н ЯЯ Ф У Н К Ц И Я F(X) F U N C T IO N Ғ(Х)
Ғ = EXP (SIN (X)) R E T U R N EN D
3.3.5. Суммирование рядов. Суммирование конечной числовой последовательности
5 = X а, І — 1
выполняется с помощ ью оператора цикла DO тремя операторам и:
S = 0.
D O 1 1 = 1 ,N 1 S = S + A (I)
где A — имя функции-подпрограммы, вычисляющей а,. Н апример, REA L F U N C T IO N A (I)
IN T E G E R I R E T U R N EN D
С уммирование бесконечных числовых рядов 00
5 = X
;= 1
выполняется обычно с пом ощ ью цикла, организованного логичес
ким оператором IF и оператором безусловной передачи управления G O ТО. Выход из цикла осуществляется при достижении значения вычисляемой точности заданной е.
Рассм отрим программу суммирования сходящегося знакопере
менного ряда, для которого легко вычислить оценку погреш ности;
она меньше модуля первого отброш енного члена ряда
\ S - S H\= S - І at i= 1
П риведем соответствую щ ую программу:
F U N C T IO N A5S0(E,A) REA L E,S
IN T E G E R N
С В Х О Д Н Ы Е П А РА М ЕТРЫ
С Е — ЗА Д А Н Н А Я А БС О Л Ю Т Н А Я П О ГРЕШ Н О С ТЬ С А — И М Я ВНЕШ НЕЙ Ф У Н К Ц И И -П О Д П Р О Г Р А М М Ы , С В Ы Ч И С Л Я Ю Щ Е Й ОБЩ ИЙ Ч Л Е Н ЗН А К О П ЕРЕ- С М Е Н Н О ГО РЯ Д А
С В Ы Х О Д Н Ы Е П А РА М ЕТРЫ
С A5S0 — П Р И Б Л И Ж Е Н Н О Е ЗН А Ч Е Н И Е С У М М Ы РЯ Д А D A TA N ,S /1 ,0 ./
1 S = S + A (N )
IF (ABS (A (N)).GT.E) GO TO 2 GO TO 3
2 N = N + 1
G O TO 1 3 A5S0 = S
R E T U R N EN D
В качестве иллю страции применения этой п рограм м ы рас
см отрим суммирование ряда
s = Z ( - i ) 20'2+ i r i= 1
с точностью 8 = 10~4. П рограм м а м ож ет им еть вид REA L E,S
E X T E R N A L А DATA E / l .E —4 / S = A 5S0(E,A ) W R ITE (5,1) S
1 F O R M A T (2X,'S = ', E l 1.4) EN D
С
F U N C T IO N A (I) IN T E G E R I
IF (M O D (I,2).E Q .l) G O TO 1 A = 1 /( I * I + 1 )
R E T U R N 1 A = ( — l)/(I* I + 1)
R E T U R N EN D
Суммирование функциональных рядов S ( * ) = £ а М )
і=і
в области сходимости х, с точки зрения програм м ирования, приводит к незначительным усложнениям по сравнению с число
выми рядами. Действительно, пусть требуется найти S ( x ) в точках Xj, 1 < 7 < т, из области сходимости с заданной абсолю тной точностью в. Т огда эта задача сводится к суммированию т чис
ловых рядов
ОО S (*,•)= £ a , ( x j )
i= 1
с точностью 8, т. е. к задаче, рассмотренной выше. П оэтом у приведенная п рограм м а является небольш ой модификацией A5S0:
SU B R O U T IN E A 5S 1 (X, S, Е, А, Е 1, М) R E A L X (M ),S (M ),E
IN T E G E R N ,M
С В Х О Д Н Ы Е П А РА М Е Т РЫ
С X (М) — М А С С И В , С О Д ЕРЖ А Щ И Й ЗН А Ч Е Н И Я Х,В
4 Ю. П. Боглаев 97
с
К О ТО РЫ Х В Ы П О Л Н Я Е Т С Я С У М М И РО В А Н И ЕС РЯД А
С Е — ЗА Д А Н Н А Я А БС О Л Ю Т Н А Я П О ГРЕШ Н О С ТЬ С А — И М Я ВНЕШ НЕЙ Ф У Н К Ц И И , В Ы Ч И С Л Я Ю Щ Е Й С ОБЩ И Й Ч Л Е Н РЯ Д А , Д О Л Ж Н А И М Е Т Ь ВИД С REA L FU N C T IO N А (І,Х )
С REA L X С IN T E G E R I
С E l — И М Я ВНЕШ НЕЙ Ф У Н К Ц И И , В Ы Ч И С Л Я Ю Щ Е Й С Д О С Т И Г Н У Т У Ю П О ГРЕШ Н О С ТЬ, Д О Л Ж Н А
С И М Е Т Ь ВИД
С R EA L F U N C T IO N E l (I,X) С R EA L X
С IN T E G E R I
С M — РА ЗМ ЕРН О С ТЬ М АССИВА X,S С В Ы Х О Д Н Ы Е П А РА М ЕТРЫ
С S(M) — М АССИВ, С О Д ЕРЖ А Щ И Й С У М М Ы РЯ Д А В
С ТО Ч К А Х X(J)
DO 3 J = 1 ,M N = 1
S(J) = 0.
1 S (J) = S (J) + A (N, X (J))
IF (El (N,X(J)).GT.E) G O TO 2 G O TO 3
2 N = N + 1 GO TO 1 3 C O N T IN U E
R E T U R N E N D
Отличие этой програм мы от A5S0 состоит в том , что добавлен цикл по J — перебор по точкам Xj— и предполагается, что пользователь долж ен написать внешние функции-подпрограммы А(1,Х), Е1(1,Х).
П рименим программ у A5S1 для суммирования ряда .5 „2п+1
S { x ) = 2 X X
х-\-—+ ——Һ... + - --- - + .
3 5 2и+1
с абсолю тной погреш ностью 8 = 1 0 5 в точках х }= — 0,5; —0,3;
+ 0,4; + 0 ,7 . Известно, что сумма этого ряда S ( x ) = In ((1 + jc)/(1 — jc));
область сходимости | х \ < 1, оценка остатка
П рограм м а мож ет иметь вид REAL X (4), S (4), Е IN T E G E R М EX T E R N A L А ,El
D A TA E, M / l .E —5, 4 /,X / - 0 . 5 , - 0 .3 ,0 .4 Д 7 / CA LL A 5S1 (X, S, E, A, E 1, M)
W R ITE (5,1) S 1 F O R M A T (2X,4E12.5)
EN D С
F U N C T IO N A (I,X ) REA L X
IN T E G E R I
IF (M O D (I,2).E Q .l) G O TO 1 A = 0.
R E T U R N 1 1 = 2*1+ 1
A = 2 * X * * I/I R E T U R N EN D С
F U N C T IO N E l (I,X) R EA L X
IN T E G E R I
IF (M O D (I,2).E Q .l) G O TO 1 E l = 1.E10
R E T U R N 1 1 = 2* 1 + 1
E l = (A B S (X ))* * I/(I* (l —X*X)) R E T U R N
EN D
Н а примере этой програм м ы можно заметить, что она далеко не универсальна. Д ействительно, если в массив Xj внести значение х = 1, 3, лежащее вне области сходимости, то програм м а A5S1 зацикливается (нет выхода из цикла операторов с м еткам и 1 — 3) и заканчивается аварийно переполнением. О днако если пользователь знает область сходимости ряда и м ож ет оценить скорость сходимос
ти, то применение програм м ы A5S1 мож ет бы ть оправдано.
С д р у г о й с т о р о н ы , п р о г р а м м а A 5S1 с л у ж и т д л я с у м м и р о в а н и я рядов общ его вида, поэтому она более гром оздка, чем програм м а сумм ирования конкретного ряда, например, приведенного выше.
3.3.6. Фурье-анализ. П од Ф урье-анализом обычно понимается процедура определения коэффициентов ряда Фурье функции f ( x ) . В зависимости от того, в каком виде задается f { x ) (аналитически или таблично, в вещественном виде или комплексном) существует несколько процедур Ф урье-анализа. Однако в основе всех процедур леж ит вычисление интегралов по ф орм улам
л
а т = (1 /я ) | f ( x ) c o s m x d x , т = 0, 1 ,2 , ...,
— Я п
bm = ( l / n) J f ( x ) s i n m x d x , т = 1, 2, ....
Будем предполагать, что для вычисления f ( x ) м ож ет быть написана функция-подпрограмма. Количество коэффициентов ат. Ьт, под
лежащ их определению, задается парам етром М, 0 < w i< A /. Д ля вычисления интеграла воспользуемся програм м ой A4S0 с числом отрезков интегрирования п = 2к( т+ 1 ) , где коэффициент к будем задавать:
SU B R O U T IN E A6S0 (F, М , М 1,К ,А , В) REA L A (M 1),B (M ),P I,Q .R 1,R 2,R 3 IN T E G E R M ,M 1 ,K ,I1 ,N
С
С В Х О Д Н Ы Е П А РА М ЕТРЫ
С F И М Я ВНЕШ НЕЙ Ф У Н К Ц И И -П О Д П Р О Г Р А М М Ы , С В Ы Ч И С Л Я Ю Щ ЕЙ Г(Х)
С М РА ЗМ ЕРН О С ТЬ М АССИВА В
С M l РА ЗМ ЕРН О СТЬ М АССИВА А, М 1 = М + 1 С К К О Э Ф Ф И Ц И Е Н Т , О П РЕ Д Е Л Я Ю Щ И Й Ч И С Л О С ОТРЕЗКОВ И Н Т Е ГРИ РО В А Н И Я
С В Ы Х О Д Н Ы Е П А РА М ЕТРЫ
С А М АССИВ К О Э Ф Ф И Ц И ЕН ТО В Ф У РЬЕ А(1) С В М АССИВ КО ЭФ Ф И Ц И ЕН ТО В Ф У РЬЕ В (I) С
DATA P I/3.1415929/
С В Ы Ч И С Л Е Н И Е М АССИВА А Н = Р1/(К *М 1)
N = 2*K *M 1 DO 2 1 = 1 ,Ml Q = 0.
X = - P I 11 = 1 -1 DO 1 J = 2,N ,2 R l = F (X )* C O S (Il* X )
R2 = F X + H )* C O S (Il* (X + H)) R3 = F (X + 2.*H )*C O S(Il *(X + 2.*H)) 1 Q = Q + R 1 + 4 .* R 2 + R3
2 A(I) = Q *H /(3.*P I)
С В Ы Ч И С Л Е Н И Е М АССИВА В DO 4 1 = 1 , М
Q = o . Х = - P I DO 3 J = 2,N ,2 R 1 = F (X )* S IN (I* X )
R2 = F X + H )*S IN (I*(X + H)) R3 = F (X + 2.*H )*S IN (I*(X + 2.*H)) 3 Q = Q + R 1 + 4 .* R 2 + R3
4 B(I) = Q *H /(3.*P I) R ETU R N E N D
Так как в програм м е A6S0 отсутствует контроль точности вычисления интегралов, а следовательно, и значений ат, Ьт, то необходимо будет дваж ды обратиться к A6S0 с различными значениями к и 2к и воспользоваться для оценки погреш ности правилом Рунге, например
CA LL A6S0 (F, 10,11,10,А,В CA LL A6S0 (F, 10,11,20,А, В
Погрешность (массивы ЕА(1), ЕВ(1)) затем определяется в циклах типа
DO 1 1 = 1 ,M l
1 EA (I) = ABS(A1 (I) — A (I)) /15
А лгоритмы Ф урье-анализа при больших значениях т (и соответ
ственно и), основанные на общих квадратурных ф ормулах, на
пример формуле Симпсона, оказы ваю тся неэффективными.
В этом случае применяю тся разработанны е специальные быс
трые алгоритмы , учитываю щ ие специфику тригонометрических функций. Э та группа алгоритм ов обычно называется быстрым преобразованием Фурье. Если обычные алгоритм ы им ею т порядок роста числа арифметических операций 0 ( т 2), т -> со, то быстрые алгоритмы имею т порядок роста О (т log2 /и), т —> ос, что указы
вает на их более высокую эффективность. Текст фортран-про- грам м ы быстрого Ф урье-преобразования приводится, например, в [30, с. 166].
3.3.7. Численное дифференцирование. Пусть функция у [х ) задана таблично с постоянным ш агом Һ
у(Хі), 1 < г '< л , x i +l - x i = h.
Тогда для приближенного вычисления первой и второй производной можно использовать формулы
d x K 2Һ
Ъ ( Хі) *уМ - 2уЫ +уЩ 2 < К « - 1 .
d xz ' І г
П рограм м а вычисления производных у ( х) по приведенным выше ф орм улам является простой иллюстрацией использования опера
торов цикла:
SU B R O U T IN E A 7 S 0 (N ,N 2,Y ,H ,D 1,D 2) REAL Y (N), D 1 (N2), D2 (N2), H, H 1, Н2 IN T E G E R N, N2
С
С ВХ О Д Н Ы Е П А РА М ЕТРЫ
С N — РА ЗМ ЕРН О С ТЬ М АССИВА Ү
С N2 — РА ЗМ ЕРН О С ТЬ М АССИ ВА D 1 ,D 2 ,N 1 = N - 1 С ү — М АССИВ, С О Д ЕРЖ А Щ И Й ЗН А Ч Е Н И Я Ф У Н К Ц И И С В Ы Х О Д Н Ы Е П А РА М ЕТРЫ
С D 1 — М А ССИ В, С О Д ЕРЖ А Щ И Й ЗН А Ч Е Н И Я П ЕРВО Й С П РО И ЗВ О Д Н О Й
С D2 — М А ССИ В, С О Д ЕРЖ А Щ И Й ЗН А Ч Е Н И Я ВТОРОЙ С П РО И ЗВ О Д Н О Й
С
Н1 = 2.*Н Н 2 = Н * Н DO 1 1 = 2 ,N1
D1(I) = ( Y ( I + 1 ) - Y ( I —1))/Н1
1 D2 (I) = (Y (1+ lj —2.* Y (l) + Ү (I — 1))/Н2 R E T U R N
EN D