Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Решение нелинейного уравнения методом Ньютона


Автор: Tinysik 4.6.2008, 18:42
Необходимо решить уравнение 

x^3+2x^2+3x+5=0

взяв в качестве начального приближения x0=-2 и задав точность е=0.000001

я уже обращалась по этому вопросу. Только написала программу на Pascale. Преподавателю программа не понравилась. Поэтому возвращаюсь к коду на С++.


Программа работает,но с ошибкой. Ответ должен быть  x=-1.843734
Программа выдает -1

Подскажи пожалуйста--- как сделать так,чтобы ответ был с нужной точностью и что обозначает n (где n=5)

Код

#include <iostream.h>
#include <math.h>
double Nuton(double*p,int n,double*x,double X)
{
    double s=p[n-1];
    for(int i=n-2;i>=0;i--) s=p[i]+(X-x[i])*s;
    return s;
}
void Nuton1(double*x,double*y,int n,double*p)
{
    for(int j=0;j<n-1;j++) {
        p[j]=(y[j+1]-y[j])/(x[j+1]-x[j]);
//        cout<<p[j]<<"\t";
    }
//    cout<<"\n";
    int m=n-1;
    int l=2;
    int k;
    for(int i=n-2;i>=1;i--)
    {
        k=0;
        for(j=1;j<=i;j++) 
        {
            p[m]=(p[m-i]-p[m-i-1])/(x[k+l]-x[k]);
//          cout<<p[m]<<"\t";
            m++;
            k++;
        }
//        cout<<"\n";
    l++;
    }
    j=0;
    for(i=1;i<n;i++)
    {
        y[i]=p[j];
        j=j+(n-i);
    }

}
void main()
{
    int const n=5,N=(n-1)*n/2;
    double x[]={1,2,3,4};
    double y[n];
    for(int i=0; i<n; i++) y[i]=pow(x[i],3)+2*pow(x[i],2)+3*x[i]+5;
    double *p=new double[N];
    Nuton1(x,y,n,p);
    //for (i=0;i<n;i++) cout<<y[i]<<'\t';
    double z=-2;
    cout<<Nuton(y,n,x,z)<<'\t'<<pow(z,3)+2*pow(z,2)+3*z+5<<'\n';
    
}


M
JackYF
О кнопке "Код" не забываем.


Автор: bronislav 4.6.2008, 19:29
Вопервых воспользуйся кнопкой КОД, для оформлени кода

Цитата(Tinysik @  4.6.2008,  17:42 Найти цитируемый пост)
что обозначает n (где n=5)


А программу разве не ты писала, что не знаешь что n обозначает?

Автор: Tinysik 4.6.2008, 19:41
bronislav,    код писала я,но это было на занятиях, задачу делали тестовую. Поэтому забыла что n обозначает 

Автор: bronislav 4.6.2008, 19:57
Писал на первом курсе. Вроде работает.

Код

#include <iostream>
#include <cmath>

double nuton( double x0, double eps, double (*f)(double), double (*df)(double), int max_count );

double f1( double x )
{
    return x*x*x + 2*x*x + 3*x + 5;
}

double df1( double x )
{
    return 3*x*x + 4*x + 3;
}

int main( int argc, char* argv[] )
{
    double eps;
    int max_count;
    std::cin >> eps >> max_count;
    std::cout << nuton( -2.0, eps, f1, df1, max_count ) << std::endl;
    return 0;
}

double nuton( double x0, double eps, double (*f)(double), double (*df)(double), int max_count )
{
    double x = x0;
    double x1;
    int count = 0;
    do
    {
        if( count >= max_count ) break;
        x1 = x - f(x) / df(x);
        ++count;
    }
    while( fabs(x1 - x) > eps );
    std::cout << "iter: " << count << std::endl;
    return x1;
}



Добавлено через 3 минуты и 8 секунд
Цитата(Tinysik @  4.6.2008,  18:41 Найти цитируемый пост)
Поэтому забыла что n обозначает 


Может количество корней?

Автор: Tinysik 4.6.2008, 20:29
bronislav,  большое вам спасибо. 

Автор: bronislav 4.6.2008, 22:12
Цитата(Tinysik @  4.6.2008,  19:29 Найти цитируемый пост)
bronislav,  большое вам спасибо.  


Правильно работает?
Я там одну недоработку нашел.
Задачка из серии: "а вы найдете?"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)