968

Определение с точностью площади криволинейной трапеции

Курсовая

Информатика, кибернетика и программирование

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

Русский

2013-01-06

585 KB

53 чел.

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

Определить с точностью E площадь криволинейной трапеции, ограниченной осью OX, прямыми и и кривой C - абсцисса точки минимума функции

Решить уравнение:

Формализация задачи:

Для выполнения поставленного задания воспользуемся следующими методами для каждой конкретной задачи:

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

2. Для определения площади криволинейной трапеции  воспользуемся методом Симпсона

3. Для решения поставленного уравнения используем метод половинного деления

Упрощенный алгоритм решения задачи:

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

1. Найдём точку минимума функции одним из методов одномерной оптимизации - методом золотого сечения.

Т.к. на каждой итерации, кроме первой, требуется вычисление одного значения функции (в методе дихотомии вычисляются два значения функции), поскольку точка есть вторая точка золотого сечения отрезка , а точка   - первая точка золотого сечения отрезка

Полученное значение в результате оптимизирования методом золотого сечения, будет являться значением константы C, которое будет определённо с погрешностью . Это значение C подставим в функцию .

2. Для нахождения площади криволинейной трапеции воспользуемся методом Симпсона

Метод Симпсона, является самым точным методом численного интегрирования, также функция содержит экспоненту и квадратный корень, поэтому воспользуемся им.

3. Для получения нелинейного уравнения, нужно взять определённый интеграл от функции по пределам интегрирования a и x:

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

  1.  Отделение корня;
  2.  Уточнение корня.

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

Краткое описание методов решения:

Одномерная оптимизация по методу золотого сечения:

В основу метода положено разбиение отрезка неопределенности [a;b]  в соотношении золотого сечения, такого, что отношение длины его большей части ко всей длине отрезка равно отношению длины его меньшей части к длине его большей части.

В методе золотого сечения каждая точка 1 и х2)осуществляет золотое сечение отрезка:

\

Нетрудно проверить, что точка х1 осуществляет золотое сечение не только отрезка [a;b], но и отрезка [a2]. Точно так же точка х2 осуществляет  золотое сечение не только отрезка [a;b], но и отрезка 1;b]. Это приводит к тому, что значение целевой функции на каждой итерации (кроме первой) вычисляется один раз.

После каждой итерации длина отрезка неопределенности сокращается в 1.618 раза. Длина конечного отрезка неопределенности Dn = 0.618nD0, где    D0= (b-a) – начальная длина отрезка.

Условие окончания процесса итераций   Dn  e. Отсюда можно найти количество итераций, необходимое для достижения точки минимума:

отсюда  логарифмируя, получим 

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

Для интервала интегрирования [a;b] формула Симпсона выглядит следующим образом:                          

, где , n – количество отрезков разбиения

Метод половинного деления:

Пусть корень уравнения f(x)=0 отделен на отрезке [a;b], то есть на этом отрезке имеется единственный корень, а функция на данном  отрезке непрерывна.

Метод половинного деления  позволяет получить последовательность вложенных друг в друга отрезков   [a1;b1], [a2;b2], …,[ai;bi],…, [an;bn],   таких что f(ai).f(bi) < 0,                                   где i=1,2,…,n, а длина каждого последующего отрезка вдвое меньше длины предыдущего:

 

В методе половинного деления от итерации к итерации происходит последовательное уменьшение  длины первоначального отрезка [a0;b0]  в два раза            (рис. 6.2.3-1). Поэтому на n-м шаге справедлива следующая оценка погрешности результата:

                                                          

где  - точное значение корня, хnÎ [an;bn] – приближенное значение корня на n-м шаге.                                             

Сравнивая полученную оценку погрешности с заданной точностью , можно оценить требуемое число шагов:

           

Тестирование метода золотого сечения:

Проверка на Mathcad 14

Схема алгоритма метода золотого сечения:

Программный код:

Imports System.Math

