如何正确约束这种最小化功能? mincvf(cvf1)应该相对于h最小化cvf1,我想设置为h> = 0.4
proc iml;
EDIT kirjasto.basfraaka var "open";
read all var "open" into cp;
p=cp[1:150];
conh={0.4 . .,. . .,. . .};
m=nrow(p);
m2=38;
pi=constant("pi");
e=constant("e");
start Kmod(x,h,pi,e);
k=1/(h#(2#pi)##(1/2))#e##(-x##2/(2#h##2));
return (k);
finish;
start mhatx2 (m2,newp,h,pi,e);
t5=j(m2,1); /*mhatx omit x=t*/
do x=1 to m2;
i=T(1:m2);
temp1=x-i;
ue=Kmod(temp1,h,pi,e)#newp[i];
le=Kmod(temp1,h,pi,e);
t5[x]=(sum(ue)-ue[x])/(sum(le)-le[x]);
end;
return (t5);
finish;
Start CVF1(h) global (newp,pi,e,m2);
cv3=j(m2,1);
cv3=1/m2#sum((newp-mhatx2(m2,newp,h,pi,e))##2);
return(cv3);
finish;
start mincvf(CVF1);
optn={0,0};
init=1;
call nlpqn(rc, res,"CVF1",init) blc="conh";
return (res);
finish;
start outer(p,m) global(newp);
wl=38; /*window length*/
m1=m-wl; /*last window begins at m-wl*/
newp=j(wl,1);
hyi=j(m1,1);
do x=1 to m1;
we=x+wl-1; /*window end*/
w=T(x:we); /*window*/
newp=p[w];
hyi[x]=mincvf(CVF1);
end;
return (hyi);
finish;
wl=38; /*window length*/
m1=m-wl; /*last window begins at m-wl*/
time=T(1:m1);
ttt=j(m1,1);
ttt=outer(p,m);
print time ttt p;
但是我得到了很多:
WARNING: Division by zero, result set to missing value.
count : number of occurrences is 2
operation : / at line 1622 column 22
operands : _TEM1003, _TEM1006
_TEM1003 1 row 1 col (numeric)
.
_TEM1006 1 row 1 col (numeric)
0
statement : ASSIGN at line 1622 column 1
traceback : module MHATX2 at line 1622 column 1
module CVF1 at line 1629 column 1
module MINCVF at line 1634 column 1
module OUTER at line 1651 column 1
当h接近0且" le" in" mhatx2"在值h = 0.4时,le是~0.08,所以我只是人为地选择了一个仍然足够精确的下界。
此"外部"的输出子程序,ttt是适合滚动窗口的h矢量,仍然提供低于约束0.4的值。为什么呢?
答案 0 :(得分:0)
我通过简单地将乘法变换应用于输入来解决精度问题的丢失...将其乘以10,000或其他任何必要的,然后在结束时恢复变换。
不确定它是否适用于您的情况,但可能值得一试。
答案 1 :(得分:0)
这种方式有效,必须将该选项并将向量约束到输入括号中:
现在我没有得到0分组的警告。现在没有指定先前错过指定的到期精度丢失点,并且该值被0.14代替,但错误可能不大。
启动mincvf(CVF1);
con = {0.14。 。,。 。 。,。 。 };
OPTN = {0,0};
INIT = 1;
调用nlpqn(rc,res," CVF1",init,optn,con);
return(res);
光洁度;