Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчёт(1 задание).docx
Скачиваний:
15
Добавлен:
16.04.2015
Размер:
76.09 Кб
Скачать

Implicit none

include 'link_fnl_static.h'

parameter mxparam=50

!nr - число точек на координатной оси

!nt - число точек на временной оси

real*8 param(mxparam),y(n),yprime(n),t,tend,phi,

& tfinish,ht,tol,yy(n,nt+2),a(1,1),u,htrial,eps,err(n)

integer i,ido,l,m,j,nstep,nfcn,nje

external fcn,fcnj

open(1,file='out_ur.dat')

open(2,file='out_ut.dat')

open(3,file='param.dat')

open(4,file='error.dat')

param=0.0

param(4)=5000000.0 !макс число шагов

param(10)=1.0 !вычисляем абс ошибку

param(12)=2.0 !используем метод Гира дифференцирования назад

param(13)=1.0 !метод хорд с аналит зад якоб

param(14)=1.0 !задаёт ленточный несимм. вид массива dypdy

param(15)=1.0 !число нижних кодиагоналей

param(16)=1.0 !число верхних кодиагоналей

param(19)=0.0 !явная система,матрица А не используется

tol=1.0e-7 !допуск ошибки

rl=2.0d0 !левая граница по радиусу

rr=10.0d0 !правая граница по радиусу

hr=(rr-rl)/(n-1) !шаг по координате

t=0.0d0 !начальный момент времени

ro(1)=rl;y(1)=phi(ro(1))

yy(1,1)=ro(1)

write(*,*)ro(1)

do i=2,n

ro(i)=ro(i-1)+hr !задание основной коорд. сетки

y(i)=phi(ro(i)) !и начальных значений y(i)

write(*,*)ro(i)

yy(i,1)=ro(i) !столбец с координатами точек сетки

if(i.ne.n) then

end if

end do

do i=1,n

yy(i,2)=y(i) !столбец начальных значений

end do

tfinish=10.0d0 !конечный момент времени

ht=tfinish/nt !шаг по времени

ido=1.0 !метка,характериз. стадию вычислений

write(2,88)t,y

do i=1,nt !решение системы из nr дифф. уравнений

tend=t+ht !в момент времени tend

call divpag(ido,n,fcn,fcnj,a,t,tend,tol,param,y)

if(ido==2) then

do l=1,n

yy(l,i+2)=y(l)

end do

write(2,88)t,y !вывод зависимости U(t)в разных точках сетки

else

write(1,*)'ido = ',ido

end if

!вывод погрешности в узлах в разные моменты времени

write(4,*)

do m=1,n

write(4,*) dabs(u(ro(m),t)-y(m))

end do

end do

eps=0.0d0

do i=1,n

if(dabs(y(i)-u(ro(i),t)).gt.eps) then

eps=dabs(y(i)-u(ro(i),t))

end if

end do

do j=1,n !вывод зависимости U(r)в разные мом. времени

write(1,88)(yy(j,i),i=2,nt+2)

end do

write(1,88) t,eps

do i=1,n

write(1,88)ro(i),u(ro(i),t),y(i)

end do

write(1,88)

!вывод параметров для сравнения эффективности программ

nstep=param(34);nfcn=param(35)

nje=param(36);htrial=param(31)

write(3,*)"nstep = ",nstep

write(3,*)"nfcn = ",nfcn

write(3,*)"nje = ",nje

write(3,*)"htrial = ",htrial

ido=3.0

88 format(1x,23(e11.4,1x))

end program task1

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

subroutine fcn(nr,t,y,yprime)

use datamod

real*8 y(nr),yprime(nr),k,q,f,onu,tnu,t

! kapa=0.0d0 !1 u=1

kapa=1.0d0 !3 u=r*e^(-t)

yprime(1)=((rl+0.5d0*hr)*k(rl+0.5d0*hr,t)/hr*(y(2)-

& y(1))+rl*onu(t)-0.5d0*hr*rl*q(rl,t)*y(1)+0.5d0*hr*rl*f(rl,t))/

& (0.5d0*hr*rl)

do i=2,nr-1

