我在Matlab的trapz函数中得到了一个奇怪的结果。我有两个变量,zptest和omega,两者都是正数,3000x2x1数组。
当我绘制zptest vs omega(plot(zptest(:,1,1),omega(:,1,1))时,曲线显然是正的,并且在积分时应该给出正结果。事实并非如此,但是,如下图所示:
trapz(zptest(:,1,1),ω-(:,1,1))
ans =
-0.049999940237341
只是为了证明欧米茄和zptest都是正面的:
find(omega(:,1,1)< 0)
ans =
空矩阵:0乘1
find(zptest(:,1,1)< 0)
ans =
空矩阵:0乘1
我知道我没有给出我正在做的事情的任何背景,但这似乎是一个与上下文无关的问题。有谁知道发生了什么事?
答案 0 :(得分:6)
尝试按升序重新排序x(以及相应的y值):
x_order = x(end:-1:1); %fliplr
y_order = y(end:-1:1); %fliplr
trapz(x_order, y_order)
在trapz(x,y)
中,通过diff(x,1,1)应用x的微分,即[x(2:n,:) - x(1:n-1,:)].
如果你的x正在下降,这将给出负dx。它是积极的还是消极的并不重要。但是,在plot
中,曲线将显示为正定(您实际上看不到点的顺序,只是来自平面上两个向量的对)。
示例(比较以下内容):
x = [-1 -0.5 0]; y = 0.5-x;
figure; plot(x,y); hold on; plot(-x, y,'r')
trapz(x, y)
trapz(-x, y)
figure; plot(x, y); hold on; plot(fliplr(-x), fliplr(y),'r')
trapz(fliplr(-x), fliplr(y))
答案 1 :(得分:0)
这样想。如果限制被反转,则总是为正的函数的积分仍然是负的。因此我们知道
int(x^2,-1,1) = 2/3
但是
int(x^2,1,-1) = -2/3
显然x。^ 2总是一个正数,但这里的积分极限并没有增加,而是在减少。
如果对trapz的调用中的x_i不是递增顺序,那么您将得到否定结果。 trapz反映了这一点。 Trapz看到了呈现给它的点的顺序。
x = -1:.1:1;
trapz(x,x.^2)
ans =
0.67
xrev = fliplr(x);
trapz(xrev,xrev.^2)
ans =
-0.67
而且,正如gevang指出的那样,情节只显示函数为正,而不是点的顺序。