Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Метод Ньютона

Автор: nblazhko 2.12.2008 2:57

Нужно реализовать в дельфи решение кубического уравнения методом Ньютона ,в поиске нашел метод Ньютона,но он находит только 1 корень,подскажите как можно это сделать

Автор: Lapp 2.12.2008 19:57

Цитата(nblazhko @ 1.12.2008 22:57) *
он находит только 1 корень,подскажите как можно это сделать
Метод Ньютона работает при оговорке, что на данном участке корень один. Если корней несколько - он может найти один из них, и то без гарантии.. Про множественные корни Ньютон ничего не говорит, насколько мне помнится.

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

Автор: nblazhko 3.12.2008 3:32

Ну вообще я разобрался вот код если интересно(но все равно спасибо):

#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 3.12.2008 5:10

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

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

Как я и говорил, для поиска промежутков тебе пришлось привлечь посторонний метод, основанный на знании примерного поведения функции..

Автор: nblazhko 3.12.2008 14:44

Да про код я понял уже,исправлюсь=)Извиняюсь...