Автор работы: Пользователь скрыл имя, 18 Января 2014 в 23:54, лабораторная работа
Найбільш точні проміжки, де розташовані корені, було отримано при застосуванні теореми про верхню межу: за її допомогою було розраховано проміжки, де розміщені від’ємні та додатні корені. За допомогою поліномів Штурма, побудованих відповідно до заданого за умовою лабораторної роботи поліному, було обчислено кількість коренів, що містять у визначених раніше проміжках.
НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ
КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ
ФІЗИКО-ТЕХНІЧНИЙ ІНСТИТУТ
Лабораторна робота № 1
з курсу «Числові методи обчислень»
Розв’язання нелінійних рівнянь
Київ-2007
Аналіз вихідного рівняння
Варіант № 3: ,
За теоремою про кільце маємо:
За теоремою про верхню межу маємо:
m=3
верхня межа додатних коренів:
аналогічно, нижня межа додатних коренів:
нижня межа від’ємних коренів:
верхня межа від’ємних коренів:
Отже,
Будуємо послідовність поліномів Штурма:
Таблиця знаків поліномів Штурма:
-2,198 |
-0,4 |
0,586 |
4 | |
+ |
– |
– |
+ | |
– |
– |
– |
+ | |
+ |
+ |
+ |
+ | |
– |
– |
– |
- | |
– |
– |
– |
– | |
КЗЗ |
3 |
2 |
2 |
1 |
Коренів: |
1 |
1 |
Отже, маємо 2 корені, які належать розрахованих проміжкам.
Реалізація уточнення значення коренів наведена нижче.
Код програми
#pragma argsused
float bisMet(float, float, float,int);
float njuMet(float, float,int);
float horMet(float, float, float,int);
float polinom(float);
float ppolinom(float);
int main(int argc, char* argv[])
{
float a1,a2;
float b1,b2;
int i=0,j=0,k=0;
cout<<"Enter a1:\n";
cin>>a1;
cout<<"Enter b1:\n";
cin>>b1;
cout<<"Enter a2:\n";
cin>>a2;
cout<<"Enter b2:\n";
cin>>b2;
cout<<"Metod 1\n";
cout<<"x1="<<bisMet(a1, b1, 0.00001,i)<<endl;
i=0;
cout<<"x2="<<bisMet(a2, b2, 0.00001,i)<<endl;
getch();
cout<<"\nMetod 2\n";
float s1=(a1+b1)/2;
float s2=(a2+b2)/2;
cout<<"x1="<<njuMet(s1, 0.00001,j)<<endl;
j=0;
cout<<"x2="<<njuMet(s2, 0.00001,j)<<endl;
getch();
cout<<"\nMetod 3\n";
cout<<"x1="<<horMet(a1, b1, 0.00001,k)<<endl;
k=0;
cout<<"x2="<<horMet(a2, b2, 0.00001,k)<<endl;
getch();
return 0;
}
//----------------------------
float polinom(float x)
{
return -(pow(x,4))+3*pow(x,3)-2*x+1 ;
}
float ppolinom(float x)
{
return -4*(pow(x,3))+9*pow(x,2)-2 ;
}
float bisMet(float a, float b, float e,int i)
{
float c=(a+b)/2;
cout<<"Iteration "<<i<<": ["<<a<<","<<b<<"]"<<endl;
i++;
if ( fabs(b-a)>=e)
{
if (polinom(a)*polinom(c)<0)
return bisMet(a,c,e,i);
else
return bisMet(c,b,e,i);
}
return c;
}
float njuMet(float xkp, float e,int j)
{
cout<<"Iteration "<<j<<": "<<xkp<<endl;
j++;
float xk=xkp-polinom(xkp)/ppolinom(
if (fabs(xk-xkp)<e && fabs(polinom(xk))<e ) return xk;
else return njuMet(xk,e,j);
}
float horMet(float a, float b , float e, int k)
{
cout<<"Iteration "<<k<<": ["<<a<<","<<b<<"]"<<endl;
k++;
float c=(a*polinom(b)-b*polinom(a))/
if ( fabs(b-a)>=e && fabs(polinom(c)>e) )
{
if (polinom(a)*polinom(c)<0)
return horMet(a,c,e,k);
else
return horMet(c,b,e,k);
}
return c;
}
Результат виконання програми
Вводимо проміжки:
|
Метод бісекції видає наступні результати:
Метод Ньютона дає наступні результати:
За методом хорд отримуємо:
Висно
Висновок
У даній лабораторній роботі вивчалися методи відокремлення та методи уточнення коренів.
Найбільш точні проміжки, де розташовані корені, було отримано при застосуванні теореми про верхню межу: за її допомогою було розраховано проміжки, де розміщені від’ємні та додатні корені. За допомогою поліномів Штурма, побудованих відповідно до заданого за умовою лабораторної роботи поліному, було обчислено кількість коренів, що містять у визначених раніше проміжках.
Для уточнення коренів