Использование методов численного интегрирования

Табуляция функции в заданных пределах изменения параметра. Описание методов дихотомии, Симпсона и Лагранжа, построение схем алгоритмов и программного кода. Определение максимума интерполяционного многочлена при помощи методов одномерной оптимизации.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 22.06.2012
Размер файла 1,5 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

11

Федеральное агентство связи

Государственное образовательное учреждение высшего профессионального образования

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

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

по информатике

Выполнил: студент группы СС1003

Польских Д.В.

Проверила: Семенова Т.И.

Москва 2012

Оглавление

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

2. Постановка задачи

3. Укрупненный алгоритм решения задачи

4. Обоснование методов решения

5. Описание методов решения

6. Схемы алгоритмов

7. Полный программный код проекта

8. Результаты программы

9. Полное решение с помощью пакета MathCad

10. Полный Программный код тестирования

11. Тестирование методов

Вывод

Используемая литература

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

Вариант 4

Построить таблицу значений при измененении x с шагом h от x=a до x=b. Найти с точностью е максимум интерполяционного многочлена 2й степени выбрав из полученной таблицы соответствующие значения.

Исходные данные:

a

b

h

е

1

4

0.5

2. Постановка задачи:

1. С использованием одного из методов численного интегрирования провести табуляцию функции в заданных пределах изменения параметра х.

2. Выполнить задачу интерполяции, для чего используем узлы интерполяции x0=1, x1=2.5, x2=4 (начало, конец и середину отрезка)

3. При помощи методов одномерной оптимизации найти максимум интерполяционного многочлена, построенного в предыдущем пункте.

3. Укрупненный алгоритм решения задачи

4. Обоснование методов решения

1. Для проведения оптимизации выберем метод дихотомии, т.к. на каждой итерации отрезок неопределенности сократится практически в два раза.

Конечная длина отрезка неопределенности при использовании метода дихотомии , а при использовании метода золотого сечения - , поэтому для обеспечения одного и того же значения погрешности методом дихотомии требуется произвести меньше итераций, чем при использовании метода золотого сечения.

2. Для проведения численного интегрирования выберем метод Симпсона, так как он имеет высокую точность, а так же, потому что функция квадратична.

3. Для проведения интерполяции используем формулу Лагранжа:

Метод Лагранжа выбираем за его простоту, а также, потому что для него не критичны расстояния между узлами интерполяции.

5. Описание методов решения:

Метод дихотомии

Пусть дана функция f(x), унимодальная на отрезке [a;b]. Обозначим a0 = a и b0 = b. Поиск минимума начинают с выбора на отрезке неопределенности [a0;b0] двух симметричных относительно середины точек:

где - параметр метода.

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

1) если f(1) f(1), то x*[a0;1] (Рис.а);

2) если f(1) > f(1), то x*[1;b0] (Рис.b).

а) b)

Если описанную процедуру принять за одну итерацию, то алгоритм поиска минимума можно описать следующим образом. Опишем k+1 итерацию, исходя из того, что k-й отрезок неопределенности найден [ak;bk]:

Вычисляются

Находят значения f(k+1) и f(k+1).

Находят k+1-й отрезок неопределенности по правилу:

если f(k+1) > f(k+1), то x* [k+1;bk],

если f(k+1) f(k+1), то x*[ak;k+1]).

Вычисления проводятся до тех пор, пока не выполнится неравенство

где n - длина n-го отрезка неопределенности.

Заметим, что от итерации к итерации n убывает и при n стремится к величине 2, оставаясь больше этой величины. Поэтому добиться при некотором значении n длины отрезка неопределенности | меньше заданной точности можно лишь выбирая 0</2.

Метод Симпсона

Метод Симпсона заключается в замене подынтегральной функции на отрезке [a,b] интерполяционным многочленом второй степени p2(x), то есть приближение графика функции на отрезке параболой.

Для более точного вычисления интеграла, интервал [a,b] разбивают на N отрезков одинаковой длины и применяют соответствующую замену на каждом из них. Значение исходного интеграла является суммой результатов интегрирования на всех отрезках.

Где n - число точек, m=0.5n

Метод двойного просчета заключается в неявной оценке погрешности при сравнении значений интеграла при длине шага h и h/2.

Где n - коэффициент различный для каждого метода интегрирования (n = 4 для метода Симпсона).

- Значение интеграла при шаге h

- Значение интеграла при шаге h/2

Метод Лагранжа

Общая формула метода Лагранжа

