Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
PAGE 6
по информатике
ВИЗУАЛИЗАЦИЯ ЧИСЛЕННЫХ МЕТОДОВ.
РЕШЕНИЕ ОБЫКНОВЕННЫХ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ
Потапов Е. Д.
Руководитель: Минина Е.Е.
Екатеринбург 2007
Введение………………………………………………………………...……..3
1 Постановка задачи………………………………….…………………..……..4
3 Метод Рунге-Кутта 4го порядка …………………………………………..…7
4 Блок схема…. ……………………………………………………………..….. 8
5 Листинг программы на языке Visual Basic………………………………….11
6 Проверка в Math Cad………………………………………………………….13
7 Исходная форма………………………………………………………………14
8 Конечная форма……………………………………………………………....15
9 Заключение……………………………………………………………………16
Целью моей работы является изучение основ системы программирования Microsoft Visual Basic и приобретение начальных навыков разработки программного обеспечения для операционных систем Windows.
1 Постановка задачи
При использовании численных методов решения дифференциальных уравнений у = f(x, y) представляется в табличном виде, т.е. получается совокупность значений y(i) и x(i). Решение носит шаговый характер, т.е. по одной или по нескольким начальным точкам (x,y) за один шаг находят следующую точку, затем следующую и т.д. Разница между двумя соседними значениями аргумента x(i+1) и x(i) называется шагом (h). В данной курсовой работе мне требуется решить дифференциальное уравнение методами Эйлера (Рунге-Кутта первого порядка) и Рунге-Кутта (четвертого порядка)
1.1 Математическая модель
Дано: y(x+1)=y + 2
y(x0) = y0
y0 = 0
x0 = 0
xk = 0.8
h=0.1
Иногда этот метод называют методом Рунге-Кутта первого порядка точности.
Для расчета значения функции в очередном узле необходимо использовать значение функции в одном предыдущем узле.
Пусть дано дифференциальное уравнение первого порядка
с начальным условием
y(x0) = y0.
Выберем шаг h и введём обозначения:
xi = x0 + i.h и yi = y(xi) , где i = 0, 1, 2, …,
xi узлы сетки,
yi- значение интегральной функции в узлах .
Иллюстрации к решению приведены на рисунке 1.
Проведем прямую АВ через точку (xi,yi) под углом α. При этом
tgα = f(xi,yi) (1).
В соответствии с геометрическим смыслом задачи, прямая АВ является касательной к интегральной функции. Произведем замену точки интегральной функции точкой, лежащей на касательной AB.
Тогда yi+1 = yi+Δy (2).
Из прямоугольного треугольника АВС (3).
Приравняем правые части (1) и (3). Получим .
Отсюда
Подставим в это выражение формулу (2), а затем преобразуем его. В результате получаем формулу расчета очередной точки интегральной функции:
(4).
Рисунок 1. Метод Эйлера.
Из формулы (4) видно, что для расчета каждой следующей точки интегральной функции необходимо знать значение только одной предыдущей точки. Таким образом, зная начальные условия, можно построить интегральную кривую на заданном промежутке.
Метод Эйлера один из простейших методов численного решения обыкновенных дифференциальных уравнений. Но существенным его недостатком является большая погрешность вычислений. На рисунке 2 погрешность вычислений для i-го шага обозначена ε. С каждым шагом погрешность вычислений увеличивается.
Пусть дано дифференциальное уравнение первого порядка
с начальным условием
y(x0) = y0.
Выберем шаг h и введём обозначения:
xi = x0 + i.h и yi = y(xi) , где i = 0, 1, 2, … .
Аналогично описанным выше методам производится решение дифференциального уравнения. Отличие состоит в делении шага на 4 части.
Согласно методу Рунге Кутта четвёртого порядка, последовательные значения yi искомой функции y определяются по формуле:
где
, i = 0, 1, 2, …
а числа k1(i), k2(i), k3(i), k4(i) на каждом шаге вычисляются по формулам:
Это явный четырёхэтапный метод четвёртого порядка точности.
Методы Рунге Кутта легко программируются и обладают значительной точностью и устойчивостью для широкого круга задач.
B
β C D
γ δ E
Рисунок 2.
A α Метод Рунге-
Кутта
4 Блок схема
-
+
-
+
5 Листинг программы на языке Visual Basic
Dim x(11) As Single, y(11) As Single, y1(11) As Single, y2(11) As Single
Private x0 As Single, y0 As Single, xk As Single, h As Single
Private Function f(a As Single, b As Single)
f = (b + 2) / (a + 1)
End Function
Private Sub Command1_Click()
x0 = Val(Text1.Text)
xk = Val(Text2.Text)
h = Val(Text3.Text)
y0 = Val(Text4.Text)
n = (xk - x0) / h
MSFlexGrid1.Rows = n + 2
MSFlexGrid1.TextMatrix(0, 0) = "x"
MSFlexGrid1.TextMatrix(0, 1) = "y"
MSFlexGrid1.TextMatrix(0, 2) = "y1"
MSFlexGrid1.TextMatrix(0, 3) = "y2"
x(0) = x0
y1(0) = y0
y2(0) = y0
Max = y0
Min = y0
For i = 0 To n
x(i) = x0 + i * h
y(i) = Round((x(i) + 1) * 2 - 2, 4)
y1(i + 1) = Round(y1(i) + f(x(i), y1(i)) * h, 4)
k1 = f(x(i), y2(i)) * h
k2 = f(x(i) + h / 2, y2(i) + k1 / 2) * h
k3 = f(x(i) + h / 2, y2(i) + k2 / 2) * h
k4 = f(x(i) + h, y2(i) + k3) * h
y2(i + 1) = Round(y2(i) + (k1 + 2 * k2 + 2 * k3 + k4) / 6, 4)
MSFlexGrid1.TextMatrix(i + 1, 0) = Str(x(i))
MSFlexGrid1.TextMatrix(i + 1, 1) = Str(y(i))
MSFlexGrid1.TextMatrix(i + 1, 2) = Str(y1(i))
MSFlexGrid1.TextMatrix(i + 1, 3) = Str(y2(i))
If y(i) > Max Then Max = y(i)
If y(i) < Min Then Min = y(i)
If y1(i) > Max Then Max = y1(i)
If y1(i) < Min Then Min = y1(i)
If y2(i) > Max Then Max = y2(i)
If y2(i) < Min Then Min = y2(i)
Next i
For i = 0 To n - 1
kx = (Picture1.Width - 1200) / (xk - x0)
ky = (Picture1.Height - 1000) / (Max - Min)
Label4.Caption = Str(Min)
Label5.Caption = Str(Max)
Label6.Caption = Str(x0)
Label7.Caption = Str(xk)
z1 = Round(720 + (x(i) - x0) * kx)
z2 = Round(5400 - (y(i) - Min) * ky)
z3 = Round(5400 - (y1(i) - Min) * ky)
z4 = Round(5400 - (y2(i) - Min) * ky)
z5 = Round(720 + (x(i + 1) - x0) * kx)
z6 = Round(5400 - (y(i + 1) - Min) * ky)
z7 = Round(5400 - (y1(i + 1) - Min) * ky)
z8 = Round(5400 - (y2(i + 1) - Min) * ky)
Picture1.Line (z1, z2)-(z5, z6), vbRed
Picture1.Line (z1, z3)-(z5, z7), vbBlue
Picture1.Line (z1, z4)-(z5, z8)
Next i
End Sub
Private Sub Command2_Click()
End
End Sub
7 Исходная форма
8 Конечная форма
Я изучил основы системы программирования Microsoft Visual Basic и приобрел начальные навыки в разработке программного обеспечения для операционных систем Windows.
Решив дифференциальное уравнение двумя способами, я пришел к выводу, что лучше производить вычисления методом Рунге-Кутта четвертого порядка, так как он во много раз точнее метода Эйлера, его график сливается с общим решением (что мы видим на конечной форме).
Дифференциальные уравнения могут быть настолько сложными, что их невозможно решить вручную. Поэтому вычисление на компьютере является оптимальным решением.
Line (z1, q3)-(z5, z7)
4
i = 0 … n-1
4
+
Max = y(i)
x
xi+1
xi
y=y(x)
y
y(i)<min
O
A
B
α
h
yi
yi+1
ε
B
C
Min = y(i)
Шаблон графика
kx = (Picture1.Width - 1200) / (xk - x0)
ky = (Picture1.Height - 1000) / (Max - Min)
1 111111i
y(i)>Max
x(i), y(i), y1(i),y2(i)
Y1(i+1)=y1(i)+ f(x(i), y1(i))*h
k4= h*f(x(i)+h/2, y2(i)+ k3)
k3 = h*f(x(i)+h/2, y2(i)+ k2/2)
k2= h*f(x(i)+h/2, y2(i)+ k1/2)
1
Начало
x0, xk, y0, h
n = (xk x0)/h
y(i) = exp(x)(lnx+c)
y2(i+1)=y2(i)+(k1+2*k2+2*k3+k4)/6
k1= h *f(x(i), y2 (i))
Max = f(x0,y0)
Min = f(x0,y0)
y2(0) = y0
i = 0 … n-1
x(i) = x0 + i*h
y1(0) = y0
z8= 5400 - (y2(i + 1) - Min) * ky
z7= 5400 - (y1(i + 1) - Min) * ky
z6= 5400 - (y(i + 1) - Min) * ky
z5 = 720 + (x(i + 1) - x0) * kx
Line (z1, z2)-(z5, z6)
z4 = 5400 - (y2(i) - Min) * ky
z3 = 5400 - (y1(i) - Min) * ky
z2 = 5400 - (y (i) - Min) * ky
z1 = 720 + (x(i) - x0) * kx
Конец
Line (z1, z4)-(z5, z8)
1
1
2
3
2
3