0

" I have an assignment where I am required to use bisection or false position method depending on various inputs and I think I have a reasonable code that should work but I am not sure why I keep getting the errors at the bottom?"

----------


Func[f_, a_, b_, MaxIter_, eps_, flag_] := (
    atable = {a};
    btable = {b};
    xtable = {1};
    ErrorTable = {1};
    i = 1;
    Title = {"Iteration", "a", "b", "x_i", "f[a]", "f[b]", "f[x_i]", "er"};
    T2 = Table[{i, atable[ [i]], btable[ [i]], xtable[ [i]], f[atable[ [i]]],
    f[btable[ [i]]], f[xtable[ [i]]], ErrorTable[ [i]]}, {i, Length[xtable]}];
    If[Or[flag < 1, flag > 2], "Please select appropriate values (1 or 2) for flag",
    If[a > b, "Please select a < b",
    If[f[a] * f[b] > 0, "Please select appropriate values a and b such that f[a]*f[b]<0",
    While[And[i ≤ MaxIter, flag ⩵ 1],
    ri = (atable[ [i]] + btable[ [i]]) / 2;
    If[f[ri] * f[atable[ [i]]] ≤ 0, atable = Append[atable, atable[ [i]]];
    btable = Append[btable, ri],
    If[f[ri] f[btable[ [i]]] ≤ 0, btable = Append[btable, ri];
    btable = Append[btable, btable[ [i]]]]];
    If[i ⩵ 1, xtable[ [i]] = ri, xtable = Append[xtable, ri];
    ei = N[ (xtable[ [i]] - xtable[ [i - 1]]) / xtable[ [i]]];
    ErrorTable = Abs[Append[ErrorTable, ei]]];
    If[Abs[ErrorTable[ [i]] < eps], flag ⩵ 0, flag ⩵ 1];
    i ++];
    While[And[i ≤ MaxIter, flag ⩵ 2],
    ri = (atable * f[btable] - btable * f[atable]) / (f[btable] - f[atable]);
    If[f[ri] * f[atable[ [i]]] ≤ 0, atable = Append[atable, atable[ [i]]];
    btable = Append[btable, ri],
    If[f[ri] f[btable[ [i]]] ≤ 0, btable = Append[btable, ri];
    btable = Append[btable, btable[ [i]]];
    If[i ⩵ 1, xtable[ [i]] = ri, xtable = Append[xtable, ri];
    ei = N[ (xtable[ [i]] - xtable[ [i - 1]]) / xtable[ [i]]];
    ErrorTable = Abs[Append[ErrorTable, ei]];
    If[Abs[ErrorTable[ [i]] < eps], flag ⩵ 0, flag ⩵ 2];
    i ++]]]]];
    T2 = Prepend[T2, Title];
    T2 // MatrixForm]])

    f[x_] := x^3;
    Func[f, -3, 7, 100, 0.001, 1]


----------


  <  Part: Part 3 of {-3, -3} does not exist.
    Part: Part 3 of {-3, -3} does not exist.
    Part: Part 3 of {-3., -3.} does not exist.
    General: Further output of Part::partw will be suppressed during this calculation.>
J. M.'s missing motivation
  • 124,525
  • 11
  • 401
  • 574
miraj
  • 1
  • I didn't take the time to actually understand your code, but you can try print statement debugging to get a better understanding of what's going on. For example, if you insert Print[i]; Print[{atable,btable,xtable}] right after While[And[i ≤ MaxIter, flag == 1], it becomes clear that on the third iteration, atable's length is only two and the program requests its third element, thus raising the error. Also, I've noticed a typo: in If[Abs[ErrorTable[[i]] < eps], flag == 0, flag == 1] there must be = instead of ==. – aooiiii Feb 02 '20 at 09:26
  • 1
    Your code seems much too dense and complicated. Can't you strip out the actual mechanics of the method from the rest, encapsulate that as a function, and debug that first; you might even write a separate function just to do one iteration of the method. Also, see, e.g., https://mathematica.stackexchange.com/questions/69771/implement-the-bisection-algorithm-elegantly-and-easily. – murray Feb 02 '20 at 16:45
  • When I ran your code I got no errors: http://i.stack.imgur.com/pKWIe.png -- I'm using V12, but at a glance I don't see any version-specific issues. – Michael E2 Feb 03 '20 at 02:39
  • 1
    @Michael E2 there were no errors and no meaningful output because for some weird reason all ==s in @miraj's code turned into a single unicode character that Mathematica doesn't recognize. If you replace them back, the errors return. Should have written that in the first comment, but ran out of allowed space. – aooiiii Feb 03 '20 at 05:23
  • @aooiiii Yes but I think the OP should post code that reproduces the problem. Via an edit. – Michael E2 Feb 03 '20 at 14:18

1 Answers1

1

More a comment, not a direct answer to your question of why those errors in your own code. You might start with the following, then add the code to supply tolerance specifications.

rfStep[f_, a_, b_] := (a f[b] - b f[a])/(f[b] - f[a])

regulaFalsiSimple[f_, a0_, b0_, n_] :=
 Module[
  {a = N[0], b = N[b0], c = rfStep[f, a0, b0], k},
  k = 0;
  While[k < n,
   If[Sign[f[b]] == Sign[f[c]],
    b = c, a = c];
   c = rfStep[f, a, b];
   k = k + 1];
  c]

f[x_] := x^3

regulaFalsiSimple[f, -3, 7, 100]
murray
  • 11,888
  • 2
  • 26
  • 50