Помощ - Търси - Регистрирани - Календар
Пълна версия: Въвеждане на данните от клавиатурата в този код
UniBG Forums > Дискусии > Dexter's Lab > Програмиране
iLove
Здравейте!x^
Задачата е следната: използвайки метода на разполовяването да се намери 1 реален корен на : f(x)=x^3-x^5+4x^2-3

Ето и кода който написах с доста помощ:

CODE
#include <iostream>
using namespace std;
#include <math.h>

double F(double x)
{        double res = pow(x, 9) - pow(x, 7) + 2 * pow(x, 2) -1;
       return res;
}
void print_roots(){
      
        double low, high;
        cout<<"low=";
        cin>>low;
        cout<<"high=";
        cin>>high;

        for(int i = 0; i < 1000; ++i){
                double mid = (float)(low + high)/2;
                double val = F(mid);

                cout << mid << ":" << val << endl;

                if(val < 0.00001 && val > -0.00001){
                        cout << "Root is " << mid << endl;
                        return;
                }
                else if (val < 0 )
                        low = mid;
                else
                        high = mid;
        }
}

int main(int argc, char **argv){
        print_roots();
        system("pause");
        return 0;
}


Проблема е че всико тук трябва да се въвежда от клавиатурата ( инедкса пред х,степента на х, + или - , и свободния член).
Начинаещ съм да не кажа и че почти нищо не разбирам ... моля ви помогнете.
Ако може и да прегледате този код и ако има грешки или ако може да се изчисти да го направите ще съм ви изключително благодарен.
int21h
QUOTE(iLove @ Apr 5 2008, 02:12 PM) *
Здравейте!x^
Задачата е следната: използвайки метода на разполовяването да се намери 1 реален корен на : f(x)=x^3-x^5+4x^2-3

Ето и кода който написах с доста помощ:

CODE
...


Проблема е че всико тук трябва да се въвежда от клавиатурата ( инедкса пред х,степента на х, + или - , и свободния член).
Начинаещ съм да не кажа и че почти нищо не разбирам ... моля ви помогнете.
Ако може и да прегледате този код и ако има грешки или ако може да се изчисти да го направите ще съм ви изключително благодарен.


f(x)=x^3-x^5+4x^2-3 е просто функция, в която не виждам Х под корен или Х като делител, има единствено Х на някаква степен, което по никакъв начин не ограничава Х.. А и като гледам кода, вероятно имаш предвид f(x)=0, x = ?

Ще е добре да уточниш дали това имаш предвид преди някой да започне да пише каквото и да е по твоята програма.
iLove
да, прав си... търся каква е стойността на 'х' ако f(x)=0
но да се използва метода на разполовяването.
offgeboren
az bih polzval argc i argv, vse pak tezi parametri ne sa za ukrasa na vsyaka programa pisana na C/C++
int21h
Мисля, че не си разбрал правилно метода на разполовяването..

QUOTE
Метод на разполовяването. Това е един малко бавен, но абсолютно надежден алгоритъм. Ако f(x) се пресмята достатъчно бързо той е и най-добрият избор. Методът се основава отново на предположението, че има област (a,b), където f(a)f(b)<0. Нека х1 е средата на (a,b). Ако f(a)f(x1)<0 делим интервала (а,х1) и означаваме с х2 средата му, в противен случай с х2 бележим средата на (х1,b). Продължаваме този алгоритъм докато получим област (xn,xn+1), така че |xn-xn+1|<e. Със сигурност можем да твърдим, че в посочения интервал има поне един корен.

Лесно можем да изчислим, колко итерации са необходими за постигане на дадена точност. Нека например първоначалния интервал е 1, а търсената точност е 10^-16 (машинният епсилон за числа с двойна точност в Паскал и Фортран). При всяка итерация интервала се разполовява, така след n итерации той ще е 1/2n. оттук получаваме:

или (5)

Уравнение (5) показва, че са необходими приблизително 53 итерации за постигане на нужната точност. При всяка итерация функцията се изчислява само веднъж, така че са необходими всичко 53 изчисления на функцията. При съвременните възможности на изчислителните машини това не би трябвало да представлява трудност дори за тези със скромни възможности.

Методът на разполовяването има един съществен недостатък: той е неприложим ако коефициентите на нелинейното уравнение са комплексни, а също и за система уравнения.

Източник

