构建一个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;
当我尝试运行提供的验证码时,我收到下标无效或过期的错误消息。这是什么意思,我如何修复我的代码以使其有效?
答案 0 :(得分:0)
x只有一行,通过添加`。
转置你的x答案 1 :(得分:0)
这里有几个问题。首先,如果参数作为向量传递,则不需要在模块的旁边进行循环。其次,您将i
从1编入索引,但使用i-1
,i
= 1时评估为0。这会导致下标错误,因为IML向量从1开始索引,而不是像C一样索引。当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;
这是this question的副本,但在此帖子中没有对该问题的投票或接受答案,因此我无法将其标记为重复。它甚至在同一天发布。
此外,这闻起来像家庭作业。如果是家庭作业,请在帖子中提及。