close

Вход

Забыли?

вход по аккаунту

?

Отчет Максима Гридина 1лб ЧМ

код для вставкиСкачать
Министерство образования и науки Украины
Харьковский национальный университет радиоэлектроники
Кафедра информатики
Отчёт
по лабораторной работе №1
Выполнил: ст. гр. ИНФ-12-2 Проверила: доц
Гридин М.М. Руденко Д.А.
Харьков - 2013
1 Задание.
Решить уравнение x^3+2x^2-9x-18=0 и уточнить корни уравнения методом итераций и комбинированным методом хорд и касательных.
2 Нахождение промежутков, содержащих корни уравнения.
Находим промежутки, в которых содержатся корни уравнения:
Запишем уравнение в виде f(x)=x^3+2x^2-9x-18. График функции: Находим M=max⁡(|2|,|-9|,|-18|)=18, N=max⁡(|-9|,|2|,|1|)=9. Отсюда A=(18+|1|)/(|1|)=19, B=(|-18|)/(9+|-18|)=2/3 , где A,B - соответственно верхняя и нижняя граница корней уравнения. Следовательно, корни уравнения находятся в пределах [-19; -2/3] и [2/3;19]. Выполняя процедуру отсечения корней, получим промежутки, в которых находится по одному корню: [-3.5;-2.5], [-2.5;-1.5], [2.5;3.5].
3 Алгоритмы уточнения корней.
Метод простых итераций:
Комбинированный метод хорд и касательных:
4 Программная реализация
#include <iostream>
#include <math.h>
#include<cstdio>
using namespace std;
double FUNC(double x)//сама функция
{
return (pow(x,3)+2*pow(x,2)-9*x-18);
}
float FUNC1(double x)//первая производная
{
return (3*x*x+4*x-9);
}
double FUNC2(double x)//вторая производная
{
return (6*x+4);
}
double FI1(double x) // корень -2
{
return((pow(x,3)+2*pow(x,2)-18)/9);
}
double FI1_1(double x)
{
return ((1/3)*pow(x,2)+(4/9)*x);
}
double FI2(double x) // корень 3
{
return(exp((0.333333)*log(9*x+18-2*x*x))); }
double FI2_1(double x)
{
return(-((4*x-9)/(3*exp((0.666666)*log(9*x-2*pow(x,2)+18)))));
}
double FI3(double x) // корень -3
{
return(x-(1/13.75)*FUNC(x));
}
double FI3_1(double x)
{
return (1-(1/13.75)*FUNC1(x));
}
double HORDKAS(double a, double b, double eps)
{
double x, xk, xh;
int it=0;
if(FUNC(b)*FUNC2(b)>0)
{
xk=b;
xh=a;
}
else
{
xk=a;
xh=b;
}
do
{
x=0;
xh=xh-(FUNC(xh)*(xh-xk))/(FUNC(xh)-FUNC(xk));
xk=xk-FUNC(xk)/FUNC1(xk);
x=(xh+xk)/2;
printf("%0*.*f\n", 1, 10, x);
it++;
}
while(fabs(xh-xk)>eps);
cout<<"Корень=";
printf("%0*.*f\n", 1, 10, x);
cout<<"FUNC(x)=";
printf("%0*.*f\n", 1, 10, FUNC(x));
cout<<"Количество итераций="<<it<<endl;
cout<<endl;
return 0;
}
double ITERACIA_1(double a, double eps)
{
float x, x0=a;
x=FI1(x0);
printf("%0*.*f\n", 1, 10, x);
int it=1;
while(fabs(x0-x)>eps)
{
x0=x;
x=FI1(x0);
printf("%0*.*f\n", 1, 10, x);
++it;
}
cout<<"Корень=";
printf("%0*.*f\n", 1, 10, x);
cout<<"FUNC(x)=";
printf("%0*.*f\n", 1, 10, FUNC(x));
cout<<"Количество итераций="<<it<<endl;
cout<<endl;
return 0;
}
double ITERACIA_2(double a, double eps)
{
double x, x0=a;
x=FI2(x0);
printf("%0*.*f\n", 1, 10, x);
int it=1;
while(fabs(x0-x)>eps)
{
x0=x;
x=FI2(x0);
printf("%0*.*f\n", 1, 10, x);
++it;
}
cout<<"Корень=";
printf("%0*.*f\n", 1, 10, x);
cout<<"FUNC(x)=";
printf("%0*.*f\n", 1, 10, FUNC(x));
cout<<"Количество итераций="<<it<<endl;
cout<<endl;
return 0;
}
double ITERACIA_3(double a, double eps)
{
double x, x0=a;
x=FI3(x0);
printf("%0*.*f\n", 1, 10, x);
int it=1;
while(fabs(x0-x)>eps)
{
x0=x;
x=FI3(x0);
printf("%0*.*f\n", 1, 10, x);
++it;
}
cout<<"Корень=";
printf("%0*.*f\n", 1, 10, x);
cout<<"FUNC(x)=";
printf("%0*.*f\n", 1, 10, FUNC(x));
cout<<"Количество итераций="<<it<<endl;
cout<<endl;
return 0;
}
int intervalu(double*korni,int counter,double*Am,double*Bm)
{
double y(0);
for(int i(-19);i<(-2/3);i++)
{
y=i*i*i+2*i*i-9*i-18;
if(y==0)
{
korni[counter]=i;
counter++;
}
}
for(int i(0);i<counter;i++)
{
Am[i]=korni[i]-0.5;
Bm[i]=korni[i]+0.5;
}
for(int i(2/3);i<(19);i++)
{
y=i*i*i+2*i*i-9*i-18;
if(y==0)
{
korni[counter]=i;
counter++;
}
}
for(int i(0);i<counter;i++)
{
Am[i]=korni[i]-0.5;
Bm[i]=korni[i]+0.5;
}
return counter;
}
int main()
{
setlocale(LC_ALL,"rus");
int counter(0);
double korni[10];double Am[10];double Bm[10];
double a,b,epsilon;
cout<<"Введите точность:"<<endl;
cin>>epsilon;
for(int i(0);i<intervalu(korni,counter,Am,Bm);++i)
{
a=Am[i];b=Bm[i];
if(fabs(FI1_1(b))<1&&a==-2.5&&b==-1.5)
{
cout<<"ITERACIA1:"<<endl;
cout<<endl;
ITERACIA_1(b,epsilon);
}
if(fabs(FI2_1(b))<1&&a==2.5&&b==3.5)
{
cout<<"ITERACIA2:"<<endl;
cout<<endl;
ITERACIA_2(b,epsilon);
}
if(fabs(FI3_1(a))<1&&a==-3.5&&b==-2.5)
{
cout<<"ITERACIA3:"<<endl;
cout<<endl;
ITERACIA_3(b,epsilon);
}
cout<<"HORDKAS:"<<endl;
HORDKAS(a,b,epsilon);
}
cout<<"Ещё раз?"<<endl;
char ch;
cin>>ch;
if(ch=='y')
main();
else
return 0;
}
5 Оценка результатов
С помощью разработанной программы уточняем корни уравнения с точностями 0.01, 0.001, 0.0001.
e=0.01 e=0.001
e=0.0001
Построим график зависимости использованного ресурса (количество шагов метода) от заданной точности:
для x=-3:
для x=-2:
для x=3:
Из полученных графиков видно, что при увеличении точности метод простых итераций даёт приближённое значение корня за большее количество шагов, чем комбинированный метод.
Вывод: в данной лабораторной работе мы уточнили корни кубического уравнения с помощью метода итераций и комбинированного метода хорд и касательных; выяснили, что комбинированный метод уточняет корни быстрее метода итераций.
Документ
Категория
Рефераты
Просмотров
15
Размер файла
192 Кб
Теги
гридина, лабораторная работа, 1лб, максима, лаба, отчет, лабораторная
1/--страниц
Пожаловаться на содержимое документа