yprime(i)=((ro(i)+0.5d0*hr)*k(ro(i)+0.5d0*hr,t)/hr*(y(i+1)-y(i))-

& (ro(i)-0.5d0*hr)*k(ro(i)-0.5d0*hr,t)/hr*(y(i)-y(i-1))-

& hr*ro(i)*q(ro(i),t)*y(i)+hr*ro(i)*f(ro(i),t))/

& (hr*ro(i))

end do

yprime(nr)=(-rr*(kapa*y(nr)-tnu(t))-(rr-0.5d0*hr)*k(rr-0.5d0*hr,t)

&*(y(nr)-y(nr-1))/hr-0.5d0*hr*rr*q(rr,t)*y(nr)+0.5d0*hr*rr*f(rr,t))

& /(0.5d0*hr*rr)

end

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

subroutine fcnj(nr,t,y,dypdy)

use datamod

real*8 t,y(nr),dypdy(3,nr),k,q,f,onu,tnu

!задаём коэфф. матрицы якоби

dypdy(1,1)=0.0d0

dypdy(2,1)=(-(rl+0.5d0*hr)*k(rl+0.5d0*hr,t)/hr-0.5d0*hr*rl*

& q(rl,t))/(0.5d0*hr*rl)

dypdy(3,1)=((ro(2)-0.5d0*hr)*k(ro(2)-0.5d0*hr,t)/hr)/

& (hr*ro(2))

do i=2,nr-1

if(i.eq.2) then

dypdy(1,i)=(ro(i-1)+0.5d0*hr)*k(ro(i-1)+0.5d0*hr,t)/hr/

& (0.5d0*hr*ro(i-1))

else

dypdy(1,i)=(ro(i-1)+0.5d0*hr)*k(ro(i-1)+0.5d0*hr,t)/hr/

& (hr*ro(i-1))

end if

dypdy(2,i)=(-(ro(i)+0.5d0*hr)*k(ro(i)+0.5d0*hr,t)/hr-

& (ro(i)-0.5d0*hr)*k(ro(i)-0.5d0*hr,t)/hr-hr*ro(i)*q(ro(i),t))/

& (hr*ro(i))

if(i.ne.(nr-1))then

dypdy(3,i)=((ro(i+1)-0.5d0*hr)*k(ro(i+1)-0.5d0*hr,t)/hr)/

& (hr*ro(i+1))

end if

end do

dypdy(1,nr)=(ro(nr-1)+0.5d0*hr)*k(ro(nr-1)+0.5d0*hr,t)/hr/

& (hr*ro(nr-1))

dypdy(2,nr)=(-rr*kapa-(rr-0.5d0*hr)*k(rr-0.5d0*hr,t)/hr-

& 0.5d0*hr*rr*q(rr,t))/(0.5d0*hr*rr)

dypdy(3,nr-1)=((ro(nr)-0.5d0*hr)*k(ro(nr)-0.5d0*hr,t)/hr)/

& (0.5d0*hr*rr)

dypdy(3,nr)=0.0d0

end

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

double precision function k(r,t)

real*8 r,t

! k=1.0d0 !1

k=r**2.0d0

end

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

double precision function q(r,t)

implicit real*8 (a-h,k,o-z)

! q=0.0d0 !1

q=r*dexp(0.01d0*t)

end

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

double precision function f(r,t)

real*8 r,t

! f=0.0d0 !1

f=-3.01d0*r*dexp(-0.01d0*t)+r**2

end

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

double precision function onu(t) !ню один

real*8 t

! onu=0.0d0 !1

onu=-4.0d0*dexp(-0.01d0*t)

end

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

double precision function tnu(t) !ню два

real*8 t

! tnu=0.0d0 !1

tnu=110.0d0*dexp(-0.01d0*t)

end

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

double precision function phi(r) !начальное условие

real*8 r

! phi=1.0d0 !1

phi=r

end

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

double precision function U(r,t) !точное решение

real*8 r,t

! u=1.0d0

u=r*dexp(-0.01d0*t)

end

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

8. Зависимость погрешности решения от числа разбиений интервала интегрирования по пространственной переменной в фиксированный момент времени Т (конец интервала интегрирования).

Таблица результатов работы программы на тестах (зависимость Чебышевской нормы погрешности решения от удваивающегося количества разбиений).N=20

Метод Рунге-Кутта:

Тест 1

Тест 2

k

1

0.0000E+00

----

0.2217E-01

----

2

0.0000E+00

----

