构建一个使用梯形规则计算积分("曲线下面积")的IML模块tr。模块应接受矢量x
和y
作为输入参数,并返回auc
的值。通过如下方式显示你的模块可以工作:
x = do(-2,5,0.01);
print "Integral of a over x is" ( tr(x,0#x+1) );
print "Integral of b over x is" ( tr(x,1#x) );
print "Integral of c over x is" ( tr(x,x##2) );
print "Integral of d over x is" ( tr(x,abs(x)) );
print "Integral of y over x is" ( tr(x,sin(x##2)) );
print "Integral of z over x is" ( tr(x,log(2+exp(x))) );
下面是我的代码:
proc iml;
start tr(x, y);
do i=1 to 2000;
auc = (sum(x[i]-(x[i-1]))#(y[i]+(y[i-1])))/2;
return (auc);
end;
finish;
当我尝试运行提供的验证码时,我得到下标无效或过期的错误消息。这意味着什么,我如何修复我的代码,使其工作?
x只有一行,通过添加'。
这里有几个问题。首先,如果参数作为矢量传递,则不需要在模块中进行循环。其次,您从1索引i
,但您使用i-1
,当i
=1时,其值为0。这会导致一个下标错误,因为IML向量是从1开始索引的,而不是像c中的0。当x
和y
的长度大于2000时,你也会得到一个下标错误,因为你引用的向量的元素不存在。
这是一种获取所需信息的简洁方式:
proc iml;
start tr(x, y);
i = 2:ncol(x);
return( (x[i] - x[i-1])` * (y[i] + y[i-1]) / 2 );
finish;
<verification code goes here>
quit;
这是这个问题的重复,但是在这个帖子中没有对这个问题的支持或接受的答案,所以我无法将其标记为重复。甚至是在同一天发布的
还有,这闻起来像家庭作业。如果是家庭作业,请在帖子中注明。