Приложение 3. Скриншоты работы программы




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

Численные методы интегрирования

 

 

Всего листов 18

 

 

Выполнил студ. гр. 14-ПМ,

Рудоискатель А.А.

«_____»______________2016 г.

 

Руководитель

Гайворонский Е.Г.

«_____»______________2016 г.

 

 

Брянск 2016

СОДЕРЖАНИЕ ОТЧЕТА

 

 

ВВЕДЕНИЕ. 4

ОСНОВНАЯ ЧАСТЬ. 5

1. Описание методов Ньютона и секущих. 5

2. Практическая реализация алгоритмов. 6

3. Сравнение эффективности алгоритмов. 8

ЗАКЛЮЧЕНИЕ. 11

СПИСОК ИСТОЧНИКОВ.. 12

ПРИЛОЖЕНИЯ.. 13

 


 

ВВЕДЕНИЕ

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

В данной курсовой работе на языке С++ описаны следующие методы численного решения уравнений: метод Ньютона и метод секущих. C++ — компилируемый, статически типизированный язык программирования общего назначения. C++ широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования.

Программа выполнена в среде Microsoft Visual Studio 2008. Microsoft Visual Studio — линейка продуктов компании Microsoft, включающих интегрированную среду разработки программного обеспечения и ряд других инструментальных средств.

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

В первом пункте основной части рассматриваются общие сведения о методах Ньютона и секущих.

Второй пункт основной части представляет собой описание программной реализации алгоритмов нахождения корня уравнения в рамках индивидуального задания курсовой работы. Описываемый программный код разработан самостоятельно.

Третий пункт основной части представляет собой сравнение эффективности методов Ньютона и секущих. Полученные решения сравниваются с решением в Mathcad.

ОСНОВНАЯ ЧАСТЬ

 

1. Описание методов Ньютона и секущих

Пусть задана функция действительного переменного. Требуется найти корни уравнения .

Метод Ньютона (метод касательных) описывается следующим образом. Пусть и непрерывны и сохраняют определённые знаки при . Найдя какое-нибудь n-ое приближённое значение корня , можем уточнить метод Ньютона следующим образом.

Предположим

где является малой величиной. Отсюда, применяя формулу Тейлора, получим

Следовательно

Таким образом,

Итерации следует продолжать до тех пор, пока не будет достигнута заданная точность, то есть пока не выполнится .

Метод секущих получается из метода касательных заменой разностным приближением:

В результате получим формулу итерационного процесса:

Метод секущих является двухшаговым, то есть новое приближение определяется двумя предыдущими итерациями и В методе необходимо задавать два начальных приближения и

 

2. Практическая реализация алгоритмов

Рассмотрим реализацию описанных выше алгоритмов на языке С++.

Написано две программы. Первая реализует метод Ньютона, а вторая метод секущих.

Реализация метода Ньютона, представлена в Листинге1.

int main(int argc, char* argv[])

{

 

setlocale(LC_ALL, "Russian_Russia.1251");

double e,x0,x1; // объявляем переменные

 

// ввод значений

cout << "Введите начальное приближение корня x0= ";

cin >> x1;

cout << endl << "Введите точность нахождения корня e= ";

cin >> e;

 

// цикл, реализующий алгоритм

do

{

x0=x1;

x1=x0-f(x0)/pf(x0);

}

while (fabs(x0-x1)>e);

 

// вывод результата

cout << "x=" << x1 << endl;

 

 

system("pause");

return 1;

}

Листинг 1. Метод Ньютона

 

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

Вычисление значения функции в точке и значения производной функции в точке представлено в Листинге 2 и Листинге 3.

 

double f(double x) // возвращает значение f(x)

{

double s= pow(x,5)-10.5*pow(x,4)-6*pow(x,3)+233*pow(x,2)-555*x+375.5;

return s;

 

}

 

Листинг 2. Вычисление значения производной функции

 

double pf(double x) // возвращает значение производной

{

double s=5*pow(x,4)-42*pow(x,3)-18*pow(x,2)+466*x-555;

return s;

}

Листинг 3. Вычисление значения функции

 

Реализация метода секущих представлена в Листинге 4.

 

int main(int argc, char* argv[])

{

 

setlocale(LC_ALL, "Russian_Russia.1251");

double e,x0,x1, x2; // объявляем переменные

 

// ввод значений

cout << "Введите начальное приближение корня x0= ";

cin >> x1;

cout<< endl << "Введите начальное приближение корня x1= ";

cin >> x2;

cout << endl << "Введите точность нахождения корня e= ";

cin >> e;

 

// цикл, реализующий алгоритм

do

{

x0=x1;

x1=x2;

 

x2=x1-(x1-x0)*f(x1)/(f(x1)-f(x0));

}

while (fabs(x2-x1)>e);

 

// вывод результата

cout << "x=" << x2 << endl;

 

 

system("pause");

return 1;

}

Листинг 4. Метод секущих

 

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

Полный код программ представлен в Приложении 1 и Приложении 2.

 