В задании подчеркнуто что необходимо использовать полином 2 порядка. Его формула

Также необходимо получить полином в явном виде. Если взять за основу вышеуказанную формулу, то коэффициенты полинома будут вычисляться по формулам:

А сам полином в явном виде:

6. Схемы алгоритмов

Схема алгоритма работы программы решающей задачу численного интегрирования методом Симпсона:

Схема алгоритма метода дихотомии:

Схема алгоритма интерполяция по методу Лагранжа:

дихотомия алгоритм интерполяционный оптимизация

7. Полный программный код проекта

'программный код первой формы

Public Class Form1

Private Sub b1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles b1.Click

Dim a, ee, b, h, x, y As Single

Dim txt As String = ""

a = vinput(tb1)

h = vinput(tb3)

ee = vinput(tb4)

b = vinput(tb2)

_e = ee

FTab2(a, b, h, txt)

voutput(txt, Form2.tb5)

x = Opt(a, b, ee, y, txt)

voutput(txt, Form2.tb5, True)

voutput("xmax=" + Format(x, "0.0000") + " ymax=" + Format(y, "0.0000"), Form2.lb1)

End Sub

Private Sub b2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles b2.Click

Form2.Show()

End Sub

End Class

'программный код модуля

Imports System.Math

Module Module1

Private XY_Arr(,) As Single

Private Num As Integer

Public _e

Public Function vinput(ByVal t As TextBox) As Single

Return CSng(Val(t.Text))

End Function

Public Sub voutput(ByVal s As String, ByRef t As TextBox)

t.Text = s

End Sub

Public Sub voutput(ByVal s As String, ByRef t As TextBox, ByVal add As Boolean)

If add = True Then

t.Text += s

Else

t.Text = s

End If

End Sub

Public Sub voutput(ByVal s As String, ByRef t As Label)

t.Text = s

End Sub

Public Function F(ByVal x As Single) As Single

Return SM(1, x, _e) - 1

End Function

Public Function P(ByVal x As Single) As Single

Return Interp_mod(x, 2)

End Function

Public Function FInt(ByVal x As Single) As Single

Return Pow(Log(x), 2) / x

End Function

Public Function SM(ByVal a As Single, ByVal b As Single, ByVal e As Single) As Single

Dim n As Integer = 2

Dim cc, i As Integer

Dim h As Single = (b - a) / n

Dim s As Single = (FInt(a) + 4 * FInt((a + b) / 2) + FInt(b)) * h / 3

Dim s1, x As Single

Do

n *= 2

h = (b - a) / n

s1 = s

cc = 4

x = a

s = FInt(a) + FInt(b)

For i = 1 To n - 1

x += h

s += cc * FInt(x)

cc = 6 - cc

Next

s *= h / 3

Loop Until Abs(s - s1) / 15 < e

Return s

End Function

Private Function Interp(ByVal x As Single, ByVal k As Integer, ByVal c(,) As Single) As Single

Dim i, j As Integer

Dim L, L1 As Single

L = 0

For i = 0 To k

L1 = 1

For j = 0 To k

If i <> j Then

L1 *= (x - c(j, 0)) / (c(i, 0) - c(j, 0))

End If

Next j

L += L1 * c(i, 1)

Next i

Return L

End Function

Public Function Interp_mod(ByVal x As Single, ByVal k As Integer) As Single

Dim c(k, 1) As Single

Dim f, i, j, d, l As Integer

Dim h As Single = XY_Arr(1, 0) - XY_Arr(0, 0)

For i = 0 To Num

If (x - XY_Arr(i, 0) < h) Then

f = i

Exit For

'Else

' f = i

End If

Next

i = 0

j = 0

l = 0

While i <= k

d = f - Pow(-1, l) * j

If (Not (d < 0 Or d > Num)) Then

c(i, 0) = XY_Arr(d, 0)

c(i, 1) = XY_Arr(d, 1)

i += 1

End If

If (l Mod 2 = 0) Then j += 1

l += 1

End While

Return Interp(x, k, c)

End Function

Public Sub FTab2(ByVal a As Single, ByVal b As Single, ByVal h As Single, ByRef txt As String)

Dim i As Integer

Dim n As Integer = (b - a) / h

Dim y, yt, x As Single

Num = n

ReDim XY_Arr(Num, 1)

For i = 0 To Num

XY_Arr(i, 0) = a + i * h

XY_Arr(i, 1) = F(XY_Arr(i, 0))

