Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовик по ммм.doc
Скачиваний:
11
Добавлен:
17.09.2019
Размер:
9.31 Mб
Скачать

Часть II Решение задачи на собственные значения для обыкновенного дифференциального уравнения второго порядка

  1. Постановка задачи (вариант 2s).

Задача на собственные значения:

  1. Вывод разностной схемы для уравнения и граничных условий.

Сводим задачу к алгебраической задаче на собственные значения интегро-интерполяционным методом.

Используем приближённую формулу для вычисления интеграла:

И с помощью формулы центральных разностей получаем:

  1. В итоге получим разностную схему для задачи на собственные значения.

Система из n+1 алгебраических уравнений:

  1. Данная система является 3-х диагональной,приведём подобные члены в уравнениях разностной схемы при -ых:

Таким образом мы свели задачу к обобщённой алгебраической задаче на собственные значения

Элементы нижней диагонали матрицы А - ,

главной диагонали - ,

верхней диагонали - ,

Элементы матрицы (главная диагональ) ,

  1. Приведение обобщённой алгебраической задачи на собственные значения к классическому виду. Вид коэффициентов матрицы в классической формулировке.

– классическая задача на собственные значения, но тогда теряется симметричность, так как .Матрица D симметричная и положительно определённая.

Элементы матрицы

Свели обобщённую алгебраическую задачу на собственные значения к классической симметричной задаче.

Элементы нижней диагонали матрицы С - ,

главной диагонали - ,

верхней диагонали - ,

  1. Формулировка тестовой задачи для и .

Общее решение данной задачи:

, B=0 в силу ограниченности u(r) при r=0

–уравнение для поиска собственных чисел .

Численно находим и подставляем их в собственные функции тестовой задачи.

