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

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,96 Мб
  • Опубликовано:
    2013-05-21
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

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

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

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

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








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

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

Выполнил: студент гр. БИН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 г.

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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!