Методы решения обыкновенных дифференциальных уравнений

Автор работы: Пользователь скрыл имя, 01 Апреля 2012 в 19:49, лабораторная работа

Краткое описание

Постановка задачи 3
Ручной счёт и алгоритмы 3
Метод Эйлера 3
Метод Рунге-Кутты 4-го порядка 4
Метод Рунге-Кутты 5-го порядка 5
Метод Адамса 6
Правило Рунге для оценки погрешности 6
Метод прогонки 7
Реализация на языках программирования 9
Реализация на С++ 9
Метод Эйлера 9
Метод Рунге-Кутты 4-го порядка 10
Метод Рунге-Кутты 5-го порядка 11
Метод Адамса 12
Метод прогонки 14
Реализация на Fortran 15
Метод Эйлера 15
Метод Рунге-Кутты 4-го порядка 16
Метод Рунге-Кутты 5-го порядка 17
Метод Адамса 18
Метод прогонки 20
Реализация на SciLab 21
Метод Эйлера 21
Метод Рунге-Кутты 4-го порядка 22
Метод Рунге-Кутты 5-го порядка 23
Метод Адамса 23
Метод прогонки 25
Реализация на Pascal 26
Метод Эйлера 26
Метод Рунге-Кутты 4-го порядка 27
Метод Рунге-Кутты 5-го порядка 28
Метод Адамса 29
Метод прогонки 30
Реализация на Basic 32
Метод Эйлера 32
Метод Рунге-Кутты 4-го порядка 33
Метод Рунге-Кутты 5-го порядка 34
Метод Адамса 35
Метод прогонки 36
Сводная таблица результатов 38

Содержание работы

Постановка задачи
Ручной счёт и алгоритмы
Метод Эйлера
Метод Рунге-Кутты 4-го порядка
Метод Рунге-Кутты 5-го порядка
Метод Адамса
Правило Рунге для оценки погрешности
Метод прогонки
Реализация на языках программирования
Реализация на С++
Метод Эйлера
Метод Рунге-Кутты 4-го порядка
Метод Рунге-Кутты 5-го порядка
Метод Адамса
Метод прогонки
Реализация на Fortran
Метод Эйлера
Метод Рунге-Кутты 4-го порядка
Метод Рунге-Кутты 5-го порядка
Метод Адамса
Метод прогонки
Реализация на SciLab
Метод Эйлера
Метод Рунге-Кутты 4-го порядка
Метод Рунге-Кутты 5-го порядка
Метод Адамса
Метод прогонки
Реализация на Pascal
Метод Эйлера
Метод Рунге-Кутты 4-го порядка
Метод Рунге-Кутты 5-го порядка
Метод Адамса
Метод прогонки
Реализация на Basic
Метод Эйлера
Метод Рунге-Кутты 4-го порядка
Метод Рунге-Кутты 5-го порядка
Метод Адамса
Метод прогонки
Сводная таблица результатов
Вывод
Список используемой литературы

Содержимое работы - 1 файл

отчёт.doc

— 979.50 Кб (Скачать файл)

Файл RK5.bas

function f(x as Double, y as Double) as Double

  f= exp(x*y)

end function

rem RK5

  dim x0 as Double,xN as Double

  dim h as Double

  dim y as Double

  dim k1 as Double, k2 as Double, k3 as Double, k4 as Double, k5 as Double

  dim x as Double

  input "Enter x0: ", x0

  input "Enter xN: ", xN

  input "Enter step: ", h

  input "Enter y(0): ", y

  x = x0

  print "x              y"

  do while x < xN+h

    print using "#.#              ##.######"; x; y

    k1 = h*f(x,y)/3

    k2 = h*f(x + h/3, y + k1)/3

    k3 = h*f(x + h/3, y + k1/2 + k2/2)/3

    k4 = h*f(x + h/2, y + 3*k1/8 + 9*k3/8)/3

    k5 = h*f(x + h, y + 3*k1/2 - 9*k3/2 + 6*k4)/3

    y = y + (k1 + 4*k4 + k5)/2

    x = x + h

  loop

