Метод деления пополам для более чем одного решения уравнения f (x) = 0

#c #numerical-methods

#c #численные методы

Вопрос:

Я написал код для решения f (x) = 0 методом деления пополам. Здесь я взял f (x) = sin (x) — x * cos (x). Уравнение в интервале от -10 до 10 имеет несколько решений, но, используя мой код, я получаю только одно решение, после чего программа попадает в бесконечный цикл.

Мой код :

 #include <stdlib.h>
#include <math.h>
double f(double x)
{
    return sin(x) - (x * cos(x)); // Dont forget to set the function f(x).
}
int main()
{
    double a, b, c, l, u, x0, x;

    printf("Set the value of lower and upper limit:n");
    scanf("%lf", amp;a);
    scanf("%lf", amp;b);
    if ((f(a) >= 0) amp;amp; (f(b) < 0))
    {
        c = a;
        a = b;
        b = c;
    }
    else if ((f(a) < 0) amp;amp; (f(b) > 0))
    {
    }
    else if (f(b) == 0)
    {
        printf("The Root = %lf", b);
    }
    for (x = a; x < b; x  = 0.1)
    {
        //setting lower and upper limits
        l = x;
        u = x   0.1;
        // if a root lies on lower limit
        if (f(l) == 0)
        {
            printf("The Root = %lf", l);
        }
        //the condition for checking bisection method
        else if (f(l) * f(u) < 0)
        {
            int i = 0;
            do
            {
                x0 = (l   u) / 2;
                if (f(x0) >= 0)
                {
                    u = x0;
                    // printf("changed upper limit to %lfn", u);
                }
                else
                {
                    l = x0;
                    // printf("changed lower limit to %lfn", l);
                }
                i  ;
            } while (fabs(f(x0)) >= 0.0000001);
            printf("the root is %lf and the # steps is %d n", x0, i);
        }
    }
    return 0;
}
 

Но он не может выполнить итерацию внешнего цикла for или попадает в бесконечный цикл после выдачи выходных данных…
Результат, который я получаю, является,

 Set the value of lower and upper limit:
-10
10
the root is -7.725252 and the # steps is 22 
^C

 

Как мне решить проблему такого рода?
Пожалуйста, дайте какое-нибудь решение.
Спасибо.

Комментарии:

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

2. Пожалуйста, обратите внимание, что с такими алгоритмами, как метод деления пополам, обычно рекомендуется останавливать итерации, когда интервал меньше заданного размера. В какой-то момент, x0 , l и u станут численно эквивалентными.

3. Варианты включают в себя: (a) выборку интервала в многочисленных точках, чтобы найти другие сегменты, где знак функции меняется, а затем применить деление пополам к таким сегментам. (b) Учитывая f (x) с решением f (r) = 0, постройте g(x) = f (x) / (x-r). Тогда g может быть ненулевым в r, и алгоритм поиска решения будет искать в другом месте. (Подробности о том, как избежать деления на ноль в g и других проблемах, оставлены в качестве упражнения для читателя.)