Помощь - Поиск - Пользователи - Календарь
Полная версия: Метод Ньютона
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
nblazhko
Нужно реализовать в дельфи решение кубического уравнения методом Ньютона ,в поиске нашел метод Ньютона,но он находит только 1 корень,подскажите как можно это сделать
Lapp
Цитата(nblazhko @ 1.12.2008 22:57) *
он находит только 1 корень,подскажите как можно это сделать
Метод Ньютона работает при оговорке, что на данном участке корень один. Если корней несколько - он может найти один из них, и то без гарантии.. Про множественные корни Ньютон ничего не говорит, насколько мне помнится.

Если ты заранее знаешь вид уравнения (кубическое), то это можно использовать - типа искать промежутки возрастания/убывания и т.п. Но вообще лучше без изврата решать по формуле Кардана smile.gif
nblazhko
Ну вообще я разобрался вот код если интересно(но все равно спасибо):
#include <iostream.h>
#include <math.h>






//задаем функцию

double f(double x,double a,double b,double c, double d)
  {
  return x*x*x*a+x*x*b+x*c+d;
  }

// ********************************************************************************
************


//задаем производную функции

double df(double x,double a,double b,double c)
  {
  return 3*x*x*a+2*x*b+c;
  }

// ********************************************************************************
************


// алгоритм нахождения корня методом Ньютона

double koren(double x,double a,double b,double c, double d, double Eps,int z)
 {
  z=0;
  while(abs(f(x,a,b,c,d))>Eps)
  {  
    
    x=x-f(x,a,b,c,d)/df(x,a,b,c);
    z++;
    if(z>50) break;
   
  }  
  return x;
 }

// ********************************************************************************
***********

int main()
{
double a,b,c,d,Eps,x,n,k,x1,x2, mas[100];
int j,i,z,o;
cout << "vvedite a,b,c,d\n";
cin>>a>>b>>c>>d;
cout<< "vvedite Eps=";
cin>> Eps;
n=-2*abs((b+c)/a);
k=2*abs((b+c)/a);
o=0;

// заполняем массив **************************************************************************

 for(i=0;i<100;i++)
  {
   mas[i]=n+i*(k-n)/99;
   x=mas[i];
  }

// ищем промежутки с корнями*****************************************************************
  
 for(j=0;j<99;j++)
  {
   x1=mas[j];
   x2=mas[j+1];
   if( f(x1,a,b,c,d)*f(x2,a,b,c,d)<0)
     {
     o++;
     x=(x1+x2)/2;
     cout <<"\n"<<   o <<"koren uravnenia="<<koren(x,a,b,c,d,Eps,z)<<"\n";
     }


  }



return 0;
}

Lapp
Цитата(nblazhko @ 2.12.2008 23:32) *
вот код если интересно

Хм.. И как же это вышло, что вопрос был про Delphi, а код оказался сишным?..
Публикация кодов на других языках в языковых тематических разделах крайне не рекомендуется mad.gif .

Как я и говорил, для поиска промежутков тебе пришлось привлечь посторонний метод, основанный на знании примерного поведения функции..
nblazhko
Да про код я понял уже,исправлюсь=)Извиняюсь...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.