Решение нелинейного уравнения и вычисление интеграла с помощью численных методов

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

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

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

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

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

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

ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ

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

профессионального образования

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

КУРСОВАЯ РАБОТА

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

Выполнил: студент гр. БИН1104

Канаев С.Д.

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

Москва 2013 г.

Задание

Задана функция y(x)=. Найти значение параметра a, которое обеспечивает максимальное приближение P(a)= к значению 0,95.

x1=0; x2=a+2b; b=2

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

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

Чтобы найти оптимальное значение параметра a, для начала, нам необходимо вычислить интеграл P(a)=, где x1 и x2- пределы интегрирования, равные соответственно 0 и a+2b, а подынтегральная функция y(x)= . Данный интеграл мы вычислим с помощью метода численного интегрирования. Далее, с помощью численных методов, нужно решить нелинейное уравнение: P(a)-0.95=0. Вычисления будем проводить до тех пор, пока не достигнем заданной точности.

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

Укрупненная блок схема:

Выбор и обоснование используемых методов

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

численный интегрирование нелинейный уравнение

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

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

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

Последовательное сужение отрезка вокруг неизвестного значения корня обеспечивает выполнение на некотором шаге n неравенства b - a . С точностью любое может быть принято за приближенное значение корня, например его середину отрезка С помощью следующей формулы можно оценить требуемое число шагов , что мы и сделаем в самом конце, сравнив с результатом на ПК.

Определение отрезка неопределенности для метода половинного деления

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

Следуя из вычислений в MathCad, зададим для параметра a интервал значений: a€

Проверка сходимости метода половинного деления

Для сходимости метода, необходимо чтобы на выбранном отрезке был отделен один корень. Если на отрезке [a;b] выполняется условие z(a)*z(b)<0 и z '(x) сохраняет знак, то на отрезке отделен один корень.

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

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

Для получения формулы Симпсона применяется квадратичный интерполирующий полином, следовательно, за элементарный интервал интегрирования принимается отрезок [xi;xi+2]. Поэтому разобьем интервал интегрирования [a;b] на n отрезков, где n=2m - четное число.

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

Метод двойного просчёта

Уменьшение шага интегрирования (h) приводит к уменьшению погрешности. При реализации численных методов на ПК будем использовать метод двойного просчёта, позволяющий получить оценку погрешности в неявном виде. Этот прием основан на двукратном вычислении значения интеграла вначале с шагом h (где h=(b-a)/n), а затем с шагом h/2. Полученные значения интегралов Ih и Ih/2 могут быть применены для оценки погрешности интегрирования по формуле:

где: k=4 - для формулы Симпсона.

Проверка непрерывности подынтегральной функции для применения метода Симпсона с использованием метода двойного просчёта

Интеграл функции y(x) в пределах от x1 до x2 существует и может быть вычислен методом Симпсона с использованием метода двойного просчёта, если функция y(x) непрерывна на отрезке [x1;x2] и дифференцируема на нём. Проверим эти условия для нашей функции. В нашем случае в функцию входит экспонента (exp), следовательно, подынтегральная функция будет непрерывна и дифференцируема.

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

Тестирование процедур, реализующих численные методы

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

Для проверки правильности процедуры, реализующей метод половинного деления, найдем корень функции y(x)=sin(x) на отрезке [-1;1]. Единственный корень уравнения равен нулю.

Найдем корень уравнения с использованием средств пакета MathCad

Ниже приведены схема тестируемой процедуры, код программы и результаты её выполнения.

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

Код программы

Option Strict On

Option Explicit On

Imports System.Math

Public Class Form1

'Процедура ввода данных

Sub vvod(ByRef a As Single, ByRef b As Single, ByRef Eps As Single)

a = CSng(TextBox1.Text) 'Левая граница отрезка неопределенности

b = CSng(TextBox2.Text) 'Правая граница отрезка неопределенности

Eps = CSng(TextBox3.Text) ' Заданная точность

End Sub

'Процедура вывода данных

Sub vivod(ByVal n As Integer, ByVal c As Single)

TextBox4.Text = CStr(n) 'Выводим кол-во итераций

TextBox5.Text = CStr(Format(c, "0.000")) 'Выводим значение корня НУ

TextBox6.Text = CStr(Format(f(c), "0.000")) 'Выводим значение функции для этого корня

End Sub

'Функция f(x)

Function f(ByVal x As Single) As Single

Dim f1 As Single

f1 = CSng(Sin(x))

Return f1

End Function

'Процедура решения НУ методом половинного деления

Sub Poldel(ByVal a As Single, ByVal b As Single, ByVal Eps As Single, ByRef n As Integer,ByRef c As Single)

Do

c = (a + b) / 2 'Вычисление точки середины отрезка [a;b]

n = n + 1 'Счётчик

If f(c) * f(b) < 0 Then

a = c

Else

b = c

End If

ListBox1.Items.Add(n)

ListBox2.Items.Add(a)

ListBox3.Items.Add(b) 'Вывод промежуточных результатов

ListBox4.Items.Add(f(a))

ListBox5.Items.Add(f(b))