end

Результат работы программы:

Метод Адамса

Файл adams.bas

function f(x as double,y as double) as double

  f = exp(x*y)

end function

rem adams

  rem dim y(10) as Double

  dim x as Double, y as Double ,y0 as Double

  dim x0 as Double,xN as Double

  dim h as Double,k1 as Double,k2 as Double

  dim k3 as Double, k4 as Double,k5 as Double

  dim i as Integer

  dim n as Integer

  input "Enter x0: ", x0

  input "Enter xN: " , xN

  input "Enter step: ", h

  input "Enter y(x0): ", y0

  n = abs(xN-x0)/h

  dim yh(0 to n) as Double

  dim yh2(0 to 2*n) as Double

  x = x0 : y = y0: i = 0

  do while x <= xN

    yh(i) = y

    k1 = h*f(x,y)

    k2 = h*f(x + h/2, y + k1/2)

    k3 = h*f(x + h/2, y + k2/2)

    k4 = h*f(x + h, y + k3)

    y = y + (k1+2*k2+2*k3+k4)/6

    x = x + h

    i = i + 1

  loop

  i = 4

  x = x0 + i*h

  do while x<=xN

    yh(i) = yh(i-1) + h*(55*f(x,yh(i-1))-59*f(x-h,yh(i-2))+37*f(x-2*h,yh(i-3))-9*f(x-3*h,yh(i-4)))/24

    x = x0 + i*h

    i = i + 1

  loop

  print "Result: "

  print using "y(#.#)= ##.######"; xN; yh(n)

  y = y0: x = x0: h = h/2: i = 0

  do while x <= xN

    yh2(i) = y

    k1 = h*f(x,y)

    k2 = h*f(x + h/2, y + k1/2)

    k3 = h*f(x + h/2, y + k2/2)

    k4 = h*f(x + h, y + k3)

    y = y + (k1+2*k2+2*k3+k4)/6

    x = x + h

    i = i + 1

  loop

  i = 8

  x = x0 + i*h

  do while x<=xN

    yh2(i) = yh2(i-1) + h*(55*f(x,yh2(i-1))-59*f(x-h,yh2(i-2))+37*f(x-2*h,yh2(i-3))-9*f(x-3*h,yh2(i-4)))/24

    x = x0 + i*h

    i = i + 1

  loop

  print using "eps = #.######"; (yh(n)-yh2(2*n))/(2^4-1)

end

 

Результат работы программы:

где eps – погрешность вычисленного решения.

Метод прогонки

Файл progon.bas

function funA(x as Double) as Double

  funA = 0.4+2*x+x*x/2

end function

 

function funB(x as Double) as Double

  funB = x^0.7

end function

 

function funC(x as Double) as Double

  funC = -0.95*x*x

end function

 

function funF(x as Double) as Double

  funF = (sqr(x)+cos(2*x/3.1416))/funA(x)

end function

 

REM PROGON

  dim i as Integer

  dim a as Double, b as Double, x as Double, h as Double

  dim NS as Integer

  input "Enter N: ", NS

  dim y(0 to NS+1) as Double

  dim c(0 to NS+1) as Double

  dim d(0 to NS+1) as Double

  dim m(0 to NS+1) as Double

  dim n(0 to NS+1) as Double

  input "Enter a: ", a

  input "Enter b: ", b

  if a>=b then

    print "incorrect interval"

    end

  end if

 

  print using "Enter y(#.##)"; a

  input "", y(0)

  print using "Enter y(#.##)"; b

  input "", y(NS)

  h = (b-a)/NS

  m(0) = -2+funB(a)*h/funA(a)

  n(0) = 1-funB(a)*h/funA(a) + funC(a)*h*h/funA(a)

  c(0) = 1/m(0)

  d(0) = -n(0)*y(0)+funF(a)*h*h

  for i = 1 to NS

    x=a+i*h

    m(i) = -2+funB(x)*h/funA(x)

    n(i) = 1-funB(x)*h/funA(x)+funC(x)*h*h/funA(x)

    c(i) = 1/(m(i)-n(i)*c(i-1))

    d(i) = funF(x)*h*h-n(i)*c(i-1)*d(i-1)

  next i

  for i = NS to 2 step (-1)

    y(i-1) = c(i-2)*(d(i-2)-y(i))

  next i

  for i=0 to NS

    print using "y(#.###)= ##.######"; a+i*h; y(i)

  next i

