Re: Function to solve polynomial
- To: mathgroup at smc.vnet.net
- Subject: [mg71298] Re: Function to solve polynomial
- From: "dimitris" <dimmechan at yahoo.com>
- Date: Tue, 14 Nov 2006 05:06:12 -0500 (EST)
- References: <ej42av$r0u$1@smc.vnet.net>
Because you face problems with my previous posts here I repost again my
reply with more material.
Just copy/paste ain notebook, select the cell and execute it.
(*initialization cell*)
Off[General::spell1]
(*the steps of the code*)
f[x_] := (x - 4)*(x + 2)*(x - 1)*(x + 5)*(x - 7)
plot = Plot[f[x], {x, -10, 10}, DisplayFunction -> Identity];
Print[StyleForm["the points used by the Plot function ", FontColor ->
Blue]];
points = Cases[plot, {(x_)?NumberQ, (y_)?NumberQ}, Infinity]
Print[StyleForm["find where the function changes sign", FontColor ->
Blue]];
seeds = Position[Times @@@ Partition[points[[All, 2]], 2, 1], x_ /; x
<= 0]
Print[StyleForm["between this points in x axis there is a change in
sign of f[x]", FontColor -> Blue]];
samples = Extract[Partition[points[[All, 1]], 2, 1], seeds]
Print[StyleForm["the roots, at last!", FontColor -> Blue]];
(FindRoot[f[x] == 0, {x, #1[[1]], #1[[2]]}] & ) /@ samples
(*the code*)
Clear[f]
FindAllCrossings1D[f_, {x, a_, b_}, opts___] := Block[{
plotData}, plotData = Cases[Plot[f, {x, a, b}, DisplayFunction -> \
Identity], {x_?NumberQ, y_?
NumberQ},
Infinity]; x /.
FindRoot[f, {
x, #[[1]], #[[2]]}, opts] & /@ (Extract[Partition[plotData[[
All, 1]], 2, 1], Position[Times @@@ Partition[plotData[[All,
2]], 2, 1], x_ /; x <= 0]])]
plotFunctionRoots[f_, {x_, a_, b_}, roots_, opts___] :=
Block[{ff}, ff = Function[x, Evaluate[f]]; Plot[f, {x, a, b}, opts,
Epilog -> {Red, PointSize[0.02], (Point[{#1, ff[#1]}] & ) /@ roots}]]
(*an example*)
f[x_] := (x - 4)*(x + 2)*(x - 1)*(x + 5)*(x - 7)
sols = FindAllCrossings1D[f[x], {x, -10, 10}]
plotFunctionRoots[f[x], {x, -10, 10}, sols];
(*another code*)
Clear[f]
Needs["NumericalMath`IntervalRoots`"]
FindAllCrossingsInt[f_, {x_, a_, b_}, {tol_, opts1___}, opts2___] := \
(FindRoot[f, {x, #1[1], #1[2]}, opts2] &) /@ List @@
IntervalBisection[f, x, Interval[{a, b}], tol, opts1]
plotFunctionRoots[f_, {x_, a_, b_}, roots_, opts___] := Block[{ff}, ff
=
Function[x, Evaluate[f]];
Plot[f, {x, a,
b}, opts, Epilog -> {Red, PointSize[0.02], (
Point[{#1, ff[#1]}] &) /@ roots}]]
(*an example*)
f[x_] := (x - 4)*(x + 2)*(x - 1)*(x + 5)*(x - 7)
sols = x /. FindAllCrossingsInt[f[x], {x, -10, 10}, {0.1, MaxRecursion
->
10}]
plotFunctionRoots[f[x], {x, -10, 10}, sols,
ImageSize -> {400, 300}, Frame -> {True,
True, False, False}, Axes -> {True, False}];
(*another example*)
(*another example*)
g[x_] := 5*(x/100) + Cos[x]
sols = FindAllCrossings1D[g[x], {x, -30, 30}]
plotFunctionRoots[g[x], {x, -30, 30}, sols];
sols = x /. FindAllCrossingsInt[g[x], {
x, -30, 30}, {0.1, MaxRecursion -> 10}]
plotFunctionRoots[g[x], {x, -30, 30}, sols,
ImageSize -> {400, 300}, Frame -> {True,
True, False, False}, Axes -> {True, False}];
plotFunctionRoots[g[x], {x, -20, -18}, sols,
ImageSize -> {400, 300}, Frame -> {True, True,
False, False}, Axes -> {True, False}, PlotLabel -> "zoom in"];
a1b2c3d4 wrote:
> I am trying to write a function that will help me solve the polynomial f(x)=(x-4)(x+2)(x-1)(x+5)(x-7) (NSolve and Solve functions not preferred)
>
> I can only think of this function:
> solution := {Plot[{(x -4)(x + 2)(x - 1)(x + 5)(x - 7)}, {x, -10, 10}, AxesLabel -> TraditionalForm /@ {x, y}]}
>
> Does anyone have better knowledge than me in writing an automated program to solve this polynomial? Say For, While or Do Loop?
>
> Your help will be greatly appreciated.
- Follow-Ups:
- Re: Re: Function to solve polynomial
- From: Murray Eisenberg <murray@math.umass.edu>
- Re: Re: Function to solve polynomial