# Finding the Maximum Value of an Interpolating Function

Posted 10 years ago
5883 Views
|
3 Replies
|
4 Total Likes
|
 Howdy!  I'm new to the forums, but I'm having some trouble with a script I'm writing, so I thought I'd see if the community can help.  I'm solving a set of second order differential equations using NDSolve and I'm trying to extract the maximum values of a specific one of the interpolating functions produced, but I keep getting an error message saying something along the lines of "the function value {0.132074} is not a real number at {t} = {2.}".  I know that the function exists at that point because it is continuous and I can put t=2 in to get that value out.Any ideas on how to get the value to resolve?  Any help is appreciated!Code below: \[Omega] = 1; k = 100000; M = 10000; F = {x1''[t] == -k/M (2*x1[t] - x2[t]) - k/M Cos[\[Omega] t],    x2''[t] == -k/M (2*x2[t] - x1[t] - x3[t]),     x3''[t] == -k/M (2*x3[t] - x2[t] - x4[t]),    x4''[t] == -k/M (2*x4[t] - x3[t] - x5[t]),    x5''[t] == -k/M (2*x5[t] - x4[t] - x6[t]),    x6''[t] == -k/M (2*x6[t] - x5[t] - x7[t]),   x7''[t] == -k/M (x7[t] - x6[t]),   x1[0] == x2[0] == x3[0] == x4[0] == x5[0] == x6[0] == x7[0] == 0,    x1'[0] == x2'[0] == x3'[0] == x4'[0] == x5'[0] == x6'[0] ==     x7'[0] == 0};sol = NDSolve[F, {x1, x2, x3, x4, x5, x6, x7}, {t, 1, 200}];FindMaximum[{x2[t] /. sol, 1 <= t <= 100}, {t}]
3 Replies
Sort By:
Posted 10 years ago
 Replace your NDSolve with thissol = First@NDSolve[F, {x1, x2, x3, x4, x5, x6, x7}, {t, 1, 200}]now FindMaximum is happyFindMaximum[{x2[t] /. sol, 1 <= t <= 100}, {t}](*  {0.412503902064569, {t -> 9.66977049029881}} *)
Posted 10 years ago
 Thanks for the help!  What is the reason for this though?  Is it because NDSolve spits out {InterpolatingFunction} rather than InterpolatingFunction without brackets that you have to specify First?Edit: On further examination, I have determined that this is the case.  Thanks again for the help!
Posted 10 years ago
 What is the reason for this though?Well, I simply saw the error message itself sayingFindMaximum::nrnum: "The function value {0.188062918964778} is not a real number at {t} = {2.`}."And saw the extra {} around the number above. Since the number itself was clearly a real number, then it was the {} that was confusing it. It saw something with List Header when it was expecting a number.The only place this {} could come from is from the solution itself, which has the extra {} around it.{{x1 -> InterpolationFunction)}}Using First@NDSolve removed this extra {}.One might say that may be FindMaximum should have sorted this extra {} out itself internally and Falttened it or did FIrst@ itself and such, but I am sure there are good reason why it did not do that, as that can break other things.