А, ето ти и програмата..
CODE
using namespace std;
#include <iostream>
#include <math.h>

long double IntervalHigh = 0,
            IntervalLow = 0,
            Sensitivity = 0.000001;

int PositionInEquation = 0;

char Equation[ 129 ],
     Element[ 129 ];

void PrintHeader();
void GetInterval();
void GetEquation();
void GetSensitivity();
void GetRoot();
char GetElement();
long double F( long double x);
long double CalculateElement( long double x );


void main()
{
    PrintHeader();
    GetEquation();
    GetInterval();
    GetSensitivity();
    system("pause");
    GetRoot();
    system("pause");
}

void PrintHeader()
{
    printf( "\n\nTazi programa namira koren na f(x)=0 po metoda na razpolovqvaneto\n"
            "Avtor: Ime Prezime Famiq\n\n" );
}

void GetEquation()
{
    Equation[ 0 ] = 0;
    while( strlen( Equation ) < 2 )
    {
        printf( "\nVyvedete funkciqta f(x)=" );
        gets( Equation );
        if( strlen( Equation ) < 2 )
            printf( "\n\7Uravnenieto trqbva da byde pone 2 simvola!\n\n" );
    }
}

void GetInterval()
{
    char TempString[ 129 ],
         Done = 0;
    while( !Done )
    {
        Done = 1;
        TempString[ 0 ] = 0;
        while( !strlen( TempString ) )
        {
            printf( "\nVyvedete dolnata granica na intervala za tyrsene: " );
            gets( TempString );
        }
        IntervalLow = atof( TempString );
        TempString[ 0 ] = 0;
        while( !strlen( TempString ) )
        {
            printf( "Vyvedete gornata granica na intervala za tyrsene: " );
            gets( TempString );
        }
        IntervalHigh = atof( TempString );
        if( IntervalLow == IntervalHigh )
        {
            Done = 0;
            printf( "\n\7Gornata i dolnata granica na intervala syvpadat. Molq, vyvedete novi granici.\n" );
        }
        if( IntervalLow > IntervalHigh )
        {
            Done = 0;
            printf( "\n\7Dolnata granica na intervala e po-golqma ot gornata. Molq, vyvedete novi granici.\n" );
        }
    }

}    

void GetSensitivity()
{
    char TempString[ 129 ];
    printf( "\nShte byde izpolzvana standartna tochnost %1.16f\n"
            "Vyvedete tochnost, koqto iskate da se izpolva\n"
            "ili natisnete ENTER za zapazvane na standartnata: ", Sensitivity );
    gets( TempString );
    if( ( atof( TempString ) ) &&
        ( atof( TempString ) > 0 ) )
        Sensitivity = atof( TempString );
    printf( "\nIzpolzvana tochnost: %1.16f\n\n", Sensitivity );
}

void GetRoot()
{      
    long double low = IntervalLow,
                 high = IntervalHigh,
                 middle, value;
      
    while( 1 )
    {
        middle = low + ( high - low ) / 2;
        value = F(middle);
        printf( "Interval: %2.16f : %2.16f\n", low, high );

        if( fabs( value ) < Sensitivity )
        {
            printf( "\nKorenyt e: %2.16f\n", middle );
            break;
        }

        if( high == low )
        {
            printf( "\nNqma koren v posocheniq interval!\7\n" );
            break;
        }

        if( F(low)*F(middle) < 0 )
            high = middle;
        else
            low = middle;
    }
}

long double F(long double x)
{        
    long double ReturnValue = 0;
    PositionInEquation = 0;
    while( GetElement() )
        ReturnValue += CalculateElement( x );
    return ReturnValue;
}