Next

txt = "i" + Space(12) + "x" + Space(17) + "P2(x)" + Space(17) + "yt" + Space(17) + "dy" + vbNewLine

For i = 0 To n

x = XY_Arr(i, 0)

y = P(x)

yt = XY_Arr(i, 1)

txt += Format(i, "00") + Space(6) + Format(x, "0.0000") + Space(6) + Format(y, "0.0000") + Space(6) + Format(yt, "0.0000") + Space(6) + Format(yt - y, "0.0000") + vbNewLine

Next

End Sub

Public Function Optimization_Dih(ByVal a As Single, ByVal b As Single, ByVal E As Single, ByRef y As Single, ByRef t As String) As Single

Dim d, x1, x2 As Single

t = "Оптимизация:" + vbNewLine

t += "a" + Space(15) + "b" + Space(15) + "x1" + Space(15) + "x2" + Space(15) + "y1" + Space(15) + "y2" + Space(15) + "l" + vbNewLine

d = 0.1 * E

Do

x1 = (a + b - d) / 2

x2 = (a + b + d) / 2

t += Format(a, "0.0000") + Space(6) + Format(b, "0.0000") + Space(6) + Format(x1, "0.0000") + Space(6) + Format(x2, "0.0000") + Space(6)

t += Format(P(x1), "0.0000") + Space(6) + Format(P(x2), "0.0000") + Space(6) + Format(b - a, "0.0000") + vbNewLine

If (-P(x1)) > (-P(x2)) Then

a = x1

Else

b = x2

End If

Loop Until Abs(b - a) <= E

t += Format(a, "0.0000") + Space(6) + Format(b, "0.0000") + Space(6) + Format(x1, "0.0000") + Space(6) + Format(x2, "0.0000") + Space(6)

t += Format(P(x1), "0.0000") + Space(6) + Format(P(x2), "0.0000") + Space(6) + Format(b - a, "0.0000") + vbNewLine

x1 = (a + b) / 2

y = P(x1)

Return x1

End Function

End Module

8. Результаты программы

9. Полное решение с помощью пакета MathCad 14

Табуляция функции(интегрирование)

Интерполяция

нахождение максимума

10. Полный программный код тестирования

Imports System.Math

Public Class Form3

Dim XY_Arr(,) As Single

Dim Num As Integer

Dim a, b, EE As Single

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

End

End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim m As String = ""

Dim a, b, EE As Double

vvod(TextBox6, a)

vvod(TextBox5, b)

vvod(TextBox3, EE)

Simpsontest(a, b, EE, m)

vyvod(m, TextBox2)

End Sub

Function Simpsontest(ByVal a As Single, ByVal b As Single, ByVal E As Single, ByRef t As String) As Single

Dim h, S1, x, S As Single

Dim n, c, i As Integer

t = ""

n = 2

h = (b - a) / n

S = (ftest(a) + 4 * ftest((a + b) / 2) + ftest(b)) * h / 3

Do

n = 2 * n

h = (b - a) / n

S1 = S

c = 4

x = a

S = ftest(a) + ftest(b)

For i = 1 To n - 1

x = x + h

S = S + c * ftest(x)

c = 6 - c

Next

S = S * h / 3

t = t + Space(2) + "h=" + Format(h, "0.0000") + Space(6) + "S1=" + Format(S1, "0.0000") + Space(6) + "S=" + Format(S, "0.0000") + Space(6) + "n=" + CStr(n) + vbNewLine

Loop Until Abs(S - S1) / 15 <= E

t = t + vbNewLine

t = t + Space(2) + "h=" + Format(h, "0.0000") + Space(6) + Space(6) + "S=" + Format(S, "0.0000") + Space(6) + "n=" + CStr(n) + vbNewLine

Return S

End Function

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click

Dim x0, ee, b, x, y As Single

Dim txt3 As String

txt3 = ""

x0 = vinput(TextBox8)

ee = vinput(TextBox1)

b = vinput(TextBox7)

x = Optimization_Dih1(x0, b, ee, y, txt3)

voutput(txt3, TextBox4)

voutput("xmax=" + Format(x, "0.000") + " ymax=" + Format(y, "0.000"), Label13)

End Sub

Public Function Optimization_Dih1(ByVal a As Single, ByVal b As Single, ByVal E As Single, ByRef y As Single, ByRef t As String) As Single

Dim d, x1, x2 As Single

