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


Автор: Tinysik 25.5.2008, 19:34
подскажите кто знает. smile 
необходимо решить пример x^3+2x^2+3x+5=0 задав точность e=0,001
 
вот код программы:


#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';
    
}




программа все считает,но в коде нужно  прописать эту точность е=0,001.   как это сделать?





Автор: bronislav 25.5.2008, 21:01
Тебе надо считать разницу между предидушим решением и текущим и когда она будет меньше заданной точности (в товем случае 0.001) - решение найдено.

Автор: maxim1000 25.5.2008, 21:26
Цитата(bronislav @  25.5.2008,  21:01 Найти цитируемый пост)
Тебе надо считать разницу между предидушим решением и текущим

совсем необязательно последовательность может и медленно сходиться

для начала нужно определиться, какая точность имеется в виду
1. точность равенства функции нулю - тогда просто сравниваем модуль значения полинома с точностью
2. точность решения: тут нужно попробовать оценить расстояние до настоящего решения
во втором слуаче нужно детальнее изучать функцию

Автор: Tinysik 25.5.2008, 21:52
эййй..ну вы чего? все не так сложно.

просто код расчитан был как тестовый.

я подставила туда пример.   теперь только необходимо,чтобы он считался с заданной точностью

Автор: bronislav 26.5.2008, 06:03
Цитата(Tinysik @  25.5.2008,  20:52 Найти цитируемый пост)
просто код расчитан был как тестовый.

Ну теперь напиши другой код

Если сегодня будет время напишу.

Автор: Ziggyrat 11.4.2009, 18:58
Код

//Mh Dihotomii
#include "stdafx.h"
#include <math.h>
#include "iostream"
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
   

     double  a=-5,b=5,d=0,E,Za=0,u,Zd=0;
    cout<<"================================================================================\n"<<'\n';
     cout<<"f(x)=x^3+2x^2+3x+5"<<'\n'<<'\n';
     cout<<"Vozmсm tochnostм  ravny E=";
     cin>>E;
        cout<<'\n'<<'\n';
    
          
     do
     {
             d=(a+b)/2;
          
             Zd=(d*d*d+2*d*d+3*d+5);
            

             Za=(a*a*a+2*a*a+3*a+5);
            

             if(Zd*Za>0) 
             {
                 a=d;
             }
          
             else 
             {
                 b=d;
             }
          
             
     }
     while(  (d*d*d+2*d*d+3*d+5)>E || ( (b-a)>E ) );  
          
     cout<<"Korenм yravnenue x="<<d<<'\n'<<'\n'<<'\n'<<'\n';
     
     cout<<"================================================================================\n"<<'\n';
     cin>>u;
}
   


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