Решение нелинейных уравнений

Автор работы: Пользователь скрыл имя, 18 Января 2014 в 23:54, лабораторная работа

Краткое описание

Найбільш точні проміжки, де розташовані корені, було отримано при застосуванні теореми про верхню межу: за її допомогою було розраховано проміжки, де розміщені від’ємні та додатні корені. За допомогою поліномів Штурма, побудованих відповідно до заданого за умовою лабораторної роботи поліному, було обчислено кількість коренів, що містять у визначених раніше проміжках.

Прикрепленные файлы: 1 файл

Лаба1.doc

— 98.50 Кб (Скачать документ)

 

 

 

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ  УНІВЕРСИТЕТ УКРАЇНИ

КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ  ІНСТИТУТ

ФІЗИКО-ТЕХНІЧНИЙ ІНСТИТУТ

 

 

 

 

 

 

 

 

 

 

 

 

 

Лабораторна робота № 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(xkp);

  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))/(polinom(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;

  }

 

 

 

Результат виконання програми

 

Вводимо проміжки:


 

Метод бісекції видає  наступні результати:

 

 

Метод Ньютона дає  наступні результати:

 

 

 

 

 

За методом хорд отримуємо:

 


Висно


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Висновок

 

У даній лабораторній роботі вивчалися методи відокремлення та методи уточнення коренів.

Найбільш точні проміжки, де розташовані  корені, було отримано при застосуванні теореми про верхню межу: за її допомогою було розраховано проміжки, де розміщені від’ємні та додатні корені. За допомогою поліномів Штурма, побудованих відповідно до заданого за умовою лабораторної роботи поліному, було обчислено кількість коренів, що містять у визначених раніше проміжках.

Для уточнення коренів застосовувалися  три методи: метод бісекції, метод  хорд та метод дотичних (метод Ньютона). Найбільш швидким виявився метод дотичних, а методом з найбільшою кількістю ітерацій став метод хорд (функція виявилася незручною для даного методу, адже ітерацій було більше, ніж навіть при застосуванні методу бісекції).


Информация о работе Решение нелинейных уравнений