t = "a" + Space(15) + "b" + Space(15) + "x1" + Space(15) + "x2" + Space(15) + "y1" + Space(15) + "y2" + Space(15) + "l" + vbNewLine

d = 0.1 * E

Do

x1 = (a + b - d) / 2

x2 = (a + b + d) / 2

t += Format(a, "0.0000") + Space(6) + Format(b, "0.0000") + Space(6) + Format(x1, "0.0000") + Space(6) + Format(x2, "0.0000") + Space(6)

t += Format(Fd(x1), "0.0000") + Space(6) + Format(Fd(x2), "0.0000") + Space(6) + Format(b - a, "0.0000") + vbNewLine

If (-Fd(x1)) > (-Fd(x2)) Then

a = x1

Else

b = x2

End If

Loop Until Abs(b - a) <= E

t += Format(a, "0.0000") + Space(6) + Format(b, "0.0000") + Space(6) + Format(x1, "0.0000") + Space(6) + Format(x2, "0.0000") + Space(6)

t += Format(Fd(x1), "0.0000") + Space(6) + Format(Fd(x2), "0.0000") + Space(6) + Format(b - a, "0.0000") + vbNewLine

x1 = (a + b) / 2

y = Fd(x1)

Return x1

End Function

Public Function Fd(ByVal x As Single) As Single

Return -(x ^ 2) + 1

End Function

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

Dim a, k, h, b As Single

a = vinput(tb31)

k = vinput(tb34)

h = vinput(tb33)

b = vinput(tb32)

voutput(Interp_test(a, b, h, k), tb35)

End Sub

Public Function Interp_test(ByVal a As Single, ByVal b As Single, ByVal h As Single, ByVal k As Integer) As String

Dim txt As String

Dim i As Integer

Dim yt, y, x As Single

Num = (b - a) / h + 1

ReDim XY_Arr(Num, 1)

For i = 0 To Num - 1

XY_Arr(i, 0) = a + h * i

XY_Arr(i, 1) = XY_Arr(i, 0) * XY_Arr(i, 0)

Next

txt = "i" + Space(12) + "x" + Space(17) + "y" + Space(17) + "L" + Space(17) + "y-L" + vbNewLine

h /= 2

Dim n As Integer = (b - a) / h + 1

For i = 0 To n - 1

x = a + h * i

y = Filt(x)

yt = Interp_mod1(x, k)

txt += Format(i, "00") + Space(6) + Format(x, "0.0000") + Space(6) + Format(y, "0.0000") + Space(6) + _

Format(yt, "0.0000") + Space(6) + Format(y - yt, "0.0000") + vbNewLine

Next

Return txt

End Function

Public Function Interp1(ByVal x As Single, ByVal k As Integer, ByVal c(,) As Single) As Single

Dim i, j As Integer

Dim L, L1 As Single

L = 0

For i = 0 To k

L1 = 1

For j = 0 To k

If i <> j Then

L1 *= (x - c(j, 0)) / (c(i, 0) - c(j, 0))

End If

Next j

L += L1 * c(i, 1)

Next i

Return L

End Function

Public Function Interp_mod1(ByVal x As Single, ByVal k As Integer) As Single

Dim c(k, 1) As Single

Dim f, i, j, d, l As Integer

Dim h As Single = XY_Arr(1, 0) - XY_Arr(0, 0)

For i = 0 To Num - 1

If (x - XY_Arr(i, 0) < h) Then

f = i

Exit For

End If

Next

i = 0

j = 0

l = 0

While i <= k

d = f - Pow(-1, l) * j

If (Not (d < 0 Or d > Num - 1)) Then

c(i, 0) = XY_Arr(d, 0)

c(i, 1) = XY_Arr(d, 1)

i += 1

End If

If (l Mod 2 = 0) Then j += 1

l += 1

End While

Return Interp1(x, k, c)

End Function

Public Function Filt(ByVal x As Single) As Single

Return x * x

End Function

Function ftest(ByVal x As Single) As Single

Return x ^ 2

End Function

Public Sub vvod(ByVal t As TextBox, ByRef x1 As Single)

x1 = CSng(Val(t.Text))

End Sub

Public Sub vyvod(ByVal l As String, ByRef t As TextBox)

t.Text = l

End Sub

End Class

11. Результаты тестирования

Тест интегрирования:

Точность

S

0.001

9

Решение в MathCad 14:

Тестирование метода дихотомии:

Точность

Xmax

Ymax

a-b

0.1

-0.031

0.999