Public Class Form1

   Function f(ByVal x As Single)

       f = sqrt(x ^ 3) – x – 2 * cos(x)

   End Function

   Function vvod(ByVal T As TextBox)

       Return CSng(Val(T.Text))

   End Function

   Sub vivod(ByVal x As Single, ByVal T As TextBox)

       T.Text = CStr(x)

   End Sub

   Sub vivodint(ByVal x As Integer, ByVal T As TextBox)

       T.Text = CStr(x)

   End Sub

   Sub gold(ByVal a As Single, ByVal b As Single, ByVal eps As Single, _

               ByRef x As Single, ByRef n As Integer, ByRef L As ListBox)

       Dim k1, k2, x1, x2, f1, f2 As Single, z As String

       k1 = (3 - Sqrt(5)) / 2

       k2 = 1 - k1

       x1 = a + k1 * (b - a)

       x2 = a + k2 * (b - a)

       f1 = f(x1)

       f2 = f(x2)

       n = 0

       Do Until (b - a) < eps

           n = n + 1

           If n > 100 Then

               z = CStr(n) + Space(2)

           ElseIf n >= 10 Then

               z = CStr(n) + Space(4)

           Else

               z = CStr(n) + Space(6)

           End If

           z = z + Format(a, "0.00000") + Space(3) + Format(b, "0.00000") + Space(3) + Format(x1, "0.00000") + Space(3)

           z = z + Format(x2, "0.00000") + Space(5) + Format(f1, "0.00000") + Space(5) + Format(f2, "0.00000") + Space(5) + Format(b - a, "0.00000")

           L.Items.Add(z)

           If f1 < f2 Then

               b = x2 : x2 = x1

               x1 = a + k1 * (b - a)

               f2 = f1 : f1 = f(x1)

           Else

               a = x1 : x1 = x2 : f1 = f2

               x2 = a + k2 * (b - a)

               f2 = f(x2)

           End If

       Loop

       x = (a + b) / 2

   End Sub

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

       Dim a, b, x, eps As Single

       Dim n As Integer

       a = vvod(TextBox1)

       b = vvod(TextBox2)

       eps = vvod(TextBox3)

       gold(a, b, eps, x, n, ListBox1)

       vivodint(n, TextBox4)

       vivod(x, TextBox5)

       vivod(f(x), TextBox6)

   End Sub

End Class

Решение метода:

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

Проверка на MathCad:

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

Программный код:

Imports System.Math

Public Class Form1

   Function f(ByVal x As Single) As Single

   f = 0.181704 * exp(-x) + (x ^ 2) * sin(x)

   End Function

   Function vvod(ByVal T As TextBox)

       Return CSng(Val(T.Text))

   End Function

   Sub vivod(ByVal x As Single, ByVal T As TextBox)

       T.Text = CStr(x)

   End Sub

   Sub vivodint(ByVal x As Integer, ByVal T As TextBox)

       T.Text = CStr(x)

   End Sub

   

   Sub simpson(ByVal a As Single, ByVal b As Single, ByVal eps As Single, ByRef s As Single, _

            ByRef n As Integer, ByRef h As Single, ByRef L As ListBox)

       Dim i, c As Integer

       Dim s1, x As Single, z As String

       n = 2

       h = (b - a) / n

       s = (f(a) + 4 * f((a + b) / 2) + f(b)) * h / 3

       Do

           h = h / 2

           n = 2 * n : s1 = s : c = 4 : x = a

           s = f(a) + f(b)

           For i = 1 To n - 1

               x = x + h

               s = s + c * f(x)

               c = 6 - c

           Next

           s = s * h / 3

           If n > 100 Then

               z = CStr(n) + Space(2)

           ElseIf n > 10 Then

               z = CStr(n) + Space(4)

           Else

               z = CStr(n) + Space(6)

           End If

           z = z + Format(h, "0.00000") + Space(3) + Format(s, "0.00000")

           L.Items.Add(z)

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

   End Sub

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

       Dim a, b, c, h As Single

       Dim n As Integer

       a = vvod(TextBox1)

       b = vvod(TextBox11)

       simpson(a, b, 0.001, c, n, h, ListBox1)

       vivodint(n, TextBox2)

       vivod(h, TextBox3)

       vivod(c, TextBox4)

   End Sub

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

       End

   End Sub

End Class

Решение метода:

Тестирование метода половинного деления:

Проверка на MathCad:

Схема алгоритма метода половинного деления

Программный код:

Imports System.Math