end

 

Результат работы программы:

Сводные таблицы результатов

Таблица 1. Результаты решения ОДУ

Методы

x

Pascal

C++

Fortran

Scilab

Basic

Эйлера

h=0.1

 

0

0.1

0.2

0.3

y

0

0.1

0.20101

0.30511

y

0

0.1

0.209989

0.330785

y

0

0.1

0.20100501

0.30510703

y

0

0.1

0.201005

0.305107

y

0

0.1

0.201005

0.305107

Рунге-Кутты 4

h=0.1

0

0.1

0.2

0.3

0

0.10034

0.20272

0.30943

0

0.100335

0.202721

0.309427

0

0.100335

0.202721

0.309427

0

0.100335

0.202721

0.309427

0

0.100335

0.202721

0.309427

Рунге-Кутты 5

h=0.1

0

0.1

0.2

0.3

0

0.10034

0.20272

0.30943

0

0.100335

0.202721

0.309427

0

0.100335

0.202721

0.309427

0

0.100335

0.202721

0.309427

0

0.100335

0.202721

0.309427

Адамс

0.4

 

0.5

 

 

0.427331

=0.00198

0.558438

=0.000420554

 

0.427331

=0.000198011

0.558438

=0.000420554

 

0.427332

=0.000198

0.558438

=0.000421

 

 

0.427331

=0.018298

0.558438

=0.023210

 

 

0.427331

=0.00198

0.552139

=0.000212

 

 

 

Таблица 2. Результаты решения краевых задач

Метод

x

Pascal

C++

Fortran

Scilab

Basic

Прогонка

 

1

1.062

1.125

1.187

1.250

1.312

1.375

1.437

1.500

y

1.3

1.2589

1.22118

1.18917

1.16197

1.13951

1.12173

1.10857

1.1

y

1.3

1.25896

1.22289

1.19159

1.16484

1.14246

1.12429

1.11019

1.1

y

1.3

1.2589582

1.2228947

1.1915889

1.1648394

1.1424633

1.1242950

1.1101851

1.1

y

1.3

1.258958

1.222895

1.191859

1.164839

1.142463

1.124295

1.110185

1.1

y

1.3

1.258958

1.222895

1.191589

1.164839

1.142463

1.124295

1.110185

1.1

 

Вывод

В процессе данной лабораторной работы были реализованы приближенные методы решения обыкновенных дифференциальных уравнений. Так же мы рассмотрели численное решение краевой задачи на примере метода прогонки. Этим методом решаются краевые задачи, которые имеют порядок уравнений не менее второго.

Полученные результаты, как видно из сводной таблицы, имеют некоторые расхождения в силу особенностей языков программирования. Результаты решения ОДУ методами Рунге-Кутты 4 и 5 порядков, Адамса одинаковы, так как данные методы имеют четвертый порядок точности, в отличие от метода Эйлера, который имеет меньший порядок точности (первый порядок точности).

В зависимости от того какое уравнение требуется решить зависит и выбор метода. Заметим, что метод Эйлера лучше всего применять для гладких, непрерывных, монотонно возрастающих или монотонно убывающих функций, так как он имеет лишь первый порядок точности.

 

Список используемой литературы

  1. Демидович, Марон «Основы вычислительной математики», М. , 1970.
  2. Алексеев Е.Р., Чеснокова О.В. Пакет Scilab. Начало работы.
  3. Конспект лекций по Фортрану – 2001.

39

 



Информация о работе Методы решения обыкновенных дифференциальных уравнений