Лабораторная работа №9. Численное решение дифференциальных уравнений

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

Дифференциальным уравнением первого порядка называют уравнение вида:

Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru . (1)

При численном решении дифференциального уравнения первого порядка вида (1) с начальным условием Y(x0) = y0 (задача Коши) сначала выбираем фиксированное приращение аргумента h = (xn -x0 )/n, где x0 – начальная точка интервала интегрирования, xn - конечная точка интервала интегрирования, n – число шагов. Далее, используя один из итерационных методов численного интегрирования дифференциальных уравнений первого порядка, находим значение Y(xn).

Метод Эйлера

Метод Эйлера относится к наиболее простым базовым методам решения дифференциальных уравнений. Этот метод основан на представлении производной в конечно-разностной форме:

Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru (2)

Так, для дифференциального уравнения вида (1) при достаточно малых значениях приращения аргумента x, можно, представив производную в виде отношения приращения функции к приращению аргумента, получить следующее приближенное представление в виде конечно-разностного уравнения:

Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru (3)

Из этого представления легко выразить «новое» значение функции (значение функции в точке x+h) – расчетную формулу метода Эйлера:

Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru (4)

Описание алгоритма численного интегрирования дифференциального уравнения первого порядка методом Эйлера:

Задаем начальное x0 и конечное xn значения отрезка интегрирования, начальное y0, т.е. значение функции y в точке x0, а также количество шагов интегрирования n.

Вычисляем величину шага интегрирования h = (xn -x0 )/n.

Задаем цикл по k от 2 до n+1.

В цикле, на основе значения xk-1 вычисляем xk, т.е. x1 = x0+ h, x2 = x1+ h и т.д.

В цикле на основе значения Yk-1 по рекуррентной формуле вычисляем yk, т.е. Y1=Y0+h*F(x0,Y0), Y2=Y1+h*F(x1,Y1) и т.д. Значение F(xk,Yk) должно вычисляться в функции, соответствующей правой части дифференциального уравнения. Конец цикла.

Конец алгоритма.

Алгоритм численного интегрирования дифференциального уравнения первого порядка методом Эйлера на естественном языке:

x0=начальное_значение_х

xn=конечное_значение_х

y0=начальное_значение_Y

n=количество_шагов_интегрирования

h=(xn-x0)/n

Определить Массив X(n+1)

Определить Массив Y(n+1)

X(1)=x0

Y(1)=y0

Цикл по i от 2 до n+1

X(i)=X(i-1)+h

Y(i)=Y(i-1)+h*F(X(i-1),Y(i-1))

Конец Цикла

Печать " Решение: Значения х Значения Y(х) :"

Цикл по i от 1 до n+1

Печать X(i),Y(i)

Конец Цикла

Определить Функцию F

Параметры x,y

f=.... *** Задается вид функции

Вернуть f

Конец Определения Функции

Покажем пример реализации метода Эйлера на примере уравнения

Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru , т.е. Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru (5)

При аналитическом интегрировании данного уравнения получаем начальное значение функции в точке x0=0 и вид искомой функции:

Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru , Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru .

Пример реализации алгоритма численного интегрирования дифференциального уравнения первого порядка методом Эйлера на VFP для уравнения (5):

SET DECIMALS TO 8

CLEAR

* Начальное и конечное значения х

x0=0

xn=1

* Начальное значение y

y0=1

* Количество итераций

n=10

h=(xn-x0)/n

DIMENSION X(n+1),Y(n+1)

X(1)=x0

Y(1)=y0

*Y(i+1)=Y(i)+h*F(X(i),Y(i))

FOR i=2 TO n+1

X(i)=X(i-1)+h

Y(i)=Y(i-1)+h*F(X(i-1),Y(i-1))

ENDFOR

? " Решение :”

? " Значения Х Известные значения Y Вычисленные значения Y :"

FOR i=1 TO n+1

?X(i),F_test(X(i)),Y(i)

ENDFOR

function F

lPARAMETERS x,y

