1
$\begingroup$

I'm trying to plot sections of the 3D Contours, with gradient less than zero, and more than zero and equal to zero.

It manages to solve for the derivative, but when I apply the conditions deriv2 < 0 or deriv2 > 0 it gives the error:

deriv2 < 0 must be a boolean condition

C1 = 10^(-1);
C2 = 0.1*C1;
R = 50;
Tb = 0.1;
Geb = 5.;
Z0 = 50;
L[Te_] := 1. + 1.*(Te - 0.1);
Zlcr[Te_, w_] := (1/R + 1/(I*L[Te]*w) + I*C1*w)^-1;
Zload[Te_, w_] := -I*w*C2 + Zlcr[Te, w];
Γ[Te_, w_] := (Zload[Te, w] - Z0)/(Zload[Te, w] + Z0);
y[Te_, w_] := (Abs[Γ[Te, w]])^2;
DeltaPlocal = 10.^-5;
eq2 = (1 -   y[Te, w]) Pprobe  ==  (Te - Tb) Geb
ContourPlot3D[ 
 Evaluate[eq2], {w, 2.5, 2.8}, {Te, 0, 0.5}, {Pprobe, 0, 5}    ]

deriv2 = Derivative[1, 0][Te][w, Pprobe] /. 
   First[  Solve[    D[eq2 /. Te ->   Te[w, Pprobe], w],  
     Derivative[1, 0][Te][w, Pprobe]  ]  ]  /. Te[w, Pprobe] ->  Te

Positive2 = 
 ContourPlot3D[
  Evaluate[eq2], {w, 2.5, 2.8}, {Pprobe, 0, 5}, {Te, 0, 0.5}, 
  RegionFunction ->  Function[{w, Pprobe, Te}, deriv2 > 0], Mesh -> False, 
  ContourStyle -> Blue, MaxRecursion -> 5]

Negative2 = 
 ContourPlot3D[
  Evaluate[eq2], {w, 2.5, 2.8}, {Pprobe, 0, 5}, {Te, 0, 0.5}, 
  RegionFunction ->  Function[{w, Pprobe, Te}, deriv2 < 0], Mesh -> False, 
  ContourStyle -> Red, MaxRecursion -> 5]

zero2 = ContourPlot3D[
  Evaluate[eq2], {w, 2.5, 2.8}, {Pprobe, 0, 5}, {Te, 0, 0.5}, 
  RegionFunction ->  Function[{w, Pprobe, Te}, deriv2 = 0], Mesh -> False, 
  ContourStyle -> Green, MaxRecursion -> 5]
$\endgroup$
  • $\begingroup$ Adopted from: mathematica.stackexchange.com/questions/56289/… $\endgroup$ – user44840 Sep 1 '14 at 9:46
  • $\begingroup$ AFAIS deriv2 is Complex ... $\endgroup$ – Dr. belisarius Sep 1 '14 at 13:24
  • $\begingroup$ I don't think so, as all terms in eq2 are real. y[Te,w] is the absolute value of a funtion $\endgroup$ – user44840 Sep 1 '14 at 13:36
  • $\begingroup$ If you say so .. $\endgroup$ – Dr. belisarius Sep 1 '14 at 13:54
  • $\begingroup$ ok if deriv2 is complex, then how do I plot it? $\endgroup$ – user44840 Sep 1 '14 at 13:58
3
$\begingroup$

Rationalize all of the definitions and equations so that there are no numerical artifacts resulting from the initial presence of the imaginary factors.

C1 = 1/10;
C2 = C1/10;
R = 50;
Tb = 1/10;
Geb = 5;
Z0 = 50;
L[Te_] = Te + 9/10;
Zlcr[Te_, w_] = (1/R + 1/(I*L[Te]*w) + I*C1*w)^-1;
Zload[Te_, w_] = -I*w*C2 + Zlcr[Te, w];
Γ[Te_, w_] = (Zload[Te, w] - Z0)/(Zload[Te, w] + Z0);
y[Te_, w_] = (Abs[Γ[Te, w]])^2;
DeltaPlocal = 10^-5;