Loop Until Abs(b - a) <= Eps Or f(c) = 0

End Sub

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

Dim a, b, Eps, c As Single

Dim n As Integer

vvod(a, b, Eps)

Poldel(a, b, Eps, n, c) 'Обращение к процедурам

vivod(n, c)

End Sub

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

End

End Sub

End Class

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

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

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

Для проверки правильности процедуры, реализующей метод Симпсона, в качестве теста используем функцию f(x) = x4, границы интегрирования [0;1].

Произведя несложный расчет, можно определить, что значение интеграла будет равно 0,2.

Проведем проверку правильности расчета с использованием средств пакета MathCad:

Ниже приведены схема тестируемой процедуры, код программы и результаты её выполнения.

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

Код программы

Option Strict On

Option Explicit On

Imports System.Math

Public Class Form1

'Процедура ввода данных

Sub vvod(ByRef x1 As Single, ByRef x2 As Single, ByRef Eps As Single)

x1 = CSng(TextBox1.Text)

x2 = CSng((TextBox2.Text))

Eps = CSng((TextBox3.Text))

End Sub

'Процедура вывода значений

Sub vivod(ByVal h As Single, ByVal n As Integer, ByRef S As Single, ByVal Eps As Single)

TextBox4.Text = CStr(h)

TextBox5.Text = CStr(n)

TextBox6.Text = CStr(S)

TextBox7.Text = CStr(Eps)

End Sub

'Функция f

Function f(ByVal X As Single) As Single

Dim func As Single

func = CSng(X ^ 4)

Return func

End Function

'Процедура решения интеграла методом Симпсона

Sub main(ByRef x1 As Single, ByRef x2 As Single, ByRef h As Single, ByRef n As Integer, _

ByRef S As Single, ByVal Eps As Single)

Dim s1, c, x As Single

Dim k As Integer

n = 2 'начальное число участков разбиения интервала интегрирования

h = (x2 - x1) / n

S = (f(x1) + 4 * f((x1 + x2) / 2) + f(x2)) * (h / 3)'значение интеграла

Do

n = 2 * n 'число участков разбиения интервала интегрирования

h = (x2 - x1) / n 'вычисление шага

s1 = S

c = 4

x = x1

S = f(x1) + f(x2)

For k = 0 To n - 1

x = x + h

S = S + c * f(x)

c = 6 - c

Next

S = S * h / 3

ListBox1.Items.Add(h)

ListBox2.Items.Add(n)

ListBox3.Items.Add(s1)

ListBox4.Items.Add(S)

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 x1, x2, Eps, h, S As Single

Dim n As Integer

vvod(x1, x2, Eps)

main(x1, x2, h, n, S, Eps) ' Обращение к процедурам

vivod(h, n, S, Eps)

End Sub

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

End

End Sub

End Class

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

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

Детализированная схема алгоритма решения задачи в целом

1. Главная процедура

2. Процедура ввода исходных данных

3. Процедура вывода исходных данных

4. Процедура - функция (подынтегральная функция)

5. Процедура-функция main (вычисление интеграла)

6. Процедура Poldel (решение НУ)

Код программы

Option Explicit On

Option Strict On

Imports System.Math

Public Class Form1

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

End

End Sub

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

Form2.Show()

Form2.Focus()

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 '[a;b] - отрезок неопределенности

Dim Eps As Single ' точность

Dim bpf As Integer ' параметр подынтегральной функции и верхнего предела интегрирования

Dim x1 As Single 'нижний предел интегрирования

Dim n As Integer 'кол-во разбиений отрезка неопределенности

vvod(a, b, x1, Eps, bpf)

Poldel(a, b, Eps, c, n, x1, bpf)

vivod(c, n)

Form2.Show()

Form2.Focus()

End Sub

Sub Poldel(ByVal a As Single, ByVal b As Single, ByVal Eps As Single, ByRef c As Single, ByRef n As Integer, _

ByVal x1 As Single, ByVal bpf As Integer)

Do

c = (a + b) / 2 'Вычисление точки середины отрезка [a;b]

n = n + 1

If (main(Eps, c, x1, bpf) - 0.95) * (main(Eps, b, x1, bpf) - 0.95) < 0 Then

a = c

Else

b = c

End If

Form2.ListBox5.Items.Add(n)

Form2.ListBox6.Items.Add(a)

Form2.ListBox7.Items.Add(b) 'Вывод промежуточных результатов

Form2.ListBox8.Items.Add(main(Eps, a, x1, bpf))

Form2.ListBox9.Items.Add(main(Eps, b, x1, bpf))

Loop Until Abs(b - a) <= Eps 'Выполняется, пока данное условие ложно

End Sub

'Подынтегральная функция

Function f(ByVal x As Single, ByVal a As Single, ByVal b As Integer) As Single

Dim f1 As Single

f1 = CSng(((1 / b) * Exp((x - a) / b)) * (Exp(-Exp((x - a) / b))))

Return f1

End Function

'Процедура-функция, вычисляющая значение интеграла методом Симпсона

