1
$\begingroup$

I have a function f[x,y,...,z] and I want to restrict its range to positive numbers only, f > 0. f[x,y,...,z] is multivalued for some x,y,...,z and I cannot plot it for these values. How can I restrict the range?

To clarify, I don't want to restrict the range of a plot of the function, I want to restrict the range of the function itself.

I've tried Assuming[f>0, f[x,y,...,z]=(function)] but that hasn't helped.

Here is the definition of f, which I originally didn't supply because it's rather complicated:

f[∏, G, M, v, R, A, L] = Abs[1.` v + (12.355667760004051` G M + 1235.5667760004053` M R)/(Sqrt[
  1.` + 0.0001` G^2] (Abs[(994964.5401209999` A^2 G M v)/Sqrt[
     1.` + 0.0001` G^2] + (9.949645401209998`*^7 A^2 M R v)/Sqrt[
     1.` + 0.0001` G^2] - 
     1.0145762999999998`*^7 A^2 \[CapitalPi] + 
     101457.62999999999` A^2 L \[CapitalPi] + \[Sqrt]((1.35`*^7 \(12.023014199999999` A G M + 1202.30142` A M R)^3)/(1.` + 
           0.0001` G^2)^(3/2) + 
        1/(10000.` + 1.` G^2)
          9.899544360981928`*^15 A^4 (1.` G M v + 100.` M R v + 
           0.10197110138986612` Sqrt[
            1.` + 0.0001` G^2] (-99.99999999999999` + 
              1.` L) \[CapitalPi])^2)])^(1/3)) - 1/A 0.004315935432213702` (Abs[(994964.5401209999` A^2 G M v)/Sqrt[
   1.` + 0.0001` G^2] + (9.949645401209998`*^7 A^2 M R v)/Sqrt[
   1.` + 0.0001` G^2] - 1.0145762999999998`*^7 A^2 \[CapitalPi] + 
   101457.62999999999` A^2 L \[CapitalPi] + \[Sqrt]((
      1.35`*^7 (12.023014199999999` A G M + 
         1202.30142` A M R)^3)/(1.` + 0.0001` G^2)^(3/2) + 
      1/(10000.` + 1.` G^2)

        9.899544360981928`*^15 A^4 (1.` G M v + 100.` M R v + 
         0.10197110138986612` Sqrt[
          1.` + 0.0001` G^2] (-99.99999999999999` + 
            1.` L) \[CapitalPi])^2)])^(1/3)];

It's negative values of G (which are necessary to my project) that make the function multivalued (this is the function that solves $∏ = af^3+bf^2+cf+d$ for appropriate $a$,$b$,$c$,$d$.

This is the plot I am now getting:

http://imgur.com/u4kKd0s

As you can see Mathematica adds a straight line instead of graphing the function when it becomes multivalued. I even asked Mathematica for the value of the function at Pi=100 and got the value of that line, so Mathematica is defining the function weirdly, not just plotting it weirdly.

$\endgroup$
11
  • 2
    $\begingroup$ Without the definition of f, it's hard to decide how you would go about doing this. $\endgroup$
    – march
    Commented Sep 4, 2015 at 5:35
  • $\begingroup$ I've updated it with the definition of f. $\endgroup$ Commented Sep 4, 2015 at 5:54
  • 1
    $\begingroup$ But in MMA, all of the functions that you've shown are single-valued. It's hard to parse that expression of course, but is it that sometimes there are square roots of negative numbers? $\endgroup$
    – march
    Commented Sep 4, 2015 at 5:59
  • $\begingroup$ Since you're solving a cubic, did you look at the discriminant already? $\endgroup$ Commented Sep 4, 2015 at 6:04
  • $\begingroup$ After checking a bit based on this, it's solving for the principal root of the cubed roots rather than the real-valued one. It now plots, but it's still having an issue plotting the multi-valuedness. I'm not sure what exactly in the function lets it be multivalued, but it definitely us as the graph should be a sideways cubic function. I've uploaded a picture (in which f=V). $\endgroup$ Commented Sep 4, 2015 at 6:35

2 Answers 2

1
$\begingroup$

