# NSolve finds real-valued results in version 9, but not in version 10

UPDATE Reals also was used in the code.

Actually, I tried the following simple piece of code.

P[T_, V_] := -(1/V^2) + T/V + (2 T)/(-1 + V)^3 + (4 T)/(-1 + V)^2;
NSolve[
{
D[P[T, V], {V, 1}] == 0,
D[P[T, V], {V, 2}] == 0
},
{T, V},
Reals
] // TableForm


And in ver. 9, the output was,

{
{T -> -9.67712, V -> -2.35529},
{T -> -5.12191, V -> -0.778707},
{T -> 0.0943287, V -> 7.66613}
}


and in case of ver. 10.3.1, obtained,

{}


That is, these two versions apparently return different outputs.

Whats is the cause? Is there any version dependency in Mathematica?

• @Shaqpad, you can even go further by typing Quit and entering it, this quits the kernel completely but leaves the front end open. – Jason B. Jan 19 '16 at 16:10
• Forgot about Reals. The shown outputs are for the case using Reals. – Shaqpad Jan 19 '16 at 16:12
• Ahhh... Reals! well yes, now the list is empty in 10.3.1 and not in v9, I can confirm there is a difference. Will delete old comments now obsolete. – rhermans Jan 19 '16 at 16:13
• The only relevant doc. found is this – Shaqpad Jan 19 '16 at 16:15
• Essentially the same issue as was reported here. A workaround is to use Method->"EndomorphismMatrix" – Daniel Lichtblau Jan 19 '16 at 17:39

Not a solution, more of an extended comment.

Clearly there are real solutions, the curves below do cross

ContourPlot[
Evaluate[{D[P[T, V], {V, 1}] == 0,
D[P[T, V], {V, 2}] == 0}], {V, -10, 10}, {T, -10, 10},
PlotPoints -> 40] You can get the real-valued solutions version 9 gave via

Solve[{N@D[P[T, V], {V, 1}] == 0,
N@D[P[T, V], {V, 2}] == 0}, {T, V}, Reals]


During evaluation of Solve::ratnz: Solve was unable to solve the system with inexact coefficients. The answer was obtained by solving a corresponding exact system and numericizing the result. >>

(* {{T -> -9.67712, V -> -2.35529}, {T -> -5.12191,
V -> -0.778707}, {T -> 0.0943287, V -> 7.66613}} *)


You can also get these answers with NSolve (with a little more precision) by using the Method option

NSolve[
{
D[P[T, V], {V, 1}] == 0,
D[P[T, V], {V, 2}] == 0
},
{T, V}
, Reals, Method -> "UseSlicingHyperplanes"]
(* {{T -> 0.0943287, V -> 7.66613}, {T -> -9.67712,
V -> -2.35529}, {T -> -5.12191, V -> -0.778707}} *)

{D[P[T, V], {V, 1}] , D[P[T, V], {V, 2}]} /. %
(* {{-1.12757*10^-17,
3.25261*10^-18}, {1.11022*10^-15, -1.9984*10^-15}, {3.55271*10^-15,
1.59872*10^-14}} *)


Why is this happening? I don't know (hence the disclaimer at the top). I know that the functions NSolve and the like are constantly undergoing development, and some of those very developers post here. They would be very interested in hearing about this I think.

• Of course your answered my question; more than it deserves! – Shaqpad Jan 19 '16 at 16:53

You can use any of the alternative methods found here: Methods for NSolve

For example:

NSolve[{D[P[T, V], {V, 1}] == 0, D[P[T, V], {V, 2}] == 0}, {T, V}, Reals,
Method -> "Legacy"]
(*
{{T -> 0.0943287, V -> 7.66613},
{T -> -9.67712,  V -> -2.35529},
{T -> -5.12191,  V -> -0.778707}}
*)


The other alternatives seem to work, too. Except the default one.

This is cute, too (method "Foo"??):

NSolve[{D[P[T, V], {V, 1}] == 0, D[P[T, V], {V, 2}] == 0}, {T, V}, Reals,
Method -> "Foo"]
(*
{{T -> 0.0943287, V -> 7.66613}, {T -> -9.67712,
V -> -2.35529}, {T -> -5.12191, V -> -0.778707}}
*)

• Now I'm just going to use random methods whenever I use NSolve, like Method -> "JWalterWeatherman". Is this big enough to be marked as a bug? – Jason B. Feb 2 '16 at 14:52
• @JasonB Daniel's comment says it's the same as this, which was marked a bug. -- BTW, Method settings are irregularly or loosely checked in some functions, with undefined settings falling through to a default. In this case, the Automatic setting seems to be mishandled, but invalid settings get past the bug. – Michael E2 Feb 2 '16 at 15:03