long double CalculateElement( long double x )
{
    long double Temp = 0,
                ReturnValue = 0;
    int Loop = 1, Exponent = 0;
    if( ( Element[ 1 ] >= '0' ) && ( Element[ 1 ] <= '9' ) )
    {
        for(; Loop < strlen( Element ); Loop++ )
        {
            if( ( Element[ Loop ] < '0' ) || ( Element[ Loop ] > '9' ) )
                break;
            if( !Temp )
                Temp = Element[ Loop ] - 48;
            else
                Temp = Temp * 10 + Element[ Loop ] - 48;
        }
    }

    if( ( Element[ Loop ] == 'x' ) || ( Element[ Loop ] == 'X' ) )
    {
        if ( Element[ Loop + 1 ] == '^' )
        {
            for( Loop += 2; Loop < strlen( Element ); Loop++ )
            {
                if( ( Element[ Loop ] < '0' ) || ( Element[ Loop ] > '9' ) )
                    break;
                if( !Exponent )
                    Exponent = Element[ Loop ] - 48;
                else
                    Exponent = Exponent * 10 + Element[ Loop ] - 48;
            }
        }
        else
            Exponent = 1;
    }

    if( Temp )
        ReturnValue = Temp;
    else
        ReturnValue = 1;

    if( Exponent )
        ReturnValue *= pow( x, Exponent );

    if( Element[ 0 ] == '-' )
        ReturnValue = -ReturnValue;

    return ReturnValue;
}

char GetElement()
{
    char ReturnValue = 0,
         TempString[ 2 ] = { 0, 0 };
    Element[ 0 ] = 0;

    if( !PositionInEquation )
    {
        if( Equation[ 0 ] == '-' )
        {
            strcat( Element, "-" );
            PositionInEquation++;
        }
        else
        {
            strcat( Element, "+" );
            if( Equation[ 0 ] == '+' )
                PositionInEquation++;
        }
    }
    else
    {
        if( ( Equation[ PositionInEquation ] == '+' ) ||
            ( Equation[ PositionInEquation ] == '-' ) )
        {
            TempString[ 0 ] = Equation[ PositionInEquation ];
            strcat( Element, TempString );
            PositionInEquation++;
        }
    }
    for(; PositionInEquation < strlen( Equation ); PositionInEquation++ )
    {
        if( ( Equation[ PositionInEquation ] == '+' ) || ( Equation[ PositionInEquation ] == '-' ) )
            break;
        TempString[ 0 ] = Equation[ PositionInEquation ];
        strcat( Element, TempString );
        ReturnValue = 1;
    }
    return ReturnValue;
}
iLove
WOW. Като сравня моята и твоята blink.gif Явно не съм бил дори и близо до това което трябва.
Само има едно проблемче ... дава ми грешка и неще да я компилира.Дава ми грешка тук :



CODE
void PrintHeader();
void GetInterval();
void GetEquation();
void GetSensitivity();
void GetRoot();
char GetElement();
long double F( long double x);
long double CalculateElement( long double x );


void main()
{                                                   //тук дава грешка 'main' must return 'int'
    PrintHeader();
    GetEquation();
    GetInterval();
    GetSensitivity();
    system("pause");
    GetRoot();
    system("pause");


Компилатора ми е Dev-C++ 4.9.9.2.
Ако има по-добър ако може да ми кажеш.
БЛАГОДАРЯ ТИ МНОГО ! smile.gif
iLove
Грешката мисля че я оправих просто вместо void main () е трябвало да е int main () . само че имам друг проблем.стартирам я и виж какво става Натисни да отвориш файла

задачата ми е f(x)=x^9-x^7+2x^2-1 за x e [0;1]
int21h
QUOTE(iLove @ Apr 6 2008, 03:59 PM) *
Грешката мисля че я оправих просто вместо void main () е трябвало да е int main () . само че имам друг проблем.стартирам я и виж какво става Натисни да отвориш файла

задачата ми е f(x)=x^9-x^7+2x^2-1 за x e [0;1]


Ам, въведи си нормално функцията..
x^9-x^7+2x^2-1

Защо вместо X^9 пишеш x*x*x*x*x*x*x*x*x ?

Натисни да отвориш файла
iLove
да де явно грешката идва от тва че при теб точноста е 0.000001000000 а при мен -0.0000000000000
как да го оправя
виж как е в кода
Sensitivity = 0.000001;
int21h
Мдам, за DevC++, просто навсякъде в програмата замени "long double" с "double"..

Натисни да отвориш файла

Натисни да отвориш файла
iLove
Вече всичко е наред.ТРЪГНААА !!! yess.gif dance2.gif Мерси много int21h ти си човека bravo.gif bravo.gif bravo.gif
zeraful
Чудесно и от мен мерси, Марто. ;>
offgeboren
oturvahme li dvojkata ? smile.gif
Това е семпла версия на форума. За да видиш пълната версия, която има повече информация, по-добра подредба и снимки, натисни тук.
Invision Power Board © 2001-2008 Invision Power Services, Inc.