3. Сравнение эффективности алгоритмов

В соответствии с индивидуальным заданием необходимо решить уравнение . Необходимо найти его точное решение в Mathcad.

На Рисунках 1-3 представлен поиск приближенных корней уравнения. Первоначально выбирался диапазон [-2000,2000], затем рассматривались отрезки, которые могли содержать корень, то есть те отрезки, на которых график функции приближался к прямой .

Рисунок 1. Поиск приближенных корней уравнения

Рисунок 2. Поиск приближенных корней уравнения

 

 

Рисунок 3. Поиск приближенных корней уравнения

 

 

Из графиков видно, что уравнение имеет единственный корень, приближенно равный 11. Точное решение уравнения представлено на Рисунке 4.

 

Рисунок 4. Вычисление точного корня уравнения.

 

Далее произведена проверка работы написанных программ. Вычислены корни уравнения с точностью 0.1, 0.01 и 0.001. Результаты представлены в Таблице 1.

точность 0.1 0.01 0.001
Метод Ньютона 8.99126 9.00046  
Метод секущих 9.00272 9.00005  
Точное решение 11.41013 11.41013 11.41013

 

Таблица 1. Результаты работы программы

 

На Рисунке 5 результаты представлены графически

Рисунок 5. Результаты работы программы


 

ЗАКЛЮЧЕНИЕ

 

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

Произведено сравнение эффективности алгоритмов при решении уравнения. Результаты, полученные в программе сравнены с результатами вычислений в MathCad.

В обеих программах результаты работы примерно одинаковы, но есть расхождения с Mathcad.

 


СПИСОК ИСТОЧНИКОВ

1. Яковлев, А.В. Основы программирования на С++ [Текст] +[Электронный ребус]: учебное пособие / А. В. Яковлев, - Брянск: БГТУ, 2012.-266 с.

2. Златопольский, Д.М. Сборник задач по программированию/
Д.М. Златопольский,- СПб.: 2011. — 304с.

3. Керниrан, Брайан У., Пайк, Роб. КЗ6 Практика программирования.: Пер. с англ. -М.: ООО "И.Д. Вильяме", - 288 с.: нл. - Парал. тпт. англ.

4. Керниган Б., Ритчи Д. К36 Язык программирования Си.\Пер. с англ., 3-е изд., испр. - СПб.: "Невский Диалект", 2001. - 352 с.: ил.

5. Самарский. Введение в численные методы- АЙРИС ПРЕСС, 2006 - 608 с.

6. Шелест, В.Д. Программирование/ В.Д. Шлест, - БХВ-Петербург, 2002. - 592, ил.

 

 


 

ПРИЛОЖЕНИЯ

 

Приложение1. Листинг программы, реализующей метод Ньютона

#include "stdafx.h"

#include<stdio.h>

#include<conio.h>

#include<math.h>

#include <iostream>

 

using namespace std;

 

double f(double x) // возвращает значение f(x)

{

double s= pow(x,5)-10.5*pow(x,4)-6*pow(x,3)+233*pow(x,2)-555*x+337.5;

return s;

 

}

double pf(double x) // возвращает значение производной

{

double s=5*pow(x,4)-42*pow(x,3)-18*pow(x,2)+466*x-555;

return s;

}

 

 

int main(int argc, char* argv[])

{

 

setlocale(LC_ALL, "Russian_Russia.1251");

double e,x0,x1; // объявляем переменные

 

// ввод значений

cout << "Введите начальное приближение корня x0= ";

cin >> x1;

cout << endl << "Введите точность нахождения корня e= ";

cin >> e;

 

// цикл, реализующий алгоритм

do

{

x0=x1;

x1=x0-f(x0)/pf(x0);

}

while (fabs(x0-x1)>e);

 

// вывод результата

cout << "x=" << x1 << endl;

 

 

system("pause");

return 1;

}


Приложение2. Листинг программы, реализующей секущих

#include "stdafx.h"

#include<stdio.h>

#include<conio.h>

#include<math.h>

#include <iostream>

 

using namespace std;

 

double f(double x) // возвращает значение f(x)

{

double s= pow(x,5)-10.5*pow(x,4)-6*pow(x,3)+233*pow(x,2)-555*x+337.5;

return s;

 

}

 

 

int main(int argc, char* argv[])

{

 

setlocale(LC_ALL, "Russian_Russia.1251");

double e,x0,x1, x2; // объявляем переменные

 

// ввод значений

cout << "Введите начальное приближение корня x0= ";

cin >> x1;

cout<< endl << "Введите начальное приближение корня x1= ";

cin >> x2;

cout << endl << "Введите точность нахождения корня e= ";

cin >> e;

 

// цикл, реализующий алгоритм

do

{

x0=x1;

x1=x2;

 

x2=x1-(x1-x0)*f(x1)/(f(x1)-f(x0));

}

while (fabs(x2-x1)>e);

 

// вывод результата

cout << "x=" << x2 << endl;

 

 

system("pause");

return 1;

}

Приложение 3. Скриншоты работы программы

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-08-20 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: