
Програмки с отчётами по числакам / 3. Краевая задача для ОДУ 2 порядка / Формулы3
.docxОбщая постановка задачи
|
|
граничные условия:
|
|
|
|
Программа
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 |