Скачиваний:
42
Добавлен:
10.05.2014
Размер:
25.31 Кб
Скачать

Общая постановка задачи

граничные условия:

Программа

real :: h,an

real, allocatable :: al(:),bet(:),x(:),y(:),a(:),b(:),c(:),d(:)

integer ::i,j,k,L,N

character :: ans

10 open (1,file='3.txt')

print*,'Reshaem na intervale [0,1]'

print*,'vvedite shag'

read*,h

N=1/h

print*,'1.Reshaem zadachu 1'

print*,'2.Reshaem zadachu 2'

read*,ans

if (ans=='1') goto 1

if (ans=='2') goto 2

1 allocate (al(N),bet(N),x(0:N),y(0:N),a(0:N),b(0:N),c(0:N),d(0:N))

x(0)=0

Далее вводим коэффициенты уравнения , аппроксимирующего функцию на левой границе с 1 порядком, по формуле:

где

Конечная формула:

a(0)=0

b(0)=1.+2.*h

c(0)=-1.

d(0)=-h

Следующий кусок – аппроксимация внутри, формулы для него:

где

do i=1,N-1

x(i)=x(i-1)+h

a(i)=1./h**2-1./(1.+x(i))/2./h

b(i)=-2./h**2+1./(1.+x(i))**2

c(i)=1./h**2+1./(1.+x(i))/2./h

d(i)=(2.+6.*x(i)+5.*x(i)**2)/(1.+x(i))**2

end do

x(N)=1.

Далее вводим коэффициенты уравнения , аппроксимирующего функцию на правой границе с 1 порядком, используя соотношения:

где

a(N)=1.

b(N)=-1.-3.*h

c(N)=0

d(N)=-7.3015*h

Далее прогонка в прямом и обратном направлении, без изменений. al и bet – прогоночные коэффициенты (см. лекцию)

al(1)=-c(0)/b(0)

bet(1)=d(0)/b(0)

do i=1,N-1

al(i+1)=-c(i)/(a(i)*al(i)+b(i))

bet(i+1)=(d(i)-a(i)*bet(i))/(a(i)*al(i)+b(i))

end do

y(N)=(d(N)-a(N)*bet(N))/(a(N)*al(N)+b(N))

do i=N,1,-1

y(i-1)=al(i)*y(i)+bet(i)

end do

Наконец, вывод полученных значений с погрешностью на экран и в файл. Заодно освобождаем память из-под массивов al,bet,x,y…

do i=1,N

an=x(i)*x(i)+sin(alog(1+x(i)))

print '(i3,A,f6.2,A,f10.6,A,f10.6,A,e11.3)',i,' |',x(i),' |',y(i),' |',an,' |',abs(an-y(i))

write(1,'(f4.2,f11.6,f11.6,e12.3)'),x(i),y(i),an,abs(an-y(i))

end do

deallocate(al,bet,x,y,a,b,c,d)

goto 3

Вторая часть программы: аппроксимация со 2 порядком. На левой границе:

где

Конечная формула:

2 allocate (al(N),bet(N),x(0:N),y(0:N),a(0:N),b(0:N),c(0:N),d(0:N))

x(0)=0

a(0)=0

b(0)=1.+2.*h-1.5*h**2

c(0)=-1.

d(0)=-h-h*h/2

Аппроксимация во внутренних точках сохраняется

do i=1,N-1

x(i)=x(i-1)+h

a(i)=1./h**2-1./(1.+x(i))/2./h

b(i)=-2./h**2+1./(1.+x(i))**2

c(i)=1./h**2+1./(1.+x(i))/2./h

d(i)=(2.+6.*x(i)+5.*x(i)**2)/(1.+x(i))**2

end do

x(N)=1.

Аппроксимация на правой границе по формулам:

где

a(N)=1.

b(N)=-1.-3.*h-5./8.*h**2

c(N)=0

d(N)=-7.3015*h-1.603/8.0*h**2

Прогонка и вывод без изменений

al(1)=-c(0)/b(0)

bet(1)=d(0)/b(0)

do i=1,N-1

al(i+1)=-c(i)/(a(i)*al(i)+b(i))

bet(i+1)=(d(i)-a(i)*bet(i))/(a(i)*al(i)+b(i))

end do

y(N)=(d(N)-a(N)*bet(N))/(a(N)*al(N)+b(N))

do i=N,1,-1

y(i-1)=al(i)*y(i)+bet(i)

end do

do i=1,N

an=x(i)*x(i)+sin(alog(1+x(i)))

print '(i3,A,f6.2,A,f10.6,A,f10.6,A,e11.3)',i,' |',x(i),' |',y(i),' |',an,' |',abs(an-y(i))

write(1,'(f4.2,f11.6,f11.6,e12.3)'),x(i),y(i),an,abs(an-y(i))

end do

deallocate(al,bet,x,y,a,b,c,d)

Третья часть программы – завершение, закрытие файла

3 close (1)

print*,'ewe raz? (1/0)'

read*,i

if (i==1) then

goto 10

end if

end

Соседние файлы в папке 3. Краевая задача для ОДУ 2 порядка