#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 и других проблемах, оставлены в качестве упражнения для читателя.)