# Numerical method for solving a polynomial equation

I am looking for a numerical solution of a equation which contains, in general, one polynomial equation with unknown variable x. I have tried Reduce, Solve, NSolve and FindRoot, but I'm getting nothing after running my code for a few days. Probably there is solution in some of numerical iterative or other methods, unknown for me.

 a1 = Sqrt[2*10^11*3.055*10^-5];
a2 = 0.01;
a3 = 7849;
a4 = 10;
a5 = 50;
a6 = 11;
a7 = 700;

k1 = Rationalize[
Solve[(k (k^3 a1 - I a2 - k (a4 + a5^2 a3)) + x - 2 k a5 a3 a6 -
a3 a6^2) == 0, k][[4]][[1]][[2]], 0];
k2 = Rationalize[
Solve[(k (k^3 a1 - I a2 - k (a4 + a5^2 a3)) + x - 2 k a5 a3 a6 -
a3 a6^2) == 0, k][[1]][[1]][[2]], 0];
k3 = Rationalize[
Solve[(k (k^3 a1 - I a2 - k (a4 + a5^2 a3)) + x - 2 k a5 a3 a6 -
a3 a6^2) == 0, k][[3]][[1]][[2]], 0];
k4 = Rationalize[
Solve[(k (k^3 a1 - I a2 - k (a4 + a5^2 a3)) + x - 2 k a5 a3 a6 -
a3 a6^2) == 0, k][[2]][[1]][[2]], 0];

expr = (I  a1 (k1 - k3) (k2 - k3) (k1 - k4) (k2 - k4))/(
k1 + k2 - k3 - k4) - a7 a6^2;

NSolve[expr == 0, x]

-

Looks like there are at least two solutions (real or "almost real"): You can get initial approximations from the following plot:

Plot[Log[Abs[expr]], {x, 3.8 10^10, 4.0 10^10}, PlotRange -> Full]


To get more accurate results use FindRoot

FindRoot[expr, {x, 3.85 10^10}] (* x->3.84004 10^10-0.609932 I*)
FindRoot[expr, {x, 3.95 10^10}] (* x->3.94883 10^10-0.631114 I*)

-
how to be sure that there are only two roots. I know that all of them should be complex, but more then two. Thank you anyway. – Pipe Mar 9 '14 at 22:55
I found only two roots. The problem is that analytical expressions for k1, k2, k3, k4 involves square roots. That means that analytic continuation of these functions (in case of complex x) is multivalued... So either function expr should be treated as multivalued or it will wave branch cuts (that depends on the problem you were solving in the first place). – bcp Mar 10 '14 at 5:27
thank you very much – Pipe Mar 11 '14 at 13:15