MathGroup Archive 2006

[Date Index] [Thread Index] [Author Index]

Search the Archive

Bairstow Method

  • To: mathgroup at smc.vnet.net
  • Subject: [mg71220] Bairstow Method
  • From: "ms z" <ms-z- at hotmail.com>
  • Date: Fri, 10 Nov 2006 06:38:46 -0500 (EST)

I'm sorry for mailing again. Left out something in the previous email.

I posted a question on how to write an automated program to solve the 
polynomial f(x)=(x-4)(x+2)(x-1)(x+5)(x-7) (without using NSolve or Solve) 
earlier on.

I suggested this program: (though not a good one)
solution := {Plot[{(x - 4)(x + 2)(x - 1)(x + 5)(x - 7)}, {x, -10, 10}, 
AxesLabel -> TraditionalForm /@ {x, y}]}

I've tried to write another program using Bairstow Method. But it doesn't 
not seem to work. Could I have some help?

The program is as follows:

Off[General::spell];

bairstow[rl_, sl_, esl_] :=
  Block[{r, x, rnew, snew, es, f,
   f1, f2, cl1, cl2, dr, ds, eqn1, eqn2, ear, eas},
    f = Expand[(x - 4) (x + 2) (x - 1) (x + 5) (x - 7)];
    ea = 100; es = esl;
    For[i = 1, ear && eas > es, i++,
      (b5 = 1;
        b4 = -5 + r*b5;
        b3 = -35 + r*b4 + s*b5;
        b2 = 125 + r*b3 + s*b4;
        b1 = 194 + r*b2 + s*b3;
        b0 = -280 + r*b1 + s*b2;
        c5 = b5;
        c4 = b4 + r*c5;
        c3 = b3 + r*c4 + s*c5;
        c2 = b2 + r*c3 + s*c4;
        c1 = b1 + r*c2 + s*c3;
        eqn1 = c2*dr + c3*ds == -b1;
        eqn2 = c1*dr + c2*ds == -b0;
        dr = (-b1*c2 - (-b0)*c3)/(c2*c2 - c1*c3);
        ds = (-b1*c1 - (-b0)*c2)/(c3*c1 - c2*c2);
        If[i == 1, (r = rl; s = sl), (r = rnew; s = snew)];
        dr; ds;
        rnew = r + dr;
        snew = s + ds;
        ear = Abs[dr/rnew]*100;
        eas = Abs[ds/snew]*100;
        Clear[r, s, dr, ds];)];
    x1 = (rnew + Sqrt[(rnew^2 + 4*snew)])/2;
    x2 = (rnew - Sqrt[(rnew^2 + 4*snew)])/2;
    Print["Value of x1 is ", x1];
    Print["Value of x2 is ", x2];
    Clear[r, s, dr, ds];
    f = x^5 - 5 x^4 - 35 x^3 + 125 x^2 + 194 x - 280;
    f1 = PolynomialQuotient[f, x^2 - rnew*x - snew, x];
    cl1 = CoefficientList[f1, x];
    Clear[rnew, snew];
    ea = 100; es = esl;
    For[i = 1, ear && eas > es, i++,
      (b3 = cl1[[4]];
        b2 = cl1[[3]] + r*b3;
        b1 = cl1[[2]] + r*b2 + s*b3;
        b0 = cl1[[1]] + r*b1 + s*b2;
        c3 = b3;
        c2 = b2 + r*c3;
        c1 = b1 + r*c2 + s*c3;
        eqn1 = c2*dr + c3*ds == -b1;
        eqn2 = c1*dr + c2*ds == -b0;
        dr = (-b1*c2 - (-b0)*c3)/(c2*c2 - c1*c3);
        ds = (-b1*c1 - (-b0)*c2)/(c3*c1 - c2*c2);
        If[i == 1, (r = rl; s = sl), (r = rnew; s = snew)];
        dr; ds;
        rnew = r + dr;
        snew = s + ds;
        ear = Abs[dr/rnew]*100;
        eas = Abs[ds/snew]*100;
        Clear[r, s, dr, ds];)];
    x3 = (rnew + Sqrt[(rnew^2 + 4*snew)])/2;
    x4 = (rnew - Sqrt[(rnew^2 + 4*snew)])/2;
    Print["Value of x3 is ", x3];
    Print["Value of x4 is ", x4];
    Clear[r, s, dr, ds];
    f2 = PolynomialQuotient[f1, x^2 - rnew*x - snew, x];
    cl2 = CoefficientList[f2, x];
    x5 = cl2[[1]]/cl2[[2]];
    Print["Value of x5 is ", x5];]

_________________________________________________________________
Find just what you are after with the more precise, more powerful new MSN 
Search. http://search.msn.com.sg/ Try it now.


  • Prev by Date: RE: Challenge problem
  • Next by Date: Re: Insertion into sorted list
  • Previous by thread: Merge of Matrices 2
  • Next by thread: Re: Bairstow Method