BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
jan_t_lagen
Calcite | Level 5

Hi,

 

I posted a question about this earlier but it was poorly written so i thought i'd try again and hopefully be more clear. 

 

I'm trying to solve a nested optimization problem where I first find the optimal x based on y and then y is "updated" based on this x. I'm using the froot function which as i understand it can take in parameters and global variables. Since this y is constantly changing i'm not sure it should be a global variable but it shouldn't be changed when finding x either.

 

Maybe this is a simple syntax question, what I want is something like this (just example functions):

 

start f1(x) global(a,b,y);
   return(a*y-b##x);
finish;

 

start f2(y);
bounds = {0,10000};
   return( froot( "f1", bounds) );
finish;

 

start f3(y) global(a,b);
return(f2(y)*a-y##2);
finish;

 

y0 = 1;
opt = {1,2};
call nlpnra(rc, result, "f3", y0, opt);

 

in function f1 the current value of y needs to be known but is should not be changed (so its not a parameter in froot?). Should f2 somehow declare y as a global variable, if so how is that done?

1 ACCEPTED SOLUTION

Accepted Solutions
Rick_SAS
SAS Super FREQ

As I indicated last time you wrote, the best way to unravel these situations is to evaluate the objective function on a grid to make sure it is doing what you expect. You should also ensure that the various functions correctly handle out-of-domain errors (such as log(x) when x<=0). If there are domain issues, you need to add boundary constraints for your objective function.

 

The following statements plot the objective function. The objective function appears to maximize as x -> 0 from the right, but it is undefined for x <= 0, so that need to be added to the optimization.

 

proc iml;
start f1(x) global(a,b,y);
   return(a*y-b##x);
finish;

start f2(x);
   bounds = {0,1000};
   return( froot( "f1", bounds) );
finish;

start f3(y) global(a,b);
   z = f2(y);
   return(z*a-y##2);
finish;

a=2; b=0.5;
y = do(0.05, 2, 0.05);
f = j(1, ncol(y), .);
do i = 1 to ncol(y);
   f[i] = f3(y[i]);
end;
print (f[1:5]);
call series(y, f);

y0 = 1;
opt = {1,2};
blc = {1e-6,    /* 1e-6 <= y < infinity */
       .};        
call nlpnra(rc, result, "f3", y0, opt) blc=blc;

Using your notation, I suggest the following:

1. You've set f1 to be a function of x, with a, b, y as parameters. That means that f2 is also a function of x, with a,b, and y as parameters.

2. It sounds like you want to optimize over the parameter y where a and b are fixed.

3. As I mentioned last time, I've written about similar examples. Since you didn't like my previous suggestions, try this one: "Optimizing a function that evaluates an integral"

View solution in original post

2 REPLIES 2
Rick_SAS
SAS Super FREQ

As I indicated last time you wrote, the best way to unravel these situations is to evaluate the objective function on a grid to make sure it is doing what you expect. You should also ensure that the various functions correctly handle out-of-domain errors (such as log(x) when x<=0). If there are domain issues, you need to add boundary constraints for your objective function.

 

The following statements plot the objective function. The objective function appears to maximize as x -> 0 from the right, but it is undefined for x <= 0, so that need to be added to the optimization.

 

proc iml;
start f1(x) global(a,b,y);
   return(a*y-b##x);
finish;

start f2(x);
   bounds = {0,1000};
   return( froot( "f1", bounds) );
finish;

start f3(y) global(a,b);
   z = f2(y);
   return(z*a-y##2);
finish;

a=2; b=0.5;
y = do(0.05, 2, 0.05);
f = j(1, ncol(y), .);
do i = 1 to ncol(y);
   f[i] = f3(y[i]);
end;
print (f[1:5]);
call series(y, f);

y0 = 1;
opt = {1,2};
blc = {1e-6,    /* 1e-6 <= y < infinity */
       .};        
call nlpnra(rc, result, "f3", y0, opt) blc=blc;

Using your notation, I suggest the following:

1. You've set f1 to be a function of x, with a, b, y as parameters. That means that f2 is also a function of x, with a,b, and y as parameters.

2. It sounds like you want to optimize over the parameter y where a and b are fixed.

3. As I mentioned last time, I've written about similar examples. Since you didn't like my previous suggestions, try this one: "Optimizing a function that evaluates an integral"

jan_t_lagen
Calcite | Level 5

 

Thank you for the fast replay as always! I'll try your suggestion and if I can't get it to work look though the material you linked. 

 

I don't think the problem lies with the objection function or constraints, bounds etc. Since i'm able to use froot  successfully when it is not in a function. I.e. I'm able to do the initial step of optimization if i'm not using nested functions like in the example. Perhaps it was even more confusing to use "example" functions. What I was trying to convey was that I'm 99% sure that the problem lies with my understanding of the functions and not the underlying math.

 

 

 

 

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

Register Now

From The DO Loop
Want more? Visit our blog for more articles like these.
Discussion stats
  • 2 replies
  • 1197 views
  • 0 likes
  • 2 in conversation