Dear all;
I am running a proc iml program where i am minimizing a numerical integration. I have asked many questions concerning this program till I reached the current program.
1-My program now gives parameter estimates at the "optimization results" stage that satisfy the constraint(with a minor violation) but on the otherhand, these parameter estimates should give me another objective value than that displayed in the output (i.e.: when i substitute with the optimal parameter estimates in the objective function i don't get the displayed objective value) . I noticed that the objective value i got at the "optimization results" stage is the same objective value i got at the "optimization start" stage although the parameter estimates at the "optimization results" stage are different from the initial values i set for the parameters.
2-I noticed that even when i changed the minimization problem to maximization problem the objective value i got at the "optimization results" stage is the same as when the problem is a minimization problem. The value is exactly the same as that in the "optimization start" stage.
What might be the reason behind this?
I really need help,
The output file is attached,
Thanks
Emara
I now see what your problem was. You defined FUNI using the variable hr as the parameter. IML was then treating hr inside FUN1 as a local, not a global parameter. When FUN is called from FUNI it uses the global value of hr in its calculations, and that wasn't being changed. I think what you really meant to do was define FUNI as:
start FUNI(hrx) global( hr);
hr = hrx;
<rest of your funtion as-is>
When I tried this I got objective values that were self-consistent and seemed reasonable.
Coudl you attach your latest program that produced these results?
Thank you,
The program is attached,
From playing around with your problem, it appears that your objective function is "broad" compared to your non-linear constraint. When I plug the computed optimal parameters into your objective function FUNI I do get the same value as the displayed objective value. I tried just maximizing your non-linear constraint, and after looking at the iteration history it appears that your non-linear constraint is >0 for only a small distance around (3.09, 0.92), and your objective function remains nearly constant inside the feasible area. That also explains why the max and min are the same within numerical precision, because your objective value does not change significantly within the feasible area.
Thanks alot for your reply, but could you please explain more? I run my syntax again, the optimal parameters I got are {3.087771, 0.731934}, when i substituted with these values in the objective function module, I got the value "136.461", although the displayed optimal objective value of my program is "2827.940918". However, when i substitute with the initial values {4 0.8}in the objective function module i got the value ""2827.940918".What is wrong with my program , I can't figure out the errors and I really need help with this syntax.
This is the output of my program:
Optimization Start
Parameter Estimates
Lower Upper
Bound Bound
N Parameter Estimate Constraint Constraint
1 X1 4.000000 0 10.000000
2 X2 0.800000 0 1.000000
Value of Objective Function = 2827.940918
Optimization Results
Parameter Estimates
N Parameter Estimate
1 X1 3.087771
2 X2 0.731934
Value of Objective Function = 2827.940918
and here is the output when substituting with the optimal parameter estimates in the objective function module:
K
136.461
I attached the syntax of the objective function module(the syntax in which i substituted with the optimal parameter estimates in the objective function)
Thanks too much,
Waiting for your reply and help,
Emara
I now see what your problem was. You defined FUNI using the variable hr as the parameter. IML was then treating hr inside FUN1 as a local, not a global parameter. When FUN is called from FUNI it uses the global value of hr in its calculations, and that wasn't being changed. I think what you really meant to do was define FUNI as:
start FUNI(hrx) global( hr);
hr = hrx;
<rest of your funtion as-is>
When I tried this I got objective values that were self-consistent and seemed reasonable.
Yes, it is working thank you sooooooooooooooo much. Could you explain more what is the differnce between local and global parameters and when to use each?
You can look at the IML doc on this at SAS/IML(R) 12.1 User's Guide to get the full explanation on how to specify global and local variables. Basically, local variables are used inside a module when you want to encapsulate those calculations so that you know what the inputs and outputs are and don't want to affect any other variables outside that module. Global variables exist above the scope of the module, and can be accessed inside a module if its definition doesn't have any parameters, or if they are specified explicitly with a global clause, such as
start foo; /* all variables inside foo are global */
or
start foo(a,b) global(m); /*a and b and any other variables inside foo are local, except that m is global */
Global parameter are useful for common data that may be used across several modules, but should be used with care. It is easy to introduce obscure errors in your program by accidentally modifying a global parameter that is normally assumed to be constant.
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!
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.