- •Часть I
- •Implicit none
- •Часть II Решение задачи на собственные значения для обыкновенного дифференциального уравнения второго порядка
- •Постановка задачи (вариант 2s).
- •Вывод разностной схемы для уравнения и граничных условий.
- •Данная система является 3-х диагональной,приведём подобные члены в уравнениях разностной схемы при -ых:
- •Implicit none
Часть II Решение задачи на собственные значения для обыкновенного дифференциального уравнения второго порядка
Постановка задачи (вариант 2s).
Задача на
собственные значения:
Вывод разностной схемы для уравнения и граничных условий.
Сводим задачу к алгебраической задаче на собственные значения интегро-интерполяционным методом.
Используем приближённую формулу для вычисления интеграла:
И с помощью формулы центральных разностей получаем:
В итоге получим разностную схему для задачи на собственные значения.
Система из n+1 алгебраических уравнений:
Данная система является 3-х диагональной,приведём подобные члены в уравнениях разностной схемы при -ых:
Таким образом мы
свели задачу к обобщённой алгебраической
задаче на собственные значения
Элементы нижней диагонали матрицы А - ,
главной диагонали - ,
верхней диагонали - ,
Элементы матрицы
(главная
диагональ) ,
Приведение обобщённой алгебраической задачи на собственные значения к классическому виду. Вид коэффициентов матрицы в классической формулировке.
– классическая задача на собственные
значения, но тогда теряется симметричность,
так как
.Матрица
D
симметричная и положительно определённая.
Элементы матрицы
Свели обобщённую алгебраическую задачу на собственные значения к классической симметричной задаче.
Элементы нижней
диагонали матрицы С -
,
главной диагонали
-
,
верхней диагонали
-
,
Формулировка тестовой задачи для
и
.
Общее решение данной задачи:
, B=0
в силу ограниченности u(r)
при r=0
–уравнение для поиска собственных
чисел
.
Численно находим и подставляем их в собственные функции тестовой задачи.
– собственные функции.
Программа на фортране
program Lab1
Implicit none
include 'link_fnl_static.h'
integer i,j
integer,parameter :: n=9,n1=n+1,ncoda=1,Lda=2,Ldevec=n1
real(8) k,u1,u2,q
external k,u1,u2,q
real(8) r(n1),c(Lda,n1),delta,d1(n1,n1)
real(8) eval(n1),evec(Ldevec,n1)
real(8) eps1,nu,h,v(Ldevec,n1),episf,l,l1
!Переменные для поиска точных значений с.ч.
integer,parameter::nroot=9
integer info(nroot),itmax,maxfn
real(8) errabs,errrel,m,p,x(nroot),xguess(nroot),eps,eta
real(8),external::f
nu=0.0
h=2.0/n
r(1)=0.0
do i=2,n1
r(i)=r(i-1)+h
end do
open(1,file='out.dat')
write(1,*) "Число узлов : ",n1
write(1,*) "Шаг : ",h
write(1,*) "Узлы основной сетки : "
do i=1,n1
!write(1,*) r(i)
end do
write(1,*)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!Решение задачи при К=1 и q=0
!U(r)=sin(r*x**0.5)/r собственные функции
!x**0.5=tg(2*x**0.5) уравнение для собственных значений
data xguess/-1.0e-6,4,14,30,49.5,74,104,138.2,177.7/ !начальное приближение корней
errabs=1.0e-6 !первый критерий завершения вычислений
errrel=1.0e-6 !относительная погрешность соседних аппроксимаций
eps=1.0e-4 !критерий локализации кратных корней
eta=1.0e-4; itmax=1000
call dzreal(f,errabs,errrel,eps,eta,nroot,itmax,xguess,x,info)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!Задание матрицы D^(-1/2)
d1(1,1)=sqrt((h**3)/24.0)**(-1)
do i=2,n
d1(i,i)=sqrt(h*r(i)**2)**(-1)
end do
d1(n1,n1)=sqrt(0.5*h*r(n1)**2)**(-1)
write(1,*) "Матрица D^-1/2 :"
write(1,*)
! write(1,'(<n1>F6.3)') ((d1(i,j),j=1,n1),i=1,n1)
write(1,*)
!Задание ленточной матрицы а
c(1,1)=0.0
c(1,2)=-k(0.5*h)/(h*r(2))*dsqrt(1.5d0)
c(2,1)=q(r(1))+6*k(0.5*h)/h**2
c(2,2)=q(r(2))+(k(1.5*h)*(1.5*h)**2+k(0.5*h)*(0.5*h)**2)/(h**4)
do i=3,n1-1
c(1,i)=-(r(i-1)+0.5*h)**2*k(r(i-1)+0.5*h)/(h**2*r(i-1)*r(i))
c(2,i)=q(r(i))+(k(r(i)+0.5*h)*(r(i)+0.5*h)**2+k(r(i)-0.5*h)*(r(i)-0.5*h)**2)/(h**2*r(i)**2)
end do
c(1,n1)=-k(r(n1)-0.5*h)*(r(n1)-0.5*h)**2/(r(n1)*r(n1-1)*h**2)*dsqrt(2.0d0)
c(2,n1)=q(r(n1))+2*k(r(n1)-0.5*h)*(r(n1)-0.5*h)**2/(h**2*r(n1)**2)
! write(1,*) " Ленточная матрица с = "
! write(1,*) ((c(j,i),i=1,n1),j=1,2)
!evec=(D^1/2)*V , V=D^(-1/2)*evec
call DEVCSB(n1,c,Lda,ncoda,eval,evec,Ldevec)
v=matmul(d1,evec)
! write(1,*) "Приближённые значения собственных векторов :"
! write(1,'(<n1>F6.2)') ((v(i,j),j=1,n1),i=1,n1)
write(1,*)
!!!!!!!!!!!!!!!!!!!!!! 2 c.в.
l=0.0
do i=1,n1
if (i==1) then
l=l+sqrt(x(2))
else
l=l+u1(r(i))
end if
end do
write(1,*) "длина точного св 2 = ",sqrt(l)
l1=0.0
do i=1,n1
l1=l1+v(i,n1-1)
end do
write(1,*) "длина приближённого св 2 = ",sqrt(l1)
write(1,*)
write(1,*) "Приближённые и точные значения собственного вектора 2(нормированные) :"
do i=1,n1
if (i==1) then
write(1,*) v(i,n1-1)/l1,sqrt(x(2))/l
else
write(1,*) v(i,n1-1)/l1,u1(r(i))/l
end if
end do
write(1,*)
delta=0.0
eps1=0.0 !Чебышевская норма погрешности
do i=1,n1
eps1=abs(abs(v(i,n1-1))/l1-abs(u1(r(i)))/l)
if (eps1>delta) then
delta=eps1
end if
end do
write(1,*) "Чебышевская норма погрешности с.в. 2: ",delta
write(1,*)
!!!!!!!!!!!!!!!!!!!!!! 3 с.в.
l=0.0
do i=1,n1
if (i==1) then
l=l+sqrt(x(3))
else
l=l+u2(r(i))
end if
end do
write(1,*) "длина точного св 3 = ",sqrt(l)
l1=0.0
do i=1,n1
l1=l1+v(i,n1-2)
end do
write(1,*) "длина приближённого св 3 = ",sqrt(l1)
write(1,*)
write(1,*) "Приближённые и точные значения собственного вектора 3(нормированные) :"
do i=1,n1
if (i==1) then
write(1,*) v(i,n1-2)/l1,sqrt(x(3))/l
else
write(1,*) v(i,n1-2)/l1,u2(r(i))/l
end if
end do
eps1=0.0
delta=0.0 !Чебышевская норма погрешности
do i=1,n1
eps1=abs(abs(v(i,n1-2))/l1-abs(u2(r(i)))/l)
if (eps1>delta) then
delta=eps1
end if
end do
write(1,*)
write(1,*) "Чебышевская норма погрешности с.в. 3: ",delta
!!!!!!!!!!!!!!!!!! собственные числа
write(1,*)
write(1,*) "Приближённые значения собственных чисел 2 и 3 :"
write(1,*) eval(n1-1),eval(n1-2)
write(1,*)
write(1,*) "Точные значения собственных чисел 2 и 3:"
write(1,*) x(2),x(3),x(4)
write(1,*)
write(1,*) "Чебышевская норма погрешности с.ч. 2 и 3: "
write(1,'(<n1>F10.7)') abs(x(2)-eval(n1-1))
write(1,'(<n1>F10.7)') abs(x(3)-eval(n1-2))
close(1)
end program Lab1
real(8) function k(r)
real(8) r
!k=r**2+1.0
k=1.0
return
end
real(8) function q(r)
real(8) r
q=0.0
return
end
real(8) function f(r)
real(8) r
f=2*(r**0.5)-tan(2*(r**0.5))
return
end
real(8) function u1(r)
real(8) r
u1=sin(sqrt(5.04768211902755)*r)/r
return
end
real(8) function u2(r)
real(8) r
u2=sin(sqrt(14.9198789860242)*r)/r
return
end
8. Таблица результатов работы программы на тесте (зависимость погрешности нахождения собственных чисел и собственных векторов от удваивающегося количества разбиений ).N=10
k |
|
|
|
|
1 |
0.07721 |
4,862092 |
0.73783 |
4,738488 |
2 |
0.01588 |
4,398891 |
0.15571 |
4,367742 |
3 |
0.00361 |
4,195722 |
0.03565 |
4,178779 |
4 |
0.0008604 |
4,103005 |
0.0085312 |
4,090525 |
5 |
0.0002097 |
---- |
0.0020856 |
---- |
Табл. 3
k |
|
|
|
|
1 |
2.389536663846226E-003 |
4,035934 |
|
|
2 |
5.920652929972958E-004 |
5,116669 |
|
|
3 |
1.157130234836351E-004 |
5,771773 |
|
|
4 |
2.004808880450709E-005 |
6,212924 |
|
|
5 |
3.226836412809075E-006 |
----- |
|
|
Табл. 4
9. Оценка порядка точности разностной схемы по найденным собственным значениям и собственным функциям по табл. 3 и 4 для тестовой задачи.
Из таблицы 3 видим, что погрешность нахождения первого и второго собственного числа уменьшается примерно в 4 раза при уменьшении шага в 2 раза, т.е. разностная схема имеет 2 порядок аппроксимации по h.
Из таблицы 4 следует, что погрешность нахождения первой собственной функции падает в 4 раза при уменьшении шага разбиения вдвое, следовательно, погрешность аппроксимации имеет второй порядок точности по h
10. Таблица результатов работы программы для нахождения первого собственного числа задачи, выданной преподавателем
|
|
|
|
|
1 |
11.87747 |
11.95199 |
0,07452406
|
----- |
2 |
11.96188 |
11.96347 |
0,001877336 |
0.025191005
|
Табл. 5
11. Таблица результатов работы программы для нахождения первой собственной функции задачи, выданной преподавателем .
|
|
|
|
|
|
|
|
3.577455 |
3.584644 |
3.583691 |
0,00719 |
0,001606 |
4,47774 |
|
3.320092 |
3.344696 |
3.344392 |
0,0246 |
0,005423 |
4,53608 |
|
2.703415 |
2.708077 |
2.709400 |
0,00466 |
0,001029 |
4,5303 |
|
1.906399 |
1.907250 |
1.906724 |
0,00085 |
0,000184 |
4,61597 |
|
1.155452 |
1.156633 |
1.156145 |
0,00118 |
0,000267 |
4,41803 |
|
0.561596 |
0.562676 |
0.562405 |
0,00108 |
0,000217 |
4,98524 |
|
0.144453 |
0.144653 |
0.144435 |
0,0002 |
0,0000407 |
4,91743 |
|
-0.120867 |
-0.121726 |
-0.121998 |
0,000859 |
0,000207 |
4,15809 |
|
-0.271689 |
-0.273364 |
-0.273708 |
0,001675 |
0,000344 |
4,86919 |
|
-0.342821 |
-0.344925 |
-0.345312 |
0,002104 |
0,000474 |
4,43669 |
|
-0.361775 |
-0.363953 |
-0.364340 |
0,002178 |
0,000471 |
4,62791 |
Табл. 6
12. Оценка порядка точности разностной схемы по найденным собственным значениям и собственным функциям по табл. 5 и 6 для задачи, выданной преподавателем.
Из таблицы 5 видно, что погрешность уменьшилась в 40 раз при уменьшении шага в 2 раза. Из таблицы 6 видно, что разностная схема имеет 2 порядок аппроксимации по h,т.к. погрешность уменьшается в среднем в 4 раза при уменьшении шага в 2 раза.
13. Выводы.
Практический результат согласуется с теорией, составленная разностная схема имеет второй порядок точности по h.