0.0723

0.01

-0.004

1.000

0.0088

0.001

0.000

1.000

0.0006

Проверка в пакете MathCad 14: (можно обходится и без проверки, т.к. пример простой и ответ можно посчитать в уме)

Тест интерполяции по Лагранжу:

L точно повторяет функцию, подобранную для теста, разница между ними отсутствует, следовательно процедура работает верно.

к - степень интерполяционного многочлена, т.е. строит по 3м точкам

Вывод

В результате выполнения программы, вычисляющей искомые значения при помощи выбранных нами методов, мы получили требуемые значения. Результаты, полученные в ходе программного решения данной задачи и результаты, полученные с помощью математического пакета MATHCAD совпадают,

,

что соответствует верности решения задачи. При программном решении задачи мы использовали модульное программирование, которое позволило упростить нашу задачу. Для решения мы использовали наиболее эффективные методы численного интегрирования, интерполяции и одномерной оптимизации. Таким образом, мы нашли значение максимума функции с использованием численных методов и модульного программирования.

Используемая литература

1. Кравченко О.М., Семенова Т.И., Шакин В.Н. «Модели решения задач Численные методы и оптимизация» 2003 г.

2. Гловацкая А.П., Загвоздкина А.В., Кравченко О.М. «Практикум. Численные методы и оптимизация по дисциплине “Информатика”» 2004 г.

Размещено на Allbest.ru


Подобные документы

  • Рассмотрение методов приближенного численного анализа. Формулы интегрирования, прямоугольников, трапеций, формула Симпсона. Оценка погрешностей интегрирования. Вычисление интеграла по формуле трапеций с тремя десятичными знаками и по формуле Симпсона.

    курсовая работа [995,7 K], добавлен 09.07.2012

  • Формула Симпсона как интеграл от интерполяционного многочлена второй степени, рассмотрение сфер использования. Знакомство с основными особенностями и этапами написания программы для численного интегрирования с помощью формулы Симпсона, анализ примеров.

    практическая работа [153,8 K], добавлен 16.03.2015

  • Постановка задачи численного интегрирования. Классификация методов интегрирования: методы Ньютона-Котеса; методы статистических испытаний; сплайновые методы; методы наивысшей алгебраической точности. Метод Симпсона: суть; преимущества и недостатки.

    реферат [165,3 K], добавлен 01.03.2011

  • Метод численного интегрирования. Использование метода половинного деления для решения нелинейного уравнения. Определение отрезка неопределенности для метода половинного деления. Получение формулы Симпсона. Уменьшение шага интегрирования и погрешности.

    курсовая работа [3,0 M], добавлен 21.05.2013

  • Математическое описание численных методов решения уравнения, построение графика функции. Cтруктурная схема алгоритма с использованием метода дихотомии. Использование численных методов решения дифференциальных уравнений, составление листинга программы.

    курсовая работа [984,2 K], добавлен 19.12.2009

  • Методы левых и правых прямоугольников численного интегрирования для вычисления интегралов. Геометрический смысл определённого интеграла. Программная реализация, блок-схемы алгоритмов. Результат работы тестовой программы. Решение задачи с помощью ЭВМ.

    курсовая работа [180,4 K], добавлен 15.06.2013

  • Реализация интегрирования функции методами прямоугольников, трапеций, Симпсона. Построение графика сравнения точности решения методов интегрирования в зависимости от количества разбиений. Алгоритм расчета энтропии файлов с заданным расширением.

    контрольная работа [1011,0 K], добавлен 04.05.2015

  • Интерполирование функций методом Лагранжа. Получение функциональной зависимости по экспериментальным данным. Близость интерполяционного многочлена к заданной функции. Интерполяционный полином в форме Лагранжа. Построение интерполяционных графиков.

    лабораторная работа [315,8 K], добавлен 24.05.2014

  • Исследование внутренней сходимости численного интегрирования методами Симпсона и трапеций различных функций, задаваемых с помощью функций языка C. Результаты исследования, их анализ, описание применения. Условия и характеристики выполнения программы.

    курсовая работа [385,2 K], добавлен 14.03.2011

  • Изучение численных методов решения нелинейных уравнений. Построение годографа АФЧХ, графиков АЧХ и ФЧХ с указанием частот. Практическое изучение численных методов интегрирования дифференциальных уравнений высокого порядка, метод Рунге-Кутта 5-го порядка.

    курсовая работа [398,3 K], добавлен 16.06.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.