Public Class Form1

   Function f(ByVal x As Single)

       f = -0.181704 * Exp(-x) + 0.181704 - (x ^ 2) * Cos(x) - 2 * x * Sin(x) + 2 * Cos(x)

   End Function

   Function vvod(ByVal T As TextBox)

       Return CSng(Val(T.Text))

   End Function

   Sub vivod(ByVal x As Single, ByVal T As TextBox)

       T.Text = CStr(x)

   End Sub

   Sub vivodint(ByVal x As Integer, ByVal T As TextBox)

       T.Text = CStr(x)

   End Sub

   Function formint(ByVal n As Integer) As String

       Dim z As String = ""

       z = CStr(n)

       If n < 10 Then z = "  " + z

       Return z

   End Function

   Function form(ByVal x As Single) As String

       Dim z As String = ""

       z = Format(x, "0.00000")

       If x > 0 Then z = " " + z

       Return z

   End Function

   Sub mpd(ByVal a As Single, ByVal b As Single, ByVal eps As Single, ByRef c As Single, _

            ByRef n As Integer, ByRef L As ListBox)

       Dim z As String

       n = 0

       Do

           c = (a + b) / 2

           n = n + 1

           If f(c) * f(b) < 0 Then a = c Else b = c

           z = formint(n) + Space(2) + form(a) + Space(2) + form(b) + Space(2) + _

               form(c) + Space(2) + form(f(a)) + Space(2) + form(f(b)) + _

               Space(2) + form(f(c)) + Space(2) + form(b - a)

           L.Items.Add(z)

       Loop Until Abs(b - a) < eps

       c = (a + b) / 2

   End Sub

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

       Dim a, b, c As Single

       Dim n As Integer

       a = vvod(TextBox1)

       b = vvod(TextBox2)

       mpd(a, b, 0.01, c, n, ListBox1)

       vivodint(n, TextBox3)

       vivod(c, TextBox4)

       vivod(f(c), TextBox5)

   End Sub

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

       End

   End Sub

End Class

Решение метода:

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

Первая форма:

Public Class Form1

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       TextBox1.Text = "0"

       Textbox2.Text = "5"

      

   End Sub

   Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click

       Form2.Show()

   End Sub

   Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button2.Click

       End

   End Sub

End Class

Вторая форма:

Public Class Form2

   Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       TextBox1.Text = Form1.TextBox1.Text

       TextBox2.Text = Form1.TextBox2.Text

       TextBox3.Text = "0.00001"

       Textbox4.Text = "0"

       TextBox5.Text = "0"

       TextBox6.Text = "0"

       listbox1.Text = ""

   End Sub

   Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click

       Dim a, b, eps, x As Single

       a = vvod(TextBox1)

       b = vvod(TextBox2)

       eps = vvod(TextBox3)

       gold(a, b, eps, x)

       vivod(x, textbox5)

       vivod(f(x), textbox6)

   End Sub

   Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button2.Click

       Form3.Show()

   End Sub

End Class

Третья форма:

Public Class Form3

   Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       Textbox1.Text = Form1.TextBox1.Text

       Textbox2.Text = Form1.TextBox2.Text

       Textbox3.Text = "0"

       Listbox1.Text = ""

   End Sub

   Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click

       Dim a, b, s, h, eps As Single

       Dim n As Integer

       eps = vvod(TextBox4)

       a = vvod(TextBox1)

       b = vvod(TextBox2)

       simpson(a, b, eps, s, n, h)

       vivod(s, TextBox3)

   End Sub

   Private Sub button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button2.Click

       Form4.Show()

   End Sub

End Class

Четвёртая форма:

Public Class Form4

   Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       Textbox1.Text = Form1.TextBox1.Text

       Textbox2.Text = Form1.TextBox2.Text

       Textbox3.Text = "0"

       Textbox4.Text = "0"

       Listbox1.Text = ""

   End Sub

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

       Dim a, b, c, eps As Single

       Dim n As Integer

       a = vvod(Textbox1)

       b = vvod(TextBox2)

       eps = vvod(TextBox5)

       mpd(a, b, 0.001, c, n)

       vivod(c, TextBox3)

       vivod(H(c), TextBox4)

   End Sub

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

       End

   End Sub

End Class