Function main(ByVal Eps As Single, ByRef a As Single, ByVal x1 As Single, ByVal bpf As Integer) As Single

Dim S, S1, c, x, x2, h As Single

Dim k, n As Integer

x2 = a + 2 * bpf 'верхний предел интегрирования

n = 2

h = (x2 - x1) / n ' шаг интегрирования

S = (f(x1, a, bpf) + 4 * f(((x1 + x2) / 2), a, bpf) + f(x2, a, bpf)) * h / 3

Do

n = 2 * n

h = (x2 - x1) / n

S1 = S

c = 4

x = x1

S = f(x1, a, bpf) + f(x2, a, bpf)

For k = 0 To n - 1

x = x + h

S = S + c * f(x, a, bpf)

c = 6 - c

Next

S = S * h / 3

Form2.ListBox1.Items.Add(h)

Form2.ListBox2.Items.Add(n)

Form2.ListBox3.Items.Add(S1)

Form2.ListBox4.Items.Add(S)

Loop Until Abs(S - S1) / 15 < Eps

Return S 'Возвращение значения интеграла

End Function

'Процедура ввода данных

Sub vvod(ByRef a As Single, ByRef b As Single, ByRef x1 As Single, ByRef Eps As Single, ByRef bpf As Integer)

a = CSng(TextBox1.Text)

b = CSng(TextBox2.Text)

x1 = CSng(TextBox3.Text)

Eps = CSng(TextBox4.Text)

bpf = CInt(TextBox5.Text)

End Sub

'Процедура вывода данных

Sub vivod(ByVal c As Single, ByVal n As Single)

TextBox6.Text = CStr(c)

TextBox7.Text = CStr(n)

End Sub

End Class

Public Class Form2

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

Form1.Show()

Form1.Focus()

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

Нам нужно, что бы z(a) была как можно ближе к 0.

Отделение корня

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

Основные результаты и выводы по работе

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

2. Выбраны численные методы, требуемые для решения поставленной задачи:

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

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

· Метод двойного просчёта

3. Разработаны и оттестированы процедуры, реализующие численные методы. Результаты тестов показали совпадение полученных результатов с тестовыми данными с заданной точностью.

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

· оптимальное значение параметра a =

· решение нелинейного уравнения происходит за 20 итераций

С помощью следующей формулы можно оценить требуемое число шагов

Сравним результат количества шагов, полученный на ПК с теоретическим количеством итераций, рассчитанным по следующей формуле:

Округляем до n=20. Результаты, полученные с помощью теоретического расчёта, сходятся с результатами, полученными на ПК.

5. Проведена проверка полученных результатов с использованием средств пакета MathCad. Проверка показала, что полученные результаты с заданной степенью точности совпадают с результатами проверки.

Список литературы

1. Кравченко О.М., Семенова Т.И., Шакин В.Н. Модели решения вычислительных задач (Численные методы и оптимизация): Уч. Пособие/ МTУСИ.- М., 2003г.

2. Шакин В.Н, Семенова Т.И., Кравченко О.М. Лабораторный практикум. Информатика. Модели и алгоритмы решения задач численными методами с использованием математических пакетов: МTУСИ.- М., 2009 г.

3. Семенова Т.И., Шакин В.Н. Практикум. Математический пакет Mathcad в дисциплине «ИНФОРМАТИКА» »: МTУСИ.- М., 2006 г.

4. Семенова Т.И. Конспект лекций по дисциплине «Информатика», 2012 г.

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


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

  • Тестирование модуля отыскания корня уравнения методом половинного деления. Схема алгоритма тестирующей программы. Численное интегрирование по методу Симпсона с оценкой погрешности по правилу Рунге. Проверка условий сходимости методов с помощью MathCAD.

    курсовая работа [1,1 M], добавлен 04.02.2011

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

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

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

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

  • Математическое описание, алгоритм и программа вычисления нелинейного уравнения методом дихотомии. Метод половинного деления. Метод поиска корней функции. Написание текста программы с комментариями. Проведение тестовых расчетов. Вывод ответа на экран.

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

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

    дипломная работа [846,0 K], добавлен 22.09.2012

  • Методика реализации решения нелинейного уравнения в виде процедуры-подпрограммы следующими методами: хорд, касательных (Ньютона), простой итерации, половинного деления. Основные методы уточнения корней уравнения. Программное решение задачи, алгоритм.

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

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

    курсовая работа [197,9 K], добавлен 20.01.2009

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

    курсовая работа [97,1 K], добавлен 10.01.2014

  • Аппроксимация линейной, степенной и квадратичной функции. Определение корней уравнения вида f(x)=0 методом половинного деления. Вычисление определенного интеграла методом прямоугольников, трапеций, парабол и Эйлера. Интерполяция формулой Лагранжа.

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

  • Метод хорд решения нелинейных уравнений. Вычисление интеграла методом Симпсона. Процесс численного решения уравнения. Окно программы расчета корней уравнения методом хорд. Алгоритм вычисления интеграла в виде блок-схемы. Выбор алгоритма для вычислений.

    курсовая работа [832,6 K], добавлен 24.07.2012

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