- •Кафедра вычислительной математики и программирования
- •Практическое решение инженерных и научных задач на пк с использованием математических пакетов
- •Описание последовательности решения задачи
- •Обоснование выбора методов
- •Проверка сходимости выбора методов
- •Тестирование процедур
- •Описание программы
- •Результаты, полученные в ходе выполнения курсовой работы
- •Проверка решения задачи
- •Основные результаты и выводы по работе
- •Содержание отчета
Московский технический университет связи и информатики
Кафедра вычислительной математики и программирования
Курсовая работа
Практическое решение инженерных и научных задач на пк с использованием математических пакетов
Выполнил студент группы МС1002: Проверила
Данилкин Г.Ю.
Вариант #2 Кравченко О.М.
Москва
2012
Индивидуальное задание:
Вычислить минимум функции на отрезке [a,b] c точностью . значения интерполяционного многочлена, построенного для таблично заданной функции f(x) в точках , .
Исходные данные:
|
|
a |
b |
|
0,041770 |
0,587282 |
0 |
2,0 |
|
|
0 |
0,1 |
0,2 |
0,3 |
0,4 |
0,5 |
0,6 |
|
1,858652 |
1,851659 |
1,851401 |
1,848081 |
1,841914 |
1,833125 |
1,821948 |
Описание последовательности решения задачи
Обоснование выбора методов
Поскольку в условии задачи мне дан шаг h=0.1, то искать значения полиномов удобнее всего по формуле Ньютона. Значение x1 стоит между 0 и 0.1, а значение x2 между 0.5 и 0.6, следовательно, я буду рассчитывать x1 по первой формуле Ньютона, а x2 по второй формуле Ньютона.
Т.к. я не ограничен в выборе метода поиска минимума, то я выбрал метод золотого сечения. Удобнее он тем, что нужно пересчитывать всего лишь одно значение x.
Проверка сходимости выбора методов
Для решения моей задачи, я использовал численные методы интерполяции и одномерной оптимизации. Выбранный мною численный метод интерполяции по формулам Ньютона не требует никакой предварительной проверки на сходимость и применимость, кроме постоянного шага между узлами интерполяции. В моем случае, шаг задан постоянным h=0.1.
Для решения задачи оптимизации я выбрал метод золотого сечения. Он применяется для поиска минимума функции на отрезке унимодальности. Для проверки того, что функция на заданном отрезке является унимодальной, применяются следующие критерии:
не убывает на этом отрезке
>=0 на этом отрезке
Выполним проверку этих критериев с помощью MathCad, предварительно вычислив параметры функции .
Вывод: на отрезке [0;2], критерии унимодальности выполняются: первая производная возрастает, вторая больше 0, следовательно заданная функция унимодальна на этом отрезке.
Тестирование процедур
Для проверки правильности составленного программного кода, зададимся простой задачей.
Вычислить минимум функции на отрезке [a,b] c точностью . значения интерполяционного многочлена, построенного для таблично заданной функции f(x) в точках , .
Для проверки правильности интерполяции, протабулируем функцию
Найдем значения этой табличной функции в точках и
Очевидно, что ,
Таким образом в качестве целевой функции получилась функция которая является параболой со смещенной вершиной относительно начала координат по оси х на 1.0025 вправо, и по оси y на 2.3025 вверх.
Следовательно координаты точки минимума этой функции xmin=1.0025, ymin=2.3025.
Докажем это математически. Проверим необходимое условие минимума .
Решая это уравнение получаем, что
Проверим достаточное условие минимума
Таким образом xmin=1.0025, ymin=2.3025.
При проведении тестирования в коде решения задачи были заменены только функция и исходная таблица для интерполяции. Результаты тестирования полностью совпали с ожидаемыми, следовательно программа работает правильно.
Код модуля:
Option Strict On
Option Explicit On
Imports System.Math
Module Module1
Public eps As Double = 0.0001
Public y1, y2 As Double
Sub KonechnyyeRaznosti(ByVal f() As Double, ByRef DY(,) As Double, ByVal n As Integer)
Dim i, j As Integer
For i = 0 To n
DY(i, 0) = f(i)
For j = 1 To n
DY(i, j) = 0
Next j
Next i
For j = 1 To n
For i = 0 To n - j
DY(i, j) = DY(i + 1, j - 1) - DY(i, j - 1)
Next i
Next j
End Sub
Sub newton(ByVal q As Double, ByVal m As Integer, ByVal DY(,) As Double, ByRef p As Double, ByRef R As Double)
Dim qq, fact As Double
Dim j As Integer
p = DY(0, 0)
qq = 1
fact = 1
For j = 1 To m
fact = fact * j
qq = qq * (q - j + 1)
R = qq * DY(0, j) / fact
p = p + R
Next j
End Sub
Function interp_po_newtonu(ByVal x As Double, ByVal DY(,) As Double, ByVal x0 As Double, ByVal h As Double, ByVal n As Integer) As Double
Dim i As Integer
Dim p As Double
Dim q As Double, R As Double
q = (x - x0) / h
i = 1
newton(q, i, DY, p, R)
Do While Abs(R) > eps And i < n
i = i + 1
newton(q, i, DY, p, R)
Loop
Return p
End Function
Function F(ByVal x As Double) As Double
'Return y1 * x ^ 2 - 2.5 * y2 * x - 3
Return (x - y1) ^ 2 + 1 + y2 ' для теста
End Function
Sub sechenie(ByVal a As Double, ByVal b As Double, _
ByVal eps As Double, ByRef xmin As Double, _
ByRef z As String)
Dim x1, x2, F1, F2, k1, k2 As Double
z = ""
k1 = (3 - Sqrt(5)) / 2
k2 = 1 - k1
x1 = a + k1 * (b - a)
x2 = a + k2 * (b - a)
F1 = F(x1)
F2 = F(x2)
z = Format(a, "0.00000") + Space(3) + Format(b, "0.00000") _
+ Space(3) + Format(x1, "0.00000") + Space(3) + _
Format(x2, "0.00000") + Space(3) + Format(F1, "0.00000") _
+ Space(3) + Format(F2, "0.00000") + Space(3) + _
Format(b - a, "0.00000") + vbNewLine
Do Until b - a < eps
If F1 < F2 Then
b = x2
x2 = x1
F2 = F1
x1 = a + k1 * (b - a)
F1 = F(x1)
Else
a = x1
x1 = x2
x2 = a + k2 * (b - a)
F1 = F2
F2 = F(x2)
End If
z = z + Format(a, "0.00000") + Space(3) + Format(b, "0.00000") _
+ Space(3) + Format(x1, "0.00000") + Space(3) + _
Format(x2, "0.00000") + Space(3) + Format(F1, "0.00000") _
+ Space(3) + Format(F2, "0.00000") + Space(3) + _
Format(b - a, "0.00000") + vbNewLine
Loop
xmin = (a + b) / 2
End Sub
End Module
Код Form1:
Option Strict On
Option Explicit On
Public Class Form1
Sub vvod(ByRef x() As Double, ByRef y() As Double, ByRef x1 As Double, ByRef x2 As Double)
Dim i As Integer
For i = 0 To UBound(x)
x(i) = Val(RichTextBox1.Lines(i))
y(i) = Val(RichTextBox2.Lines(i))
Next
x1 = Val(TextBox1.Text)
x2 = Val(TextBox2.Text)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim x(6), y(6) As Double
Dim x1, x2 As Double
Dim DY(6, 6) As Double
Dim g(6) As Double
vvod(x, y, x1, x2)
KonechnyyeRaznosti(y, DY, 6)
y1 = interp_po_newtonu(x1, DY, 0, 0.1, 6)
g = y
Array.Reverse(g)
KonechnyyeRaznosti(g, DY, 6)
y2 = interp_po_newtonu(x2, DY, 0.6, -0.1, 6)
TextBox4.Text = CStr(y1)
TextBox5.Text = CStr(y2)
Button2.Enabled = True
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Form2.Show()
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
End
End Sub
End Class
Код Form2:
Public Class Form2
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim a, b, xmin As Double
Dim z As String = ""
a = Val(TextBox1.Text)
b = Val(TextBox2.Text)
sechenie(a, b, eps, xmin, z)
TextBox3.Text = z
TextBox4.Text = CStr(xmin)
TextBox5.Text = CStr(F(xmin))
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
End
End Sub
End Class