f=y

RETURN f

ENDFUNC

function F_test

lPARAMETERS x

F_test=EXP(x)

RETURN F_test

ENDFUNC

Пример реализации алгоритма численного интегрирования дифференциального уравнения первого порядка методом Эйлера на VBA для уравнения (5):

Sub Euler_Test()

' Начальное и конечное значения х

x0 = 0

xn = 1

' Начальное значение y

y0 = 1

' Количество итераций

n = 10

h = (xn - x0) / n

ReDim x(n + 1)

ReDim y(n + 1)

x(1) = x0

y(1) = y0

'Y(i+1)=Y(i)+h*F(X(i),Y(i))

For i = 2 To n + 1

x(i) = x(i - 1) + h

y(i) = y(i - 1) + h * F(x(i - 1), y(i - 1))

Next i

Debug.Print "РЕШЕНИЕ :"

Debug.Print "Значения Х Известные значения Y Вычисленные значения Y"

For i = 1 To n + 1

Debug.Print x(i), F_test(x(i)), y(i)

Next i

End Sub

Function F(x, y)

F = y

End Function

Function F_test(x)

F_test = Exp(x)

End Function

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

РЕШЕНИЕ :

Значения Х Известные значения Y Вычисленные значения Y

0 1 1

0,1 1,10517091807565 1,1

0,2 1,22140275816017 1,21

0,3 1,349858807576 1,331

0,4 1,49182469764127 1,4641

0,5 1,64872127070013 1,61051

0,6 1,82211880039051 1,771561

0,7 2,01375270747048 1,9487171

0,8 2,22554092849247 2,14358881

0,9 2,45960311115695 2,357947691

1 2,71828182845905 2,5937424601

Метод Кранка-Николсона

Метод Кранка-Николсона представляет собой модификацию метода Эйлера, в которой правая часть разностной формы дифференциального уравнения представляется в виде среднего значения правой части в точке x и правой части в точке x+h:

Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru (6)

Поскольку искомое значение функции в точке x+h присутствует и в левой и в правой части уравнения – эта формула содержит Y(x+h) неявно, поэтому, для получения расчетной формулы необходимо выразить Y(x+h) явно. Выразить явно Y(x+h) возможно не для любого вида F(Y(x),x). Метод Кранка-Николсона можно применять, tсли правая часть дифференциального уравнения зависит только от x, т.е. F(Y(x),x)=F(x).

Рассмотрим пример дифференциального уравнения с разрешимой правой частью, зависящей от x и Y(x):

Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru , Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru (7)

Запишем разностный вид этого дифференциального уравнения:

Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru

После простых преобразований:

1) Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru ,

2) Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru ,

3) Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru .

Получим расчетную формулу:

Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru . (8)

В случае, когда правая часть дифференциального уравнения зависит только от х, формула метода Кранка-Николсона имеет вид:

Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru (9)

Например, для дифференциального уравнения с правой частью, зависящей только от x:

Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru (10)

формула Кранка-Николсона имеет вид:

Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru . (11)

Описание алгоритма численного интегрирования дифференциального уравнения первого порядка с правой частью уравнения, зависящей только от х, методом Кранка-Николсона:

Задаем начальное x0 и конечное xn значения отрезка интегрирования, начальное y0, т.е. значение функции y в точке x0, а также количество шагов интегрирования n.

Вычисляем величину шага интегрирования h.

Задаем цикл по k от 2 до n+1.

В цикле на основе значения xk-1 вычисляем xk, т.е. x1 = x0+ h, x2 = x1+ h и т.д.

В цикле на основе значения Yk-1 по рекуррентной формуле вычисляем yk, т.е. Y1=Y0+h*(F(x0,Y0)+F(x1,Y1))/2, Y2=Y1+h*(F(x1,Y1)+F(x2,Y2))/2 и т.д. Значение F(xk,Yk) должно вычисляться в функции, соответствующей правой части дифференциального уравнения. Конец цикла.