Модуль:

Imports System.Math

Module Module1

   Dim XY_arr As Single(,)

   Dim Num As Integer

   Dim Ac As Single()

   Public Function vvod(ByVal t As TextBox) As Single

       Return CSng(Val(t.Text))

   End Function

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

       t.Text = s

   End Sub

   Public Sub vivod(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 vivod(ByVal s As String, ByRef t As Label)

       t.Text = s

   End Sub

   Public Function F(ByVal x As Single) As Single

       Return (Sqrt(x ^ 3) - x - 2 * Cos(x))

   End Function

   Public Function G(ByVal x As Single) As Single

       Dim xx As Single

       xx = gold(0, 5, 0.001, x)

       Return (xx * Exp(-x) + (x ^ 2) * Sin(x))

   End Function

   Public Function H(ByVal x As Single) As Single

       Return (gold(0, 5, 0.001, x) * Exp(-x) + gold(0, 5, 0.001, x) - (x ^ 2) * Cos(x) - 2 * x * Sin(x) + 2 * Cos(x))

   End Function

   Public Function gold(ByVal a As Single, ByVal b As Single, ByVal eps As Single, _

               ByRef x As Single) As Single

       Dim k1, k2, x1, x2, f1, f2 As Single, z As String

       Dim n As Integer

       k1 = (3 - Sqrt(5)) / 2

       k2 = 1 - k1

       x1 = a + k1 * (b - a)

       x2 = a + k2 * (b - a)

       f1 = F(x1)

       f2 = F(x2)

       n = 0

       Form2.ListBox1.Items.Clear()

       Do Until (b - a) < eps

           n = n + 1

           If n > 100 Then

               z = CStr(n) + Space(2)

           ElseIf n >= 10 Then

               z = CStr(n) + Space(4)

           Else

               z = CStr(n) + Space(6)

           End If

           z = z + Format(a, "0.00000") + Space(3) + Format(b, "0.00000") + Space(3) + Format(x1, "0.00000") + Space(3)

           z = z + Format(x2, "0.00000") + Space(5) + Format(f1, "0.00000") + Space(5) + Format(f2, "0.00000") + Space(5) + Format(b - a, "0.00000")

           Form2.ListBox1.Items.Add(z)

           If f1 < f2 Then

               b = x2 : x2 = x1

               x1 = a + k1 * (b - a)

               f2 = f1 : f1 = F(x1)

           Else

               a = x1 : x1 = x2 : f1 = f2

               x2 = a + k2 * (b - a)

               f2 = F(x2)

           End If

       Loop

       x = (a + b) / 2

       Return x

   End Function

   Sub simpson(ByVal a As Single, ByVal b As Single, ByVal eps As Single, ByRef s As Single, _

                ByRef n As Integer, ByRef h As Single)

       Dim i, c As Integer

       Dim s1, x As Single, z As String

       n = 2

       h = (b - a) / n

       s = (G(a) + 4 * G((a + b) / 2) + G(b)) * h / 3

       Form3.ListBox1.Items.Clear()

       Do

           h = h / 2

           n = 2 * n : s1 = s : c = 4 : x = a

           s = G(a) + G(b)

           For i = 1 To n - 1

               x = x + h

               s = s + c * F(x)

               c = 6 - c

           Next

           s = s * h / 3

           If n > 100 Then

               z = CStr(n) + Space(2)

           ElseIf n > 10 Then

               z = CStr(n) + Space(4)

           Else

               z = CStr(n) + Space(6)

           End If

           z = z + Format(h, "0.00000") + Space(3) + Format(Abs(s), "0.00000")

           Form3.ListBox1.Items.Add(z)

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

   End Sub

   Function formint(ByVal n As Integer) As String

       Dim z As String = ""

       z = CStr(n)

       If n < 10 Then z = "  " + z

       Return z

   End Function

   Function form(ByVal x As Single) As String

       Dim z As String = ""

       z = Format(x, "0.00000")

       If x > 0 Then z = " " + z

       Return z

   End Function

   Sub mpd(ByVal a As Single, ByVal b As Single, ByVal eps As Single, ByRef c As Single, _

            ByRef n As Integer)

       Dim z As String

       n = 0

       Form4.ListBox1.Items.Clear()

       Do

           c = (a + b) / 2

           n = n + 1

           If F(c) * F(b) < 0 Then a = c Else b = c

           z = formint(n) + Space(2) + form(a) + Space(2) + form(b) + Space(2) + _

               form(c) + Space(2) + form(F(a)) + Space(2) + form(F(b)) + _

               Space(2) + form(F(c)) + Space(2) + form(b - a)

           Form4.ListBox1.Items.Add(z)

       Loop Until Abs(b - a) < eps

       c = (a + b) / 2

   End Sub

End Module


 

А также другие работы, которые могут Вас заинтересовать

53673. Конспект урока по баскетболу в 7 классе 47 KB
  Ноги не сгибать Задняя нога прямая Равняйсь Смирно Вольно На носках марш На пятках марш На внешней стороне стопы марш На внутренней стороне стопы марш Бегом марш Бег с высоким поднимание колена марш Бег спиной вперед марш Противоходом марш Змейкой марш Шагом марш На месте шагом марш Стой раз два Фронтальная Основная 2025мин Совершенствование скорости реакции посредством игры в баскетбол Разделить на 2 команды. Однако тот не может начать эстафету пока предыдущий игрок не пересечет стартовую...
53675. Конспект урока по баскетболу в 8 классе 45.5 KB
  Части урока Частные задачи Средства Дозировка Методические указания Команды Форма проведения Подготовительная 1015мин Организованно начать урок Подготовить организм к предстоящей нагрузке Построение приветствие постановка задач Упражнения в ходьбе: на носках руки перед грудью кисти скрепить в замок круговые вращения в кистях; на пятках руки вперед на внешней стороне стопы на внутренней...
53676. Изготовление открытки к 23 февраля 72 KB
  Задачи: Образовательные: Познакомить с историческими сведениями о празднике День защитника отечества; Расширить практические навыки по изготовлению открыток; Воспитательные: Воспитание дисциплинированности активности уважения друг к другу; Воспитание культуры учащихся внимательности. 2 Создание эмоционального настроя Праздник всех солдатов наших Вот что значит этот день День защитников отважных Да и просто всех парней Ведь любой из них мечтает Защитить детей семью Покорить хоть чтото в мире И найти свою судьбу Слушают...
53677. Воображение 60.5 KB
  Познакомить студентов с понятием воображение с функциями видами воображения способами создания образов воображения. План урока с хронометражем времени: Организационный момент 5 минут; Опрос по пройденной теме 15 минут; Изучение нового материала 50 минут; понятие воображение функции воображения; виды воображения; приемы создания образов воображения. А сейчас приступаем к работе запишите себе пожалуйста тему урока Воображение.
53678. Конспект урока по физической культуре 38.5 KB
  На раз руки к плечам на два вверх на 3 к плечам на 4 на пояс руки в стороны. 4 спокойный бег 5 ходьба 1012 мин 30 сек 34 раз 56 раз 56 раз 67 раз 1012 раз 56 раз 78 раз 56 раз 1015 раз Вращения головы медленно Вращения как можно с большой амплитудой. Построение в ширинку делимся на команды на первыйвторой Игра в волейбол 2530 мин 1520 раз Упражнения делать по команде преподавателя.
53679. Конспект урока по физической культуре для 1 класса 70 KB
  Закрепить технику ловли малого мяча. Учить метанию малого мяча в вертикальную цель с места. Инвентарь: Малые мячи. Баскетбольные мячи.
53680. КОНСПЕКТ УРОКА ПО ГАНДБОЛУ 41 KB
  Победитель - команда определяется по наименьше затраченному времени на пятнание игроков и индивидуально выявляет...
53681. Конспект урока по гандболу для 5 класса 47 KB
  Способствовать развитию координации движений точности при выполнении ведения мяча и передачи двумя руками сверху стоя на месте. Упражнения для обучения ведению мяча на месте: ведение мяча на месте правой левой рукой в положении с выставленной ногой; ведение мяча на месте с изменением высоты отскока за счет сгибания и разгибания ног; ведение мяча на месте с переводом перед собой в стойке на параллельных ногах и с выставленной вперед ногой; ведение мяча на месте кисть накладывается на мяч...