/* Rational Bezier Curve eliminating some points */ /* Data from Holton(2003)"Value-at-Risk" */ new; cls; let data[10,2]= 1.1 2.14 1.4 2.60 2.5 1.15 2.7 1.19 3.2 1.88 3.6 1.55 4.1 2.65 4.3 3.80 4.5 4.46 4.9 6.35 ; x=data[.,1]; y=data[.,2]; w=ones(rows(x),1); /* n x 1 weight vector */ allpoints=100; /* # of all points between min(x) and max(x) */ eliminate={1,2}; call rbeziercurve1(y,x,w,allpoints,eliminate); proc rbeziercurve1(y,x,w,allpoints,eliminate); local z,n,xi,yi,t,i,sumw,xall,yall,eindex; t=seqa(0,1,allpoints)/(allpoints-1); t[allpoints]=1; /* sort them out in terms of x */ z=x~y~w; z=sortc(z,1); x=z[.,1]; y=z[.,2]; w=z[.,3]; /* elimination */ if maxc(eliminate)>rows(x); errorlog "ERROR: Out of range."; retp("."); elseif eliminate==0 or eliminate==zeros(rows(eliminate),1); errorlog "No elimination:"; xall=x; yall=y; else; xall=x; yall=y; eindex=zeros(rows(x),1); eindex[eliminate]=ones(rows(eliminate),1); x=delif(x,eindex); y=delif(y,eindex); w=delif(w,eindex); endif; /* main */ n=rows(x); n=n-1; yi=0; xi=0; sumw=0; i=0; do while i<=n; yi=yi+nCr(n,i)*(1-t)^(n-i).*t^i*y[i+1]*w[i+1]; xi=xi+nCr(n,i)*(1-t)^(n-i).*t^i*x[i+1]*w[i+1]; sumw=sumw+nCr(n,i)*(1-t)^(n-i).*t^i*w[i+1]; i=i+1; endo; yi=yi./sumw; xi=xi./sumw; /* graph */ library pgraph; graphset; pqgwin auto; begwind; window(1,1,0); scale(-0.05*(maxc(xall)-minc(xall))+minc(xall)|maxc(xall)+0.05*(maxc(xall)-minc(xall)),-0.25*(maxc(yall)-minc(yall))+minc(yall)|maxc(yall)+0.25*(maxc(yall)-minc(yall))); setwind(1); title("Rational Bezier Curve"); xy(xi,yi); setwind(1); _plctrl=-1; _pcolor=15; _psymsiz=1; xy(xall,yall); endwind; retp(xi~yi); endp; proc(2)=bezier(y,x,t); local z,n,yi,xi,i; /* sort them out in terms of x */ z=x~y; z=sortc(z,1); x=z[.,1]; y=z[.,2]; n=rows(x); /* main */ n=n-1; yi=0; xi=0; i=0; do while i<=n; yi=yi+nCr(n,i)*(1-t)^(n-i).*t^i*y[i+1]; xi=xi+nCr(n,i)*(1-t)^(n-i).*t^i*x[i+1]; i=i+1; endo; retp(yi,xi); endp; proc nCr(n,r); if r==0 or n==r; retp(1); endif; retp( exp(sumc(ln(seqa(n,-1,n)))-sumc(ln(seqa(r,-1,r)))-sumc(ln(seqa(n-r,-1,n-r)))) ); endp;