Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа по информатике.docx
Скачиваний:
5
Добавлен:
09.09.2019
Размер:
535.24 Кб
Скачать

Московский технический университет связи и информатики

Кафедра вычислительной математики и программирования

Курсовая работа

Практическое решение инженерных и научных задач на пк с использованием математических пакетов

Выполнил студент группы МС1002: Проверила

Данилкин Г.Ю.

Вариант #2 Кравченко О.М.

Москва

2012

  1. Индивидуальное задание:

Вычислить минимум функции на отрезке [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

  1. Описание последовательности решения задачи

  1. Обоснование выбора методов

Поскольку в условии задачи мне дан шаг h=0.1, то искать значения полиномов удобнее всего по формуле Ньютона. Значение x1 стоит между 0 и 0.1, а значение x2 между 0.5 и 0.6, следовательно, я буду рассчитывать x1 по первой формуле Ньютона, а x2 по второй формуле Ньютона.

Т.к. я не ограничен в выборе метода поиска минимума, то я выбрал метод золотого сечения. Удобнее он тем, что нужно пересчитывать всего лишь одно значение x.

  1. Проверка сходимости выбора методов

Для решения моей задачи, я использовал численные методы интерполяции и одномерной оптимизации. Выбранный мною численный метод интерполяции по формулам Ньютона не требует никакой предварительной проверки на сходимость и применимость, кроме постоянного шага между узлами интерполяции. В моем случае, шаг задан постоянным h=0.1.

Для решения задачи оптимизации я выбрал метод золотого сечения. Он применяется для поиска минимума функции на отрезке унимодальности. Для проверки того, что функция на заданном отрезке является унимодальной, применяются следующие критерии:

  1. не убывает на этом отрезке

  2. >=0 на этом отрезке

Выполним проверку этих критериев с помощью MathCad, предварительно вычислив параметры функции .

Вывод: на отрезке [0;2], критерии унимодальности выполняются: первая производная возрастает, вторая больше 0, следовательно заданная функция унимодальна на этом отрезке.

  1. Тестирование процедур

Для проверки правильности составленного программного кода, зададимся простой задачей.

Вычислить минимум функции на отрезке [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