– собственные функции.

  1. Программа на фортране

  1. program Lab1

  2. Implicit none

  3. include 'link_fnl_static.h'

  4. integer i,j

  5. integer,parameter :: n=9,n1=n+1,ncoda=1,Lda=2,Ldevec=n1

  6. real(8) k,u1,u2,q

  7. external k,u1,u2,q

  8. real(8) r(n1),c(Lda,n1),delta,d1(n1,n1)

  9. real(8) eval(n1),evec(Ldevec,n1)

  10. real(8) eps1,nu,h,v(Ldevec,n1),episf,l,l1

  11. !Переменные для поиска точных значений с.ч.

  12. integer,parameter::nroot=9

  13. integer info(nroot),itmax,maxfn

  14. real(8) errabs,errrel,m,p,x(nroot),xguess(nroot),eps,eta

  15. real(8),external::f

  16. nu=0.0

  17. h=2.0/n

  18. r(1)=0.0

  19. do i=2,n1

  20. r(i)=r(i-1)+h

  21. end do

  22. open(1,file='out.dat')

  23. write(1,*) "Число узлов : ",n1

  24. write(1,*) "Шаг : ",h

  25. write(1,*) "Узлы основной сетки : "

  26. do i=1,n1

  27. !write(1,*) r(i)

  28. end do

  29. write(1,*)

  30. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  31. !Решение задачи при К=1 и q=0

  32. !U(r)=sin(r*x**0.5)/r собственные функции

  33. !x**0.5=tg(2*x**0.5) уравнение для собственных значений

  34. data xguess/-1.0e-6,4,14,30,49.5,74,104,138.2,177.7/ !начальное приближение корней

  35. errabs=1.0e-6 !первый критерий завершения вычислений

  36. errrel=1.0e-6 !относительная погрешность соседних аппроксимаций

  37. eps=1.0e-4 !критерий локализации кратных корней

  38. eta=1.0e-4; itmax=1000

  39. call dzreal(f,errabs,errrel,eps,eta,nroot,itmax,xguess,x,info)

  40. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  41. !Задание матрицы D^(-1/2)

  42. d1(1,1)=sqrt((h**3)/24.0)**(-1)

  43. do i=2,n

  44. d1(i,i)=sqrt(h*r(i)**2)**(-1)

  45. end do

  46. d1(n1,n1)=sqrt(0.5*h*r(n1)**2)**(-1)

  47. write(1,*) "Матрица D^-1/2 :"

  48. write(1,*)

  49. ! write(1,'(<n1>F6.3)') ((d1(i,j),j=1,n1),i=1,n1)

  50. write(1,*)

  51. !Задание ленточной матрицы а

  52. c(1,1)=0.0

  53. c(1,2)=-k(0.5*h)/(h*r(2))*dsqrt(1.5d0)

  54. c(2,1)=q(r(1))+6*k(0.5*h)/h**2

  55. c(2,2)=q(r(2))+(k(1.5*h)*(1.5*h)**2+k(0.5*h)*(0.5*h)**2)/(h**4)

  56. do i=3,n1-1

  57. c(1,i)=-(r(i-1)+0.5*h)**2*k(r(i-1)+0.5*h)/(h**2*r(i-1)*r(i))

  58. 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)

  59. end do

  60. 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)

  61. c(2,n1)=q(r(n1))+2*k(r(n1)-0.5*h)*(r(n1)-0.5*h)**2/(h**2*r(n1)**2)

  62. ! write(1,*) " Ленточная матрица с = "

  63. ! write(1,*) ((c(j,i),i=1,n1),j=1,2)

  64. !evec=(D^1/2)*V , V=D^(-1/2)*evec

  65. call DEVCSB(n1,c,Lda,ncoda,eval,evec,Ldevec)

  66. v=matmul(d1,evec)

  67. ! write(1,*) "Приближённые значения собственных векторов :"

  68. ! write(1,'(<n1>F6.2)') ((v(i,j),j=1,n1),i=1,n1)

  69. write(1,*)

  70. !!!!!!!!!!!!!!!!!!!!!! 2 c.в.

  71. l=0.0

  72. do i=1,n1

  73. if (i==1) then

  74. l=l+sqrt(x(2))

  75. else

  76. l=l+u1(r(i))

  77. end if

  78. end do

  79. write(1,*) "длина точного св 2 = ",sqrt(l)

  80. l1=0.0

  81. do i=1,n1

  82. l1=l1+v(i,n1-1)

  83. end do

  84. write(1,*) "длина приближённого св 2 = ",sqrt(l1)

  85. write(1,*)

  86. write(1,*) "Приближённые и точные значения собственного вектора 2(нормированные) :"

  87. do i=1,n1

  88. if (i==1) then

  89. write(1,*) v(i,n1-1)/l1,sqrt(x(2))/l

  90. else

  91. write(1,*) v(i,n1-1)/l1,u1(r(i))/l

  92. end if

  93. end do

  94. write(1,*)

  95. delta=0.0

  96. eps1=0.0 !Чебышевская норма погрешности

  97. do i=1,n1

  98. eps1=abs(abs(v(i,n1-1))/l1-abs(u1(r(i)))/l)

  99. if (eps1>delta) then

  100. delta=eps1

  101. end if

  102. end do

  103. write(1,*) "Чебышевская норма погрешности с.в. 2: ",delta

  104. write(1,*)

  105. !!!!!!!!!!!!!!!!!!!!!! 3 с.в.

  106. l=0.0

  107. do i=1,n1

  108. if (i==1) then

  109. l=l+sqrt(x(3))

  110. else

  111. l=l+u2(r(i))

  112. end if

  113. end do

  114. write(1,*) "длина точного св 3 = ",sqrt(l)

  115. l1=0.0

  116. do i=1,n1

  117. l1=l1+v(i,n1-2)

  118. end do

  119. write(1,*) "длина приближённого св 3 = ",sqrt(l1)

  120. write(1,*)

  121. write(1,*) "Приближённые и точные значения собственного вектора 3(нормированные) :"

  122. do i=1,n1

  123. if (i==1) then

  124. write(1,*) v(i,n1-2)/l1,sqrt(x(3))/l

  125. else

  126. write(1,*) v(i,n1-2)/l1,u2(r(i))/l

  127. end if

  128. end do

  129. eps1=0.0

  130. delta=0.0 !Чебышевская норма погрешности

  131. do i=1,n1

  132. eps1=abs(abs(v(i,n1-2))/l1-abs(u2(r(i)))/l)

  133. if (eps1>delta) then

  134. delta=eps1

  135. end if

  136. end do

  137. write(1,*)

  138. write(1,*) "Чебышевская норма погрешности с.в. 3: ",delta

  139. !!!!!!!!!!!!!!!!!! собственные числа

  140. write(1,*)

  141. write(1,*) "Приближённые значения собственных чисел 2 и 3 :"

  142. write(1,*) eval(n1-1),eval(n1-2)

  143. write(1,*)

  144. write(1,*) "Точные значения собственных чисел 2 и 3:"

  145. write(1,*) x(2),x(3),x(4)

  146. write(1,*)

  147. write(1,*) "Чебышевская норма погрешности с.ч. 2 и 3: "

  148. write(1,'(<n1>F10.7)') abs(x(2)-eval(n1-1))

  149. write(1,'(<n1>F10.7)') abs(x(3)-eval(n1-2))

  150. close(1)

  151. end program Lab1

  152. real(8) function k(r)

  153. real(8) r

  154. !k=r**2+1.0

  155. k=1.0

  156. return

  157. end

  158. real(8) function q(r)

  159. real(8) r

  160. q=0.0

  161. return

  162. end

  163. real(8) function f(r)

  164. real(8) r

  165. f=2*(r**0.5)-tan(2*(r**0.5))

  166. return

  167. end

  168. real(8) function u1(r)

  169. real(8) r

  170. u1=sin(sqrt(5.04768211902755)*r)/r

  171. return

  172. end

  173. real(8) function u2(r)

  174. real(8) r

  175. u2=sin(sqrt(14.9198789860242)*r)/r

  176. return

  177. 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.