0.5327E-02

4,16E+00

3

0.0000E+00

----

0.1302E-02

4,09E+00

4

0.0000E+00

----

0.3217E-03

4,05E+00

5

0.0000E+00

----

0.7994E-04

4,02E+00

Табл. 1.

Метод Гира с численным вычислением матрицы Якоби:

Тест 1

Тест 2

k

1

0.0000E+00

----

0.2217E-01

----

2

0.0000E+00

----

0.5327E-02

4,16E+00

3

0.0000E+00

----

0.1302E-02

4,09E+00

4

0.0000E+00

----

0.3217E-03

4,05E+00

5

0.0000E+00

----

0.8004E-04

4,02E+00

Табл. 2.

Метод Гира с аналитическим вычислением матрицы Якоби:

Тест 1

Тест 2

k

1

0.0000E+00

----

0.2217E-01

----

2

0.0000E+00

----

0.5327E-02

4,16E+00

3

0.0000E+00

----

0.1302E-02

4,09E+00

4

0.0000E+00

----

0.3217E-03

4,05E+00

5

0.0000E+00

----

0.8004E-04

4,02E+00

Табл. 3.

9. Вывод об оценке порядка точности разностной схемы по пространственной переменной по результатам табл. 1-3.

По результатам таблиц 1-3 разностная схема имеет второй порядок точности по пространственной переменной, т.к. с увеличением числа разбиений в два раза чебышевская норма погрешности уменьшается в 4 раза.

10. Оценка эффективности работы подпрограмм IVPRK и IVPAG на тестах.

Тест №1.

Метод Рунге-Кутта.

k

Величина

последнего

шага

Число

шагов

Число

вычислений

правой части

Число

вычислений

матрицы Якоби

1

0.5

23

184

0

2

0.5

23

184

0

3

0.5

23

184

0

4

0.5

23

184

0

5

0.5

23

184

0

Метод Гира с численным вычислением ленточной матрицы Якоби:

k

Величина

последнего

шага

Число

шагов

Число

вычислений

правой части

Число

вычислений

матрицы Якоби

1

5

5

46

2

2

5

5

86

2

3

5

5

166

2

4

5

5

326

2

5

5

5

646

2

Метод Гира с аналитическим вычислением ленточной матрицы Якоби:

k

Величина

последнего

шага

Число

шагов

Число

вычислений

правой части

Число

вычислений

матрицы Якоби

1

5

5

6

2

2

5

5

6

2

3

5

5

6

2

4

5

5

6

2

5

5

5

6

2

Тест №2.

Метод Рунге-Кутта.

k

Величина

последнего

шага

Число

шагов

Число

вычислений

правой части

Число

вычислений

матрицы Якоби

1

1.653698299275419E-003

4871

43721

0

2

4.256709891485855E-004

21532

193956

0

3

7.387772536304738E-005

91012

821721

0

4

2.003697105834590E-005

375523

3390318

0

5

5.212606627225114E-006

1528847

13804404

0

Метод Гира с численным вычислением ленточной матрицы Якоби:

k

Величина

последнего

шага

Число

шагов

Число

вычислений

правой части

Число

вычислений

матрицы Якоби

1

2.39132091241583

119

632

24

2

2.25971699230220

106

1059

23

3

1.35843331127791

87

1881

22

4

2.74058010078488

62

2810

17

5

3.28309397551500

44

4222

13

Метод Гира с аналитическим вычислением ленточной матрицы Якоби:

k

Величина

последнего

шага

Число

шагов

Число

вычислений

правой части

Число

вычислений

матрицы Якоби

1

2.39132096455194

119

152

24

2

2.25971650989382

106

139

23

3

1.35843352104231

87

121

22

4

2.74058018793197

62

90

17

5

3.28309598153478

44

62

13

11. Выводы об эффективности применения подпрограмм IVPRK и IVPAG с использованием явных и неявных методов численного интегрирования.

Самым быстрым методом оказался тот, где использовалась подпрограмма IVPAG с аналитическим вычислением матрицы Якоби. При решении жестких дифференциальных уравнений применение IVPRK оказывается невозможным, а IVPAG справляется с поставленной задачей. В случае данных тестовых задач самым эффективным оказалось применение подпрограммы IVPAG с аналитическим заданием матрицы Якоби.