MathGroup Archive 2011

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: NMinimize problem: fct minimized uses FindRoot

  • To: mathgroup at smc.vnet.net
  • Subject: [mg123577] Re: NMinimize problem: fct minimized uses FindRoot
  • From: "Oleksandr Rasputinov" <oleksandr_rasputinov at hmamail.com>
  • Date: Sun, 11 Dec 2011 03:50:29 -0500 (EST)
  • Delivered-to: l-mathgroup@mail-archive0.wolfram.com
  • References: <jbvjcm$it3$1@smc.vnet.net>

On Sat, 10 Dec 2011 12:30:14 -0000, Doug Tinkham <dtinkham at live.ca> wrote:

> Hello
>
> I'm using NMinimize and FindMinimum to minimize a function that uses
> FindRoot when calculating it's value. The problem is that the equation
> that FindRoot is used on uses the variable that is being optimized, and
> Mathematica appears to be forcing the variable that is being optimized
> to remain symbolic in the FindRoot call, and this leads to recursion and
> a recursion limit error.
>
> Rather than post my actual functions that are quite long, I've reduced
> my problem to the code below that shows my issue. As you will see,
> FindRoot keeps optvar in symbolic form when executing FindRoot. Is there
> a way to force Mathematica to use all numerical calculations using
> NMinimize or FindMinimum?  Is the issue with calculation of the
> gradient, which Mathematica wants to do symbolically?
>
> Many thanks.
>
>
>
> MyNumFct[optvar_] := Module[{inteq, n},
>   inteq[x_] := (Sin[x] + 1/2*Cos[x])/optvar;
>   n = n /. FindRoot[inteq[n], {n, 0.1}];
>   Return[n + Sin[optvar]];
> ]
> NMinimize[{MyNumFct[var], 0 <= var <= 6}, {var, 4.1}]
>

An easy fix: just don't allow MyNumFct to evaluate for symbolic arguments.  
Define it with a condition that the argument has to be numeric:

MyNumFct[optvar_?NumericQ] := Module[{inteq, n},
   inteq[x_] := (Sin[x] + 1/2*Cos[x])/optvar;
   n = n /. FindRoot[inteq[n], {n, 0.1}];
   Return[n + Sin[optvar]];
]

Your syntax for NMinimize is also erroneous; if you want to specify  
initial values, you have to specify a starting region (with upper and  
lower bounds), not just a starting point:

NMinimize[{MyNumFct[var], 0 <= var <= 6}, {var, 4, 5}]

giving:

{-1.46365, {var -> 4.71239}}



  • Prev by Date: Re: color-bar legend for the LisContourPlot
  • Next by Date: Re: color-bar legend for the LisContourPlot
  • Previous by thread: Re: NMinimize problem: fct minimized uses FindRoot
  • Next by thread: tree graph with images as the vertices?