Octave 如何使用求积或任何其他方法找到倍频程中由点包围的面积

Octave 如何使用求积或任何其他方法找到倍频程中由点包围的面积,octave,area,points,Octave,Area,Points,我有两组坐标(正值和负值,不一定按递增顺序,在许多情况下,对于相同的x值,y值不同),我可以将它们加载到两个大小相等的行向量中 我想计算曲线包围的面积。 如何使用八度音阶 我尝试了这个方法,但它不起作用,因为打印的区域(204.64)似乎太高(见图) 我试过密码: [uni, ~] = sort(unique(x)); n = rows(uni); outline = []; for i = 1:n y_list = y(x==uni(i)); [y_max, ~] = max(y_li

我有两组坐标(正值和负值,不一定按递增顺序,在许多情况下,对于相同的x值,y值不同),我可以将它们加载到两个大小相等的行向量中

我想计算曲线包围的面积。 如何使用八度音阶

我尝试了这个方法,但它不起作用,因为打印的区域(204.64)似乎太高(见图)

我试过密码:

[uni, ~] = sort(unique(x));
n = rows(uni);
outline = [];
for i = 1:n
  y_list = y(x==uni(i));
  [y_max, ~] = max(y_list);
  outline(i, :)= [uni(i), y_max];
  [y_min, ~] = min(y_list);
  outline(2*n-i+1,:)= [uni(i), y_min];
endfor
figure;
plot (x(k), y(k), "r-", x, y, "b+", outline(:,1), outline(:,2), "g-", "linewidth", 3);
polyarea(outline(:,1), outline(:,2)) #74.856
函数showdata(fName)
M=dlmread(fName);
H=M(2:结束,1);%起始行号为2
B=M(2:结束,2);
aux=图();
绘图(H,B,'线宽',2);
xlabel(“辅助字段H(A/m)”;
伊拉贝尔(“磁场B(特斯拉)”;
面积=多面积(H,B)
轴([最小(H)、最大(H)、最小(B)、最大(B)];
网格化;
小网格打开;
标题(面积,“字体大小”,20);
然后我用八度音阶调用
showdata('data.txt')
。 数据点图片:


是我正在使用的数据文件。

有一个计算凸包的函数,称为“倍频程”。它返回形成凸包数据的点的索引

M = dlmread("data.txt"); #I removed the header in data.txt 
x = M(:,1);
y = M(:,2);
k = convhull(x,y);
plot (x(k), y(k), "r-", x, y, "b+");
n = rows(k);
x_prime = vertcat(x(k(n)), x(k(1:n-1)));
y_prime = vertcat(y(k(n)), y(k(1:n-1)));
A = .5*abs(x_prime'*y(k)-y_prime'*x(k)); #80.248
polyarea(x(k), y(k)) == A and true
也许凸包不是很好的面积估计,因为左上角和右下角的线离点有点远。还有其他方法可以从数据中形成多边形
,其中一个可能是alpha形状。然而,阿尔法形状更为复杂,在倍频程中没有相应的预建函数

更新: 每个x对应于至少一个y-堇青石。我在同一个x上标出了最高点和最低点,并再次估算了面积。 代码如下:

[uni, ~] = sort(unique(x));
n = rows(uni);
outline = [];
for i = 1:n
  y_list = y(x==uni(i));
  [y_max, ~] = max(y_list);
  outline(i, :)= [uni(i), y_max];
  [y_min, ~] = min(y_list);
  outline(2*n-i+1,:)= [uni(i), y_min];
endfor
figure;
plot (x(k), y(k), "r-", x, y, "b+", outline(:,1), outline(:,2), "g-", "linewidth", 3);
polyarea(outline(:,1), outline(:,2)) #74.856
顺便说一下,如果函数polyarea的参数没有形成闭合曲线,那么函数polyarea将返回错误的区域。 单位正方形上的四点: [(0,0),(1,0),(1,1),(0,1)],[(0,0),(1,1),(1,0),(0,1)]


polyarea([0,1,1,0],[0,0,1,1])==polyarea([0,1,1,0],[0,1,0,1])

能否请您提供包含所显示数据的文件,以便重现您的结果?@HansHirse DoneI打赌数据会经历许多周期,而不仅仅是一个周期。因此,您没有(简单的、不相交的)多边形。计算的值为
N*area
,记录的循环数为
N
。使用getframe和imfill是可行的解决方案吗?;-)@安迪:事实证明,正如克里斯·林戈所预测的那样,有多个周期,我只手动选择了一个周期。如果您有其他解决方案,当然可以提供答案。我不知道如何使用getframe和内嵌。