Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I've been working on a ODE, for a function y[t], that, due to it's complexity, has to be solved numerically. I then need to use the results of NDSolve, which I store in the variable $s$, in the following manner:

Plot[
     NIntegrate[
                f[r],{r,b,Evaluate[Sqrt[{(y[t])^2+b^2}/.s]]}
               ],
     {t,0,5}
    ]

which returns the following errors:

NIntegrate::nlim: r = {20.025} is not a valid limit of integration. >>
NIntegrate::nlim: r = {20.025} is not a valid limit of integration. >>
NIntegrate::nlim: r = {19.6024} is not a valid limit of integration. >>
General::stop: Further output of NIntegrate::nlim will be suppressed during this calculation. >>

It seems that the problem is due to $\text{Evaluate}$ returning the number in parentheses...I've tried the function $\text{N}$ but it has the same problem. Maybe I'm doing something else wrong. Can anyone help me?

Edit: I shall post the complete code as suggested in the comments:

Module[{b = 1., k = 1., Vt0 = 2., L0 = 20.},
 s = NDSolve[
   {y''[t] - (y'[t])^2 (b^2/((b^2 + (y[t])^2) y[t]) - y[t]/(
         b^2 (Exp[(y[t])^2/b^2] - 1))) - (z'[t])^2 (-1/(
         y[t] Exp[(y[t])^2/b^2]) (Exp[(y[t])^2/b^2] - 
           1) (b^2 + (y[t])^2)) + k*(b^2 y[t])/(b^2 + (y[t])^2) == 0, 
    y[0] == L0, y'[0] == 0,
    z''[t] + 2*y'[t]*z'[t]*(y[t]/(b^2 + (y[t])^2)) == 0, z'[0] == Vt0,
     z[0] == 0},
   {z, y}, {t, 0, 5}
   ];
 f[r_] := Sqrt[E^(r^2/b^2)/(-E + E^(r^2/b^2)) - 1];

 Plot[
  NIntegrate[f[r], {r, b, Evaluate[Sqrt[(y[t])^2 + b^2] /. s]}],
  {t, 0, 5}
  ]
 ]
share|improve this question
    
you shall put info on f[],s,r..!! –  Rorschach Aug 25 '13 at 12:26
    
@Nasser ups. Yes \sqrt is Sqrt[]. I copied as Latex before used the 'code' command and left that artifact. –  PML Aug 25 '13 at 12:29
    
@Blackbird Just edited to include the complete code. The function $\text{z[t]}$ shall not matter for the error. –  PML Aug 25 '13 at 12:33
    
M is saying that you are specifying an interpolating function where it needs a constant.You need to look into this.probably your approach is wrong.Upper limit of NIntegrate cannot be a function returning function. –  Rorschach Aug 25 '13 at 12:44
    
@Blackbird Based on your suggestion I figured out what was wrong with my approach. Thank you very much for your time. –  PML Aug 25 '13 at 14:03

1 Answer 1

up vote 3 down vote accepted

I do not know if this plot makes sense of not. But you have complex values showing up from your NIntegrate. Any way, may be you can look at this and see if it look ok.

Let us spread things out a little. Once it is working ok, then you can make a Module and collapse back into one nice long expression.

b = 1.;
k = 1.;
Vt0 = 2.;
L0 = 20.;

sol = NDSolve[{y''[
       t] - (y'[t])^2 (b^2/((b^2 + (y[t])^2) y[t]) - 
         y[t]/(b^2 (Exp[(y[t])^2/b^2] - 1))) - (z'[
          t])^2 (-1/(y[t] Exp[(y[t])^2/b^2]) (Exp[(y[t])^2/b^2] - 
           1) (b^2 + (y[t])^2)) + k*(b^2 y[t])/(b^2 + (y[t])^2) == 0, 
    y[0] == L0, y'[0] == 0, 
    z''[t] + 2*y'[t]*z'[t]*(y[t]/(b^2 + (y[t])^2)) == 0, z'[0] == Vt0,
     z[0] == 0}, {z, y}, {t, 0, 5}];
ysol = y /. First@sol;

make sure solution looks ok before the next step

Plot[ysol[t], {t, 0, 5}]

Mathematica graphics

f[r_?NumericQ] := Sqrt[E^(r^2/b^2)/(-E + E^(r^2/b^2)) - 1];

check

f[r]

Mathematica graphics

make the data. I used Abs since you have complex numbers otherwise.

data = Table[{t,Abs @ NIntegrate[f[r], {r, b, Sqrt[ysol[t]^2 + b^2]}]}, {t, 0,5, .05}];

check some points:

data[[1 ;; 3]]

Mathematica graphics

plot

ListLinePlot[data, Joined -> True, Mesh -> True, MeshStyle -> Red, 
 PlotRange -> All, AxesLabel -> {"t", "NIntegrate"}]

Mathematica graphics

Another way to do the above, is to first calculate the upper limit in a vector, make sure it is ok, then use that next for the integration. Same result is found.

upperLimit = Table[Sqrt[ysol[t]^2 + b^2], {t, 0, 5, .01}];
ListLinePlot[upperLimit, Mesh -> True, MeshStyle -> Red]

Mathematica graphics

data = Table[{i, Abs @ NIntegrate[f[r], {r, b, upperLimit[[i]]}]}, {i,
     Length[upperLimit]}];

ListLinePlot[data, Joined -> True, Mesh -> True, MeshStyle -> Red, 
 PlotRange -> All, AxesLabel -> {"i", "NIntegrate"}]

Mathematica graphics

I do not see anything interesting here. Making t steps smaller, one get straight line.

share|improve this answer
    
I believe that your approach is correct. I've figured out what was wrong with mine. I just had to equal the upper limit expression to a variable, say $\text{x}$. And then in NIntegrate use $\text{x[[1]]}$ for the upper limit. But certainly your approach is very interesting and I foresee that I'll check it out oftentimes. Thank You very much –  PML Aug 25 '13 at 14:01

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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