Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C] Метод половинного деления


Автор: Ornik 25.5.2011, 23:08
Здравствуйте. Возникла проблема при решении следующей задачи:
Методом половинного деления определить экстремум функции y = x^4 + e^(-x) в интервале изменения аргумента [-10; 10] с точностью до 4 знаков после десятичной точки.

Вот мой код:
Код

#include <stdio.h>
#include <conio.h>
#include <math.h>

const double epsilon = 1e-4;
 
double f(double x)
{
    return (pow(x,4) - exp(-x));
}

double g(double x)
{
    return (x > 0 ? x : -x);
}
 
 
int main (void)
{
    double a, b, c;
    a = -10;
    b = 10;
    while (g(b-a) > epsilon) {
        c = (a + b) / 2;        
        if (f(b) * f(c) <= 0)
            a = c;
        else
            b = c;
    }

    printf("\n x=%4.4f", (a+b)/2);
    printf("\n\n Press any key to exit: ");
    _getch();
    return 0;
}


Но меня смущает полученное значение,  x=0,8155, думается, что должно быть около 0,5. 

Автор: borisbn 26.5.2011, 06:12
>y = x^4 + e^(-x)
>  return (pow(x,4) - exp(-x));
IMHO должно быть ясно smile

Автор: Ornik 26.5.2011, 11:36
Исправил код, может кому понадобится.
Код

#include <math.h>
#include <stdio.h>
#include <conio.h>

const double epsilon = 1e-4;
 
double f(double x)
{
 
    return pow(x,4) + exp(-x);
}
 
int isrising (double x)
{
        return (f(x)>f(x-epsilon/10000))?1:-1;
}
 
int main()
{
    double left, right, c;
    left = -10;
    right = 10;
    while ((right-left) > epsilon){
        c = (left + right) / 2;
        if(isrising(c) != isrising(right))
            left = c;
        else
            right = c;
    }

    
    //printf("y=%4.4f",f((left+right)/2));+
    printf("\n\t Bisection method \n ");
    printf("\n\t x=%4.4f",(left+right)/2);
    printf("\n\n Press any key to exit: ");
    _getch();
    return 0;
}

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