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}}