代码:
%macro search(w0by,delby,sigby,sig1,sig2,need);
data ;
do w0 =0 to 80 by &w0by;
do delta10 =15 to 30 by &delby;
re: do sigma10 =&sig1 to &sig2 by &sigby;
*循环体;
if abs(nc)<&need then do;
/* put w0= delta10= sigma10= nc=;*/
leave; *本段用于结束最内层循环;
end;
if nc<0 then do;
put w0= delta10= sigma10= nc=;
call symputx("sig1",sigma10-&sigby);
call symputx("sig2",sigma10);
call symputx("sigby",&need);
go to re; *本段
试图修改内层循环的约束条件,并重做内层循环;
end;
end;
end;
end;
run;
%mend;
%search(10,5,10,50,150,0.1);
问各位老师一个问题,代码如上,描述如下:
我想做最内层的循环迭代,从而得出最优结果,我试图利用宏变量去修改最内层循环的约束条件,但是失败了,似乎do循环不允许这样修改;请问我的这种思路可行吗?
另外,我干脆把改成宏do循环如下,但是中间有个squt要出问题:
%macro search(w0by,delby,sigby,sig1,sig2,need);
%let w0=0;%let delta10=15;%let sigma10=&sig1;
%do %until(&w0=80);
%do %until(&delta10=30);
%re:%do %until(&sigma10=&sig2);
data a;
w=&w0/100;wp=1-w;delta1=&delta10/100;sigma1=&sigma10/100;
*%do循环体; *循环体中的sqrt方法报错,方法中的所有值都是未缺失的,方法得出的结果缺失;
call symputx("w0",w0); *这几句试图提取关键变量结果至宏变量;
call symputx("delta10",delta10);
call symputx("sigma10",sigma10);
call symputx("nc",nc);%put %sysfunc(abs(%sysevalf(&nc)));
%if %sysfunc(abs(%sysevalf(&nc)))<&need %then %do;
%put w0=&w0 delta10=&delta10 sigma10=&sigma10 nc=&nc;
/*leave;*/
%end; *未做好的结束条件;
%if &nc<0 %then %do;
%put w0=&w0 delta10=&delta10 sigma10=&sigma10 nc=&nc;
%let sig1=%sysevalf(&sigma10-&sigby);
%let sig2=&sigma10;
%let sigby=&need;
%goto re; *本段试图修改%do的约束条件;
%end;
%let sigma10=%sysevalf(&sigma10+&sigby);%end;
%let delta10=%sysevalf(&delta10+&delby);%end;
%let w0=%sysevalf(&w0+&w0by);%end;
run;
%mend;
%search(10,5,10,50,150,0.1);
请求帮助,谢谢啊。