Конец алгоритма.

Алгоритм численного интегрирования дифференциального уравнения первого порядка с правой частью уравнения, зависящей только от х, методом Кранка-Николсона на естественном языке:

x0=начальное_значение_х

xn=конечное_значение_х

y0=начальное_значение_Y

n=количество_шагов_интегрирования

h=(xn-x0)/n

Определить Массив X(n+1)

Определить Массив Y(n+1)

X(1)=x0

Y(1)=y0

Цикл по i от 2 до n+1

X(i)=X(i-1)+h

Y(i)=Y(i-1)+h*(F(X(i-1),Y(i-1))+ F(X(i),Y(i)))/2

Конец Цикла

Печать " Решение: Значения х Значения Y(х) :"

Цикл по i от 1 до n+1

Печать X(i),Y(i)

Конец Цикла

Определить Функцию F

Параметры x,y

f=.... *** Задается вид функции

Вернуть f

Конец Определения Функции

Покажем пример реализации метода Кранка-Николсона на примере уравнения (10). При аналитическом интегрировании уравнения (10) получаем начальное значение функции в точке x0=0 и вид искомой функции:

Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru , Лабораторная работа №9. Численное решение дифференциальных уравнений - student2.ru . (12)

Пример реализации алгоритма численного интегрирования дифференциального уравнения первого порядка с правой частью, зависящей только от х, методом Кранка-Николсона на VFP для уравнения (10):

SET DECIMALS TO 8

CLEAR

* Начальное и конечное значения х

x0=0

xn=1

* Начальное значение y

y0=3

* Количество итераций

n=10

h=(xn-x0)/n

DIMENSION X(n+1),Y(n+1)

X(1)=x0

Y(1)=y0

*Y(i+1)=Y(i)+h*F(X(i),Y(i))

FOR i=2 TO n+1

X(i)=X(i-1)+h

Y(i)=Y(i-1)+h*F(X(i-1),Y(i-1))

ENDFOR

? " Решение :"

? " Значения Х Известные значения Y Вычисленные значения Y :"

FOR i=1 TO n+1

?X(i),F_test(X(i)),Y(i)

ENDFOR

function F

lPARAMETERS x,y

f=x*x+3*x

RETURN f

ENDFUNC

function F_test

lPARAMETERS x

F_test=2*x+3

RETURN F_test

ENDFUNC

Пример реализации алгоритма численного интегрирования дифференциального уравнения первого порядка с правой частью, зависящей только от х, методом Кранка-Николсона на VBA для уравнения (10):

Sub Krank_Nikolson_Test()

' Начальное и конечное значения х

x0 = 0

xn = 1

' Начальное значение y

y0 = 3

' Количество итераций

n = 10

h = (xn - x0) / n

ReDim x(n + 1)

ReDim y(n + 1)

x(1) = x0

y(1) = y0

'Y(x+h) = Y(x) + h*(x^2 + 3*x + (x+h)^2 + 3*(x+h))/2

For i = 2 To n + 1

x(i) = x(i - 1) + h

y(i) = y(i - 1) + h * (F(x(i - 1), y(i - 1)) + F(x(i), y(i))) / 2

Next i

Debug.Print "РЕШЕНИЕ :"

Debug.Print "Значения Х Известные значения Y Вычисленные значения Y"

For i = 1 To n + 1

Debug.Print x(i), F_test(x(i)), y(i)

Next i

End Sub

Function F(x, y)

F = x ^ 2 + 3 * x

End Function

Function F_test(x)

F_test = 2 * x + 3

End Function

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

РЕШЕНИЕ :

Значения Х Известные значения Y Вычисленные значения Y

0 3 3

0,1 3,2 3,0155

0,2 3,4 3,063

0,3 3,6 3,1445

0,4 3,8 3,262

0,5 4 3,4175

0,6 4,2 3,613

0,7 4,4 3,8505

0,8 4,6 4,132

0,9 4,8 4,4595

1 5 4,835

Наши рекомендации