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.

 

 

 

 

sas-innovate-2024.png

Join us for SAS Innovate April 16-19 at the Aria in Las Vegas. Bring the team and save big with our group pricing for a limited time only.

Pre-conference courses and tutorials are filling up fast and are always a sellout. Register today to reserve your seat.

 

Register now!

Multiple Linear Regression in SAS

Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.

Find more tutorials on the SAS Users YouTube channel.

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