0
$\begingroup$

This question already has an answer here:

First I plot the function and then I try to find a domain such that I can see the curve cut through the x-axis. I do this via trial and error

f[x_] := x^6 - x - 1; 
Plot[f[x], {x, -1, 1}]

1

this is my code. How can I improve it?

a = -1; 
b = 0; (*define the initial domain [a,b] *)

(*tolerence*)
epsilon = 0.001; 


(*initialistation*)
count = 0; 
countvalve = 100;
c = 0.5*(a + b);

While[Abs[f[c]] > epsilon,
  count = count + 1;
  c = 0.5*(a + b);
  If[f[c]*f[a] < 0, b = c, a = c];
  If[count > countvalve, Break[]];
  Print[{count, c, f[c], epsilon}];];
Print["While loop exited"];

Print[{count, c, f[c], epsilon}];
Plot[f[x], {x, c - 0.1, c + 0.1}]

this is the output

{1,-0.5,-0.484375,0.001} 
{2,-0.75,-0.0720215,0.001}
{3,-0.875,0.323795,0.001} 
{4,-0.8125,0.1002,0.001}
{5,-0.78125,0.00862368,0.001} 
{6,-0.765625,-0.0329578,0.001}
{7,-0.773438,-0.0124947,0.001} 
{8,-0.777344,-0.00201909,0.001}
{9,-0.779297,0.00328119,0.001} 
{10,-0.77832,0.000625803,0.001} 
While loop exited 
{10,-0.77832,0.000625803,0.001}

enter image description here

Suppose the function contains two roots. how do I find the other one?

but this is the real question,

How do I write a code to implement bisection method so that, given any continuous function $f(x)$, the code can

  1. Count the number of roots in a domain [a,b]

  2. Evaluate each of these roots one by one in sequence.

where epsilon = 0.001

these are sample functions.

f[x] = Exp[x] - x - 2; (* for all x *)
f[x] = x^3 + (2*x)^2 - 3*x - 1; (*for all x *)
f[x] = (1/x)Sin[x]; (* for -3 π <= x <= 3 π *)
f[x] = Tan[π*x] -x - 6; (* for -3 π <= x <= 3 π *)

The code should be able to find all the roots in all the functions automatically and without manual intervention.

$\endgroup$

marked as duplicate by Bob Hanlon, MarcoB, m_goldberg, Alexey Popkov, Öskå May 1 '16 at 14:28

This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.

  • 1
    $\begingroup$ How about: FindRoot[f[x], {x, 0.1}]. Then scan through many different starting values. $\endgroup$ – bill s Apr 28 '16 at 1:01
  • 5
    $\begingroup$ Check this answer here $\endgroup$ – Jack LaVigne Apr 28 '16 at 1:25
  • $\begingroup$ NSolve[f[x] == 0 && a <= x <= b, x]? -- Are you required to use the bisection method? You'll need another algorithm to isolate the roots. I take it this is a homework assignment, because the only other reason I can think of trying this way is for fun. $\endgroup$ – Michael E2 Apr 28 '16 at 11:37
2
$\begingroup$

A methode i like to use and a starter. Please see Bisection method and Bisection,

in particular:

Let $a_n$ and $b_n$ be the endpoints at the nth iteration (with $a_1=a$ and $b_1=b$) and let $r_n$ be the nth approximate solution. Then the number of iterations required to obtain an error smaller than epsilon is found by noting that $b_n-a_n=(b-a)/(2^{(n-1)})$

f[x_] := x^6 - x - 1
Plot[f[x], {x, -\[Pi]/3, \[Pi]/2}]

enter image description here

NSolve[Evaluate@f[x] == 0, x]

{{x->-0.77809},{x->-0.629372-0.735756 I},{x->-0.629372+0.735756 I},{x->0.451055 -1.00236 I},{x->0.451055 +1.00236 I},{x->1.13472}}

FindRoot[f[x], {x, 0}]

{x->-0.77809}

a[1] = 0;
b[1] = -1;

Do[p[n] = N[1/2 (a[n] + b[n])]; 
If[N[f[b[n]] f[p[n]]] < 0, a[n + 1] = p[n]; b[n + 1] = b[n], 
a[n + 1] = a[n]; b[n + 1] = p[n]], {n, 1, 20}]

TableForm[Table[{a[n], b[n], p[n], N[f[a[n]]], N[f[b[n]]],  
N[f[p[n]]]}, {n, 1, 20}]]

enter image description here

$\endgroup$

Not the answer you're looking for? Browse other questions tagged or ask your own question.