Not an answer, but maybe this version of OP's function can be of use. The code in the question seems to have some artifacts that won't allow it to parse.

velocityAtPower[power_, grade_, mass_, windspeed_, resistance_, area_, losses_]:= windspeed-(1/area)(0.004315935432213702*Abs[-1.0145762999999998*^7*area^2*power+101457.63*area^2*losses*power+(994964.540121*area^2*grade*mass*windspeed)/Sqrt[1+0.0001*grade^2]+(9.949645401209998*^7*area^2*mass*resistance*windspeed)/Sqrt[1+0.0001*grade^2]+Sqrt[(1.35*^7*(12.0230142*area*grade*mass+1202.30142*area*mass*resistance)^3)/(1+0.0001*grade^2)^(3/2)+(9.899544360981928*^15*area^4*(0.10197110138986612*Sqrt[1+0.0001*grade^2]*(losses-100)*power+grade*mass*windspeed+100*mass*resistance*windspeed)^2)/(10000+grade^2)]]^(1/3))+(12.355667760004051*grade*mass+1235.5667760004053*mass*resistance)/(Sqrt[1+0.0001*grade^2]*Abs[-1.0145762999999998*^7*area^2*power+101457.63*area^2*losses*power+(994964.5401209999*area^2*grade*mass*windspeed)/Sqrt[1+0.0001*grade^2]+(9.949645401209998*^7*area^2*mass*resistance*windspeed)/Sqrt[1+0.0001*grade^2]+Sqrt[(1.35*^7*(12.0230142*area*grade*mass+1202.30142*area*mass*resistance)^3)/(1+0.0001*grade^2)^(3/2)+(9.899544360981928*^15*area^4*(0.10197110138986612*Sqrt[1+0.0001*grade^2]*(losses-100)*power+grade*mass*windspeed+100*mass*resistance*windspeed)^2)/(10000+grade^2)]]^(1/3))//Abs

velocityAtPower[100, -5, 82, 0, 0.003, 0.315, 3]
(*16.1447*)

Here's the code for OP's plot showing the issue with negative grade (G in the code above):

Manipulate[
 Plot[velocityAtPower[P, G, M, v, R, A, L], {P, 0, 1500},
   PlotRange -> {-25, 25}, 
   AxesLabel -> {"Power (W)", "Velocity (m/s)"}, 
   PlotLabel -> "Velocity at Power, P"],
 {{G, 0, "Grade (%)"}, -20, 20},
 {{M, 82, "Total Mass (kg)"}, 50, 125},
 {{v, 0, "Wind Velocity (m/s)"}, -25, 25},
 {{A, 0.315, "Effective Frontal Area (m^2)"}, 0.1, 1},
 {{L, 3, "Drivetrain Loss (%)"}, 0, 5},
 {{R, 0.003, "Coeff. of Rolling Resistance"}, 0.001, 0.006}]

The trouble seems to arise when this sub-expression under the square root goes negative:

Module[{f, vals = {power -> 100, mass -> 82, windspeed -> 0, resistance -> 0.003, area -> 0.315, losses -> 3}},
 f = (1.35*^7 * (12.0230142 * area * grade * mass + 1202.30142 * area * mass * resistance)^3)/(1 + 0.0001 * grade^2)^(3/2) +
     (9.899544360981928*^15 * area^4 * (0.10197110138986612 * Sqrt[1 + 0.0001*grade^2] * (losses - 100) * power + grade * mass * windspeed + 100 * mass * resistance * windspeed)^2)/(10000 + grade^2);
  f = f/.vals;
  Plot[f, {grade, -10, 10}]]

enter image description here

$\endgroup$
1
$\begingroup$

After supplying definitions of $a$, $b$, $c$, and $d$, just define

f[pi_, G_, M_, v_, R_, A_, L_] = 
  With[{a = (*your defn here*),
        b = (*your defn here*),
        c = (*your defn here*),
        d = (*your defn here*),},
    Root[a #^3 + b #^2 + c # + d - pi &,1]];

In the documentation for Root, the solutions are ordered so that real roots come first (provided the $a$, $b$, $c$, and $d$ are real, I think).

So unless there is something really strange going on, this should yield correct results even when pi is taken small.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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