Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Министерство информационных технологий и связи РФ
Федеральное агентство связи
ГОУ ВПО «Сибирский государственный университет
Телекоммуникаций и информатики»
Уральский технический институт связи и информатики (филиал)
ИНФОРМАТИКА
ВИЗУАЛИЗАЦИЯ ЧИСЛЕННЫХ МЕТОДОВ.
РЕШЕНИЕ ОБЫКНОВЕННЫХ ДИФФЕРЕНЦИАЛЬНЫХ УРАВНЕНИЙ
Доцент________ Минина Е. Е.
Студент_________ Быстров С. А.
Группа ТЕ-71
4.05.2008
Екатеринбург 2008
Курсовой проект является важнейшей составляющей курса и первой объемной самостоятельной инженерно-расчетной работой студента. Курсовой проект завершает подготовку по дисциплине «Информатика» и становится базой для выполнения последующих курсовых проектов по специальным дисциплинам.
Темой курсового проекта является «Визуализация численных методов» путём:
В ходе выполнения курсовой работы предполагается решение дифференциального уравнения с помощью численных методов:
Актуальность курсового проекта: в настоящее время можно решать дифференциальные уравнения с помощью различных приложений. Существует множество математических пакетов, например, MathCAD, Mathematica и другие, позволяющих решать дифференциальные уравнения. Не сложно решить их и в среде программирования Visual Basic, причем Visual Basic позволяет решать уравнения разными методами с требуемой точностью и представить результаты также наглядно, как и в математических пакетах.
Иногда этот метод называют методом Рунге-Кутта 1 порядка точности.
Данный метод одношаговый. Табулирование функции происходит поочередно в каждой точке. Для расчета значения функции в очередном узле необходимо использовать значение функции в одном предыдущем узле. Дано дифференциальное уравнение первого порядка y`=(3*y)/x с начальным условием y(1)=2. Выберем шаг h=0.05 и введем обозначения:xi=x0+i*h и yi=y(xi), где i=0,1,2,… , где xi узлы сетки, yi значение интегральной функции в узлах. Иллюстрация к решения приведена на рис. 1. Проведем прямую АВ через точку (xi,yi) под углом α. При этом tg α=(3*yi)*xi. (1)
В соответствии с геометрическим смыслом задачи, прямая АВ является касательной к интегральной функции. Произведем замену точки интегральной функции точкой, лежащей на касательной АВ.
Тогда yi+1= yi+Δy. (2)
Из прямоугольного треугольника АВС tg α.= Δy/h. (3)
Приравняем правые части (1) и (3). Получим Δy/h=(3*yi)*xi.
Отсюда Δy=h*(3*yi)*xi.
Подставим в это выражение формулу (2), а затем преобразуем его. В результате получаем формулу для расчета очередной точки интегральной функции:
yi+1= yi+ h*(3*yi)*xi. (4)
Из формулы (4) видно, что для расчета каждой следующей точки интегральной функции необходимо знать значение только одной предыдущей точки. Таким образом, зная начальные условия, можно построить интегральную кривую на заданном промежутке.
По аналогии с общим примером найдем первую точку для нашего примера. Найдем tg(α0)=f(x0,y0)=6, где α0 угол наклона касательной. Найдем x1=x0+h=1.05, где x0 начальное условие, а h шаг. По общей формуле найдем y1=y0+h*tg(α0)=2+0.05*6=2.3, где y0 начальное условие, y1 точка, найденная с помощью метода Эйлера. Результаты можно найти на рис. 1.
Блок-схема процедуры решения дифференциального уравнения методом Эйлера приведена на рисунке 2.
Рисунок 2. Блок-схема процедуры решения дифференциального уравнения методом Эйлера.
Входные параметры:
X0,XK начальное и конечное значения независимой переменной;
Y0 значение y0 из начального условия y(0)=1;
N количество отрезков разбиения;
Выходные параметры:
Y массив значений искомого решения в узлах сетки.
Метод Эйлера один из простейших методов численного решения обыкновенных дифференциальных уравнений. Но существенным его недостатком является большая погрешность вычислений. На рисунке 1 погрешность вычислений для i-го шага обозначена ε. С каждым шагом погрешность вычислений увеличивается.
Метод Эйлера Модифицированный
Private kx, ky, h, c, x0, y0, xk, min, max, z1, z2, a1, a2, x, y, a As Single
Private i, n As Integer
Dim x1() As Single
Dim y1() As Single
Dim y2() As Single
Dim y3() As Single
Private Function f(x, y) As Single
f = (3 * y) / x
End Function
Private Sub Eiler()
x = x1(0)
y = y1(0)
MSFlexGrid1.TextMatrix(1, 0) = x
MSFlexGrid1.TextMatrix(1, 1) = y
For i = 1 To n
a = f(x, y)
x1(i) = x1(i - 1) + h
y1(i) = y1(i - 1) + h * a
x = x1(i)
y = y1(i)
MSFlexGrid1.TextMatrix(i + 1, 0) = x1(i)
MSFlexGrid1.TextMatrix(i + 1, 1) = y1(i)
Next i
End Sub
Private Sub EilerM()
x = x1(0)
y = y2(0)
MSFlexGrid2.TextMatrix(1, 0) = x1(0)
MSFlexGrid2.TextMatrix(1, 1) = y2(0)
For i = 1 To n
a = f(x, y)
x = x1(i - 1) + h / 2
y = y2(i - 1) + (h / 2) * a
a = f(x, y)
x1(i) = x1(i - 1) + h
y2(i) = y2(i - 1) + h * a
x = x1(i)
y = y2(i)
MSFlexGrid2.TextMatrix(i + 1, 0) = x1(i)
MSFlexGrid2.TextMatrix(i + 1, 1) = y2(i)
Next i
End Sub
Private Sub Grafic()
Picture1.Cls
kx = (5400 - 240) / (xk - x0)
min = y1(0)
max = y2(0)
For i = 1 To n
If max < y1(i) Then max = y1(i)
If min > y1(i) Then min = y1(i)
Next i
For i = 1 To n
If max < y2(i) Then max = y2(i)
If min > y2(i) Then min = y2(i)
Next i
For i = 1 To n
If max < y3(i) Then max = y3(i)
If min > y3(i) Then min = y3(i)
Next i
ky = (4920 - 120) / (max - min)
For i = 1 To n - 1
z1 = 240 + (x1(i - 1) - x0) * kx
z2 = 240 + (x1(i) - x0) * kx
a1 = 4920 + (y0 - y1(i - 1)) * ky
a2 = 4920 + (y0 - y1(i)) * ky
Picture1.Line (z1, a1)-(z2, a2)
z1 = 240 + (x1(i - 1) - x0) * kx
z2 = 240 + (x1(i) - x0) * kx
a1 = 4920 + (y0 - y2(i - 1)) * ky
a2 = 4920 + (y0 - y2(i)) * ky
Picture1.Line (z1, a1)-(z2, a2)
z1 = 240 + (x1(i - 1) - x0) * kx
z2 = 240 + (x1(i) - x0) * kx
a1 = 4920 + (y0 - y3(i - 1)) * ky
a2 = 4920 + (y0 - y3(i)) * ky
Picture1.Line (z1, a1)-(z2, a2)
Next i
End Sub
Private Sub Chasnoe()
c = y0 / (x0 * x0 * x0)
Label14.Caption = c
For i = 0 To n
y3(i) = c * (x1(i) ^ 3)
MSFlexGrid3.TextMatrix(i + 1, 0) = x1(i)
MSFlexGrid3.TextMatrix(i + 1, 1) = y3(i)
Next i
End Sub
Private Sub Command1_Click()
h = Val(Text1.Text)
x0 = Val(Text2.Text)
xk = Val(Text3.Text)
y0 = Val(Text4.Text)
n = (xk - x0) / h
MSFlexGrid1.Rows = n + 2
MSFlexGrid2.Rows = n + 2
MSFlexGrid3.Rows = n + 2
ReDim x1(n)
ReDim y1(n)
ReDim y2(n)
ReDim y3(n)
x1(0) = x0
y1(0) = y0
y2(0) = y0
MSFlexGrid1.TextMatrix(0, 0) = "x"
MSFlexGrid1.TextMatrix(0, 1) = "y"
MSFlexGrid2.TextMatrix(0, 0) = "x"
MSFlexGrid2.TextMatrix(0, 1) = "y"
MSFlexGrid3.TextMatrix(0, 0) = "x"
MSFlexGrid3.TextMatrix(0, 1) = "y"
Eiler
x1(0) = x0
EilerM
Chasnoe
Grafic
Label7.Caption = max
Label8.Caption = min
Label9.Caption = x0
Label10.Caption = xk
End Sub
Private Sub Command2_Click()
End
End Sub
В ходе выполнения курсовой работы решили дифференциальное уравнение с помощью численных методов:
Метод Эйлера наиболее простой метод численного решения обыкновенных дифференциальных уравнений, но его недостаток - большая погрешность вычислений, которая с каждым шагом вычислений увеличивается.
Методы Рунге-Кутта легко программируются и обладают значительной точностью и устойчивостью для широкого круга задач
В пояснительной записке приведены блок-схемы основных процедур, листинг и формы программы на языке Visual Basic.
Правильность решения проверили с помощью математического пакета MathCAD.
Eiler(X0,XK,Y0,N,Y)
h= (XK-X0/N)
i= 0, … , N-1
i= X0+i*h
Yi+1= Yi+ h*(3*Yi)/Xi
End
y´(x)=(3*y)/x
Рис. 1. Метод Эйлера.