9

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
  • 113
  • 4

2 Answers2

7

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]

enter image description here

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.

Jason B.
  • 68,381
  • 3
  • 139
  • 286
6

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}}
*)
Michael E2
  • 235,386
  • 17
  • 334
  • 747
  • 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 02 '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 02 '16 at 15:03