Автор работы: Пользователь скрыл имя, 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-го порядка
Метод Адамса
Метод прогонки
Сводная таблица результатов
Вывод
Список используемой литературы
Файл 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,
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,
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(
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*
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 порядков, Адамса одинаковы, так как данные методы имеют четвертый порядок точности, в отличие от метода Эйлера, который имеет меньший порядок точности (первый порядок точности).
В зависимости от того какое уравнение требуется решить зависит и выбор метода. Заметим, что метод Эйлера лучше всего применять для гладких, непрерывных, монотонно возрастающих или монотонно убывающих функций, так как он имеет лишь первый порядок точности.
39
Информация о работе Методы решения обыкновенных дифференциальных уравнений