968

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

Курсовая

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

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

Русский

2013-01-06

585 KB

47 чел.

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

Определить с точностью 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


 

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

39395. Расчет автооператорной линии для нанесения двухслойного покрытия медь-никель стальных деталей на подвеске 44.62 KB
  Рассчитать и скомпоновать автооператорную линию для нанесения двухслойного покрытия медь-никель стальных деталей на подвеске.
39396. Автоматизація технологічних процесів сільськогосподарського виробництва 66.57 KB
  Розрахунковий термін окупності відповідає нормативному, що дає право твердити про ефективність запропонованого проекту.
39397. ЕКОНОМІКА ПІДПРИЄМСТВА 854 KB
  У процесі виконання курсової роботи студенти зобов’язані продемонструвати набуті теоретичні знання, вміння поєднати їх з практикою виробничо-комерційної діяльності підприємства незалежно від форми господарювання, враховуючи особливості ринкового механізму, особливості розподілу та використання фінансових і матеріальних ресурсів
39398. Экономика фирмы 1.29 MB
  Рассчитать основные финансовые коэффициенты. Анализируемый период Изменение Рост прирост Фондоотдача Фондоемкость Рентабельность основных средств Количество оборотов оборотных средств Продолжительность одного оборота оборотных средств Коэффициент загрузки оборотных средств Рентабельность реализации продукции Рентабельность оборотных средств Рентабельность оборотного капитала Таблица № 3. основные финансовые коэффициенты Показатели Нормат. значение Анализируемый ...
39399. Разработка моделей для информационной системы 95.33 KB
  Решение: Были разработаны следующие UMLдиаграммы: диаграмма вариантов использования; диаграмма классов; диаграмма деятельности; диаграмма последовательности; Сценарий: Пользователь решает забронировать авиабилеты. Диаграмма вариантов использования: Диаграмма на которой отражены отношения существующие между актёрами и вариантами использования. Диаграмма классов: Диаграмма которая описывает структуру системы показывая её классы их атрибуты и операторы а также взаимосвязи этих классов. Диаграмма деятельности: Диаграмма на...
39400. Охрана труда женщин в трудовом законодательстве 194.78 KB
  Понятие и содержание охраны труда. Обязанности работодателя по обеспечению безопасных условий и охраны труда и их содержание. Охрана труда женщин. Особенности регулирования труда женщин, имеющих детей в возрасте до 3-х лет...
39401. Разработка схемы локальной вычислительной сети в соответствии с техническим заданием 149.5 KB
  В данной работе требуется разработать схему локальной вычислительной сети в соответствии с техническим заданием Техническое задание. 2 Внутри сети должно быть несколько различных путей между некоторыми узлами. 3 У ЛВС должно быть подключение к глобальной сети.
39403. Производство химико-термомеханической массы из осиновой древесины 116.21 KB
  После пропарки щепа влажностью 5060 шнековым конвейером через пароотделитель подаётся на шнековый питатель который подаёт щепу непосредственно в дисковую мельницу 1й ступени 13 где щепа размалывается под давлением 025 МПа. Из дисковой мельницы 1й ступени масса за счет давления пара образующегося в дисковой мельнице выдувается в циклон 14. Пар из циклона направляется на рекуперацию а масса шнековым питателем подается на распределительный конвейер 2й ступени размола. Шнековым питателем масса подается в зону размола дисковой...