Re: NMinimize problem: fct minimized uses FindRoot
- To: mathgroup at smc.vnet.net
- Subject: [mg123562] Re: NMinimize problem: fct minimized uses FindRoot
- From: "Doug Tinkham" <dtinkham at live.ca>
- Date: Sun, 11 Dec 2011 03:47:45 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <201112101227.HAA19219@smc.vnet.net> <op.v6afndnttgfoz2@bobbys-imac.local>
Thanks Bobby. The function I showed with Sin and Cos is meaningless; it was just a function that reproduced the recursion limit problem I was having. The actual function would be several pages long, even after simplification. Why never use Return? As a C++ programmer, it is a habit. I can't find information saying why one should not. Is there a performance penalty? Thanks. -------------------------------------------------- From: "DrMajorBob" > 1) Never, ever, EVER use Return. In this case, there wasn't even a flimsy > excuse for it. > > 2) To prevent computing a function with symbolic arguments, use a pattern > on the LHS such as _?NumericQ. > > 3) You used invalid syntax in the second argument of NMinimize. > > 4) Use Set, not SetDelayed, whenever possible. > > Clear[numFct] > numFct[optvar_?NumericQ] := > Module[{inteq, n, x}, inteq[x_] = (Sin[x] + 1/2*Cos[x])/optvar; > Sin[optvar] + n /. FindRoot[inteq[n], {n, 0.1}]] > > NMinimize[numFct[var], {var, 0, 6}] > > {-1.46365, {var -> 4.71239}} > > 5) Finding a root for (Sin[x] + 1/2*Cos[x])/optvar is the same as finding > a root for Sin[x] + 1/2*Cos[x]: > > Clear[numFct] > numFct[optvar_?NumericQ] := > Module[{inteq, n, x}, inteq[x_] = Sin[x] + 1/2*Cos[x]; > Sin[optvar] + n /. FindRoot[inteq[n], {n, 0.1}]] > > NMinimize[numFct[var], {var, 0, 6}] > > {-1.46365, {var -> 4.71239}} > > 6) Don't define functions you don't need: > > Clear[numFct] > numFct[optvar_?NumericQ] := Module[{x}, > Sin[optvar] + x /. FindRoot[Sin[x] + Cos[x]/2, {x, 0.1}]] > NMinimize[numFct[var], {var, 0, 6}] > > {-1.46365, {var -> 4.71239}} > > 7) Optimization and root-finding are uncoupled in this case, so: > > Clear[numFct] > numFct[optvar_?NumericQ] := Sin[optvar] + Module[{x}, > x /. FindRoot[Sin[x] + Cos[x]/2, {x, 0.1}]] > NMinimize[numFct[var], {var, 0, 6}] > > {-1.46365, {var -> 4.71239}} > > or > > Clear[numFct, x, y] > numFct[x_?NumericQ] = Sin[x] + > y /. FindRoot[Sin[y] + Cos[y]/2, {y, 0.1}]; > NMinimize[numFct[x], {x, 0, 6}] > > {-1.46365, {x -> 4.71239}} > > or even simpler: > > Clear[x] > NMinimize[Sin[x], {x, 0, 6}] > First@% + x /. FindRoot[Sin[x] + Cos[x]/2, {x, 0.1}] > > {-1., {x -> 4.71239}} > > -1.46365 > > Bobby > > On Sat, 10 Dec 2011 06:27:05 -0600, 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}] >> >> > > > -- > DrMajorBob at yahoo.com >
- Follow-Ups:
- Re: NMinimize problem: fct minimized uses FindRoot
- From: Andrzej Kozlowski <akoz@mimuw.edu.pl>
- Re: NMinimize problem: fct minimized uses FindRoot
- References:
- NMinimize problem: fct minimized uses FindRoot
- From: "Doug Tinkham" <dtinkham@live.ca>
- NMinimize problem: fct minimized uses FindRoot