Cанкт-Петербургский Государственный Электротехнический Университет.
КАФЕДРА МОЭВМ
Отчет по курсовой работе
Преподаватель : Титов М.С.
Студент : Виноградо К.Ю.
Санкт-Петербург
Задание на курсовую работу :
Используя программы - функции BISECT , NEWTON , HORDA , ITER, Round из файла metods.cpp найти корень уравнения f(x)=0 с заданной точностью методом бисекции , Ньютона , хорд и итераций соответственно .
Исследуйте обусловленность методов и зависимость числа итераций от точности результата Eps при изменении Eps от 0.1 до 0.000001 .
Порядок выполнения работы :
-
Графически или аналитически отделить корень уравнения (т.е. найти отрезки [Left, Right], на которых функция удовлетворяет условиям применимости методов).
-
Составить подпрограмму- функцию вычисления функции и ее производной (при необходимости), предусмотрев округление их значений с заданной точностью Delta с использованием библиотечной функции Round.
-
Составить головную программу, содержащую ввод исходных данных, обращение к подпрограммам BISECT, NEWTON, HORDA, ITER вывод результатов.
-
Выполнить вычисления по программе. Построить графики зависимости числа итераций, необходимых для достижения заданной точности Eps, от величины Eps, а также достижимой точности результатов от точности Delta задания функции .
-
Теоретически и экспериментально сравнить методы бисекции, Ньютона, хорд и итераций по скорости сходимости и степени обусловленности.
-
Результаты оформить в виде отчета, содержащего постановку задачи, тексты разработанных программ, результаты теоретического и экспериментального анализа в виде таблиц и графиков, выводы.
F(x)=tg(x)-1/x
Теоретическое введение :
В данной работе исследуются четыре метода нахождения корня нелинейного уравнения.
-
Метод Бисекции основан на половинном делении отрезка, на концах которого функция принимает значения разных знаков. Это самый медленный метод из данных, однако он самый точный.
-
Метод Ньютона геометрически эквивалентен замене небольшой дуги кривой y=f(x) касательной, проведенной в некоторой точке кривой. Это один из самых быстрых методов т.к. обладает квадратичной скоростью сходимости. По точности уступает методу Бисекции.
-
Метод Хорд основан на пропорциональном делении отрезка.Это почти самый быстрый метод, однако по точности он уступает методу Бисекции.
-
Метод Простых Итераций основан на замене данной функции другой функцией. Это один из быстрых методов, причем чем меньше параметр q, тем быстрее получается результат.
Содержание работы :
-
Локализуем корни уравнения. В данном уравнении кореней много. Выбераем отрезок, на котором функция, первая и вторая производные монотонны ( см. графики ) , это необходимые условия методов нахождения корня. В данном случае выберем отрезок [0.5;1.2] при корне уравнения » 0.8.
-
Для метода простых итераций вводим новую функцию j(x)=x-a*f(x) Проверяем выполнимость условия монотонности j‘(x) = (cм. график) . По графику видно, что f’(x)>0 на исследуемом отрезке. f’(x): 0<m=f1’(0.5)£f’(x)£f2’(1.2)=M; m=5.29844, M=8.310040, q»0.362432, a=0.120331. Выбираем начальное приближение равное левой границе (0.5).
-
Для метода Ньютона выбираем начальное приближение, отвечающее условию f(x0)*f”( x0)>0, по графикам видно, что правая граница удовлетворяет этому условию, поэтому в качестве начального приближения берем левую границу, равную 0.5 .
-
Исследуем данные методы по скорости сходимости , изменяя Eps от 0.1 до 0.000001 при Delta =0. Данные и результаты приведены в таблице и отображены на графиках.
-
Исследуем данные методы по степени обусловленности , изменяя Delta от 0.1 до 0.000001 при значениях Eps=0.000001 и Eps=0.01. Данные и результаты приведены в таблице и отображены на графиках.
-
Вычисляем обусловленности f(x) == 0,276040 è j(x)==2,29400
Òекст программы :
#include <conio.h>
#include <iostreams.h>
#include "methods.h"
double delta[18]={0,0,0,0,0,0,0,
0.1,0.01,0.001,0.0001,0.00001,0.000001,
0.1,0.01,0.001,0.0001,0.00001,0.000001};
double a=0.120331
int c2;
//----------------------------------
void main()
{
int i,c1;
double left=0.5,
right=1.2,
x;
double eps[18]={0.1,0.01,0.001,0.0001,0.00001,0.000001,
0.000001,0.000001,0.000001,0.000001,0.000001,0.000001,
0.01,0.01,0.01,0.01,0.01,0.01};
cout<<endl;
for (c1=1;c1<5;c1++)
{
for (c2=0;c2<18;c2++)
{
switch (c1)
{
case 1:
cout<<"Метод бисекции.........";
x=BISECT(left,right,eps[c2],i);
cout<<endl<<"Delta="<<delta[c2]<<"\t Eps="<<eps[c2]<<endl;
cout<<"X="<<x<<" число интерации="<<i<<endl;
break;
case 2:
cout<<"Метод Ньютона..........";
x=NEWTON(3.6,eps[c2],i);
cout<<endl<<"Delta="<<delta[c2]<<"\t Eps="<<eps[c2]<<endl;
cout<<"X="<<x<<" число интерации="<<i<<endl;
break;
case 3:
cout<<"Метод Хорд.............";
x=HORDA(left,right,eps[c2],i);
cout<<endl<<"Delta="<<delta[c2]<<"\t Eps="<<eps[c2]<<endl;
cout<<"X="<<x<<" число интерации="<<i<<endl;
break;
case 4:
cout<<"Метод простых итераций.";
x=ITER(3.6,eps[c2],i);
cout<<endl<<"Delta="<<delta[c2]<<"\t Eps="<<eps[c2]<<endl;
cout<<"X="<<x<<" число интерации="<<i<<endl;
break;
}
getch();
}
cout<<endl;
}
getch();
}//main
double F(double x)
{
double f;
f=tan(x)-1/x;
f=Round(f,delta[c2]);
return f;
}
double F1 (double x)
{
double f;
f=tan(x)*tan(x)+1/(x*x)+1;
f=Round(f,delta[c2]);
return f;
}
double func (double x)
{
double f;
f=x-a*(tan(x)+1/x);
f=Round(f,delta[c2]);
return f;
}