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

 

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

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

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

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










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

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



Выполнил: студент гр. БИН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| < e. С точностью любое может быть принято за приближенное значение корня, например его середину отрезка С помощью следующей формулы можно оценить требуемое число шагов , что мы и сделаем в самом конце, сравнив с результатом на ПК.


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

Для решения задачи оптимизации необходимо заранее определить интервал значений, в котором будет находиться параметр 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 OnExplicit OnSystem.MathClass Form1

'Процедура ввода данныхvvod(ByRef a As Single, ByRef b As Single, ByRef Eps As Single)= CSng(TextBox1.Text) 'Левая граница отрезка неопределенности= CSng(TextBox2.Text) 'Правая граница отрезка неопределенности= CSng(TextBox3.Text) ' Заданная точностьSub

'Процедура вывода данныхvivod(ByVal n As Integer, ByVal c As Single).Text = CStr(n) 'Выводим кол-во итераций.Text = CStr(Format(c, "0.000")) 'Выводим значение корня НУ.Text = CStr(Format(f(c), "0.000")) 'Выводим значение функции для этого корняSub

'Функция f(x)f(ByVal x As Single) As Singlef1 As Single= CSng(Sin(x))f1Function

'Процедура решения НУ методом половинного деленияPoldel(ByVal a As Single, ByVal b As Single, ByVal Eps As Single, ByRef n As Integer,ByRef c As Single)= (a + b) / 2 'Вычисление точки середины отрезка [a;b]= n + 1 'Счётчикf(c) * f(b) < 0 Then= c= cIf.Items.Add(n).Items.Add(a).Items.Add(b) 'Вывод промежуточных результатов.Items.Add(f(a)).Items.Add(f(b))Until Abs(b - a) <= Eps Or f(c) = 0SubSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Clicka, b, Eps, c As Singlen As Integer(a, b, Eps)(a, b, Eps, n, c) 'Обращение к процедурам(n, c)Sub

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


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



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


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


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

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



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



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


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


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


Option Strict OnExplicit OnSystem.MathClass Form1

'Процедура ввода данныхvvod(ByRef x1 As Single, ByRef x2 As Single, ByRef Eps As Single)= CSng(TextBox1.Text)= CSng((TextBox2.Text))= CSng((TextBox3.Text))Sub

'Процедура вывода значенийvivod(ByVal h As Single, ByVal n As Integer, ByRef S As Single, ByVal Eps As Single).Text = CStr(h).Text = CStr(n).Text = CStr(S).Text = CStr(Eps)Sub

'Функция ff(ByVal X As Single) As Singlefunc As Single= CSng(X ^ 4)funcFunction

'Процедура решения интеграла методом Симпсонаmain(ByRef x1 As Single, ByRef x2 As Single, ByRef h As Single, ByRef n As Integer, _S As Single, ByVal Eps As Single)s1, c, x As Singlek As Integer= 2 'начальное число участков разбиения интервала интегрирования= (x2 - x1) / n= (f(x1) + 4 * f((x1 + x2) / 2) + f(x2)) * (h / 3)'значение интеграла= 2 * n 'число участков разбиения интервала интегрирования= (x2 - x1) / n 'вычисление шага= S= 4= x1= f(x1) + f(x2)k = 0 To n - 1= x + h= S + c * f(x)= 6 - c= S * h / 3.Items.Add(h).Items.Add(n).Items.Add(s1).Items.Add(S)Until Abs(S - s1) / 15 < Eps 'Итеративный цикл выполняется до тех пор пока это условие ложноSubSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Clickx1, x2, Eps, h, S As Singlen As Integer(x1, x2, Eps)(x1, x2, h, n, S, Eps) ' Обращение к процедурам(h, n, S, Eps)SubSub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.ClickSubClass


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



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


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


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



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



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



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




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




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




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

Explicit OnStrict OnSystem.MathClass Form1Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.ClickSubSub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click.Show().Focus()SubSub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Clicka, b, c As Single '[a;b] - отрезок неопределенностиEps As Single ' точностьbpf As Integer ' параметр подынтегральной функции и верхнего предела интегрированияx1 As Single 'нижний предел интегрированияn As Integer 'кол-во разбиений отрезка неопределенности(a, b, x1, Eps, bpf)(a, b, Eps, c, n, x1, bpf)(c, n).Show().Focus()SubPoldel(ByVal a As Single, ByVal b As Single, ByVal Eps As Single, ByRef c As Single, ByRef n As Integer, _x1 As Single, ByVal bpf As Integer)= (a + b) / 2 'Вычисление точки середины отрезка [a;b]= n + 1(main(Eps, c, x1, bpf) - 0.95) * (main(Eps, b, x1, bpf) - 0.95) < 0 Then= c= cIf.ListBox5.Items.Add(n).ListBox6.Items.Add(a).ListBox7.Items.Add(b) 'Вывод промежуточных результатов.ListBox8.Items.Add(main(Eps, a, x1, bpf)).ListBox9.Items.Add(main(Eps, b, x1, bpf))Until Abs(b - a) <= Eps 'Выполняется, пока данное условие ложноSub

'Подынтегральная функцияf(ByVal x As Single, ByVal a As Single, ByVal b As Integer) As Singlef1 As Single= CSng(((1 / b) * Exp((x - a) / b)) * (Exp(-Exp((x - a) / b))))f1Function

'Процедура-функция, вычисляющая значение интеграла методом Симпсонаmain(ByVal Eps As Single, ByRef a As Single, ByVal x1 As Single, ByVal bpf As Integer) As SingleS, S1, c, x, x2, h As Singlek, n As Integer= a + 2 * bpf 'верхний предел интегрирования= 2= (x2 - x1) / n ' шаг интегрирования= (f(x1, a, bpf) + 4 * f(((x1 + x2) / 2), a, bpf) + f(x2, a, bpf)) * h / 3= 2 * n= (x2 - x1) / n= S= 4= x1= f(x1, a, bpf) + f(x2, a, bpf)k = 0 To n - 1= x + h= S + c * f(x, a, bpf)= 6 - c= S * h / 3.ListBox1.Items.Add(h).ListBox2.Items.Add(n).ListBox3.Items.Add(S1).ListBox4.Items.Add(S)Until Abs(S - S1) / 15 < EpsS 'Возвращение значения интегралаFunction

'Процедура ввода данныхvvod(ByRef a As Single, ByRef b As Single, ByRef x1 As Single, ByRef Eps As Single, ByRef bpf As Integer)= CSng(TextBox1.Text)= CSng(TextBox2.Text)= CSng(TextBox3.Text)= CSng(TextBox4.Text)= CInt(TextBox5.Text)Sub

'Процедура вывода данныхvivod(ByVal c As Single, ByVal n As Single).Text = CStr(c).Text = CStr(n)SubClassClass Form2

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

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



Результаты выполнения программы


Форма с заданием, исходными данными и итоговыми результатами



Форма с промежуточными результатами



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


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



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






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




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


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

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

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

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

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

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

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

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

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

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

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




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

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



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


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

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

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

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


ФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ Государственное образовательное учреждение высшего профессионального образования Московский технический университет связи и

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