Since you are interested in real values of {w, Te, Pprobe} use ComplexExpand to get rid of Abs in eq2. Abs causes problems with derivatives. For example,

D[Abs[x], x]

Derivative1[Abs][x]

eq2 = (1 - y[Te, w]) Pprobe == (Te - Tb) Geb //
   ComplexExpand[#, TargetFunctions -> {Re, Im}] & //
  Simplify

1/2 + (100000000 Pprobe (9 + 10 Te)^2 w^2)/(6250000000000 + 250000 (-4467779 - 4928200 Te + 40000 Te^2) w^2 + (50629005081 + 112508950180 Te + 62505000100 Te^2) w^4 + 25 (9 + 10 Te)^2 w^6) == 5 Te

cp3D = ContourPlot3D[Evaluate[eq2],
   {w, 25/10, 28/10}, {Pprobe, 0, 5}, {Te, 0, 1/2},
   AxesLabel -> (Style[#, 14, Bold] & /@ {w, Pprobe, Te})];

deriv2 = Derivative[1, 0][Te][w, Pprobe] /.
      First[Solve[D[eq2 /. Te -> Te[w, Pprobe], w],
        Derivative[1, 0][Te][w, Pprobe]]] /.
     Te[w, Pprobe] -> Te // 
    N[#, 30] & // Simplify;

Positive2 = ContourPlot3D[Evaluate[eq2],
   {w, 25/10, 28/10}, {Pprobe, 0, 5}, {Te, 0, 1/2},
   RegionFunction ->
    Function[{w, Pprobe, Te}, deriv2 > 0],
   WorkingPrecision -> 20,
   Mesh -> False,
   ContourStyle -> Blue,
   AxesLabel ->
    (Style[#, 14, Bold] & /@ {w, Pprobe, Te})];

Negative2 = ContourPlot3D[Evaluate[eq2],
   {w, 25/10, 28/10}, {Pprobe, 0, 5}, {Te, 0, 1/2},
   RegionFunction ->
    Function[{w, Pprobe, Te}, deriv2 < 0],
   WorkingPrecision -> 20,
   Mesh -> False,
   ContourStyle -> Red,
   AxesLabel ->
    (Style[#, 14, Bold] & /@ {w, Pprobe, Te})];

zero2 appears to be an arbitrarily small region so I have skipped over it.

GraphicsRow[{cp3D, Show[Positive2, Negative2,
   AxesLabel ->
    (Style[#, 14, Bold] & /@ {w, Pprobe, Te})]},
 ImageSize -> 600]

enter image description here

$\endgroup$
  • $\begingroup$ Running your code still gives me the error "deriv2 > 0 must be a boolean function" $\endgroup$ – user44840 Sep 2 '14 at 8:51
  • $\begingroup$ Works fine with v10 on my Mac. Try starting with a fresh kernel or change definition and use of deriv2 to make variable dependency explicit, i.e., deriv2[w_, Pprobe_, Te_] = ... and RegionFunction -> Function[{w, Pprobe, Te}, deriv2[w, Pprobe, Te] < 0]. $\endgroup$ – Bob Hanlon Sep 2 '14 at 12:40
  • $\begingroup$ I restarted mathematica, and it still doesn't work..I'm on MMA 9 $\endgroup$ – user44840 Sep 2 '14 at 12:48
  • 1
    $\begingroup$ In v9 the ComplexExpand in eq2's definition doesn't get rid of the Abs. Use TargetFunctions option in ComplexExpand. Change the definition of eq2 to eq2 = (1 - y[Te, w]) Pprobe == (Te - Tb) Geb // ComplexExpand[#, TargetFunctions -> {Re, Im}] & // Simplify $\endgroup$ – Bob Hanlon Sep 2 '14 at 13:37
  • $\begingroup$ I incorporated the changed definition of eq2 above to make the solution more robust. $\endgroup$ – Bob Hanlon Sep 2 '14 at 13:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.