Решение нелинейного уравнения и вычисление интеграла с помощью численных методов
ФЕДЕРАЛЬНОЕ
АГЕНТСТВО СВЯЗИ
Государственное
образовательное учреждение высшего
профессионального
образования
Московский
технический университет связи и информатики
КУРСОВАЯ
РАБОТА
по
информатике
Выполнил:
студент гр. БИН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 г.