Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab曲线下的局部面积_Matlab_Integral - Fatal编程技术网

Matlab曲线下的局部面积

Matlab曲线下的局部面积,matlab,integral,Matlab,Integral,我想在x轴上绘制特定值上方和下方的区域 我面临的问题是离散值。例如,下面的代码有一个显式的X=10,因此我编写它的方式是,我可以找到索引并计算该特定值上方和下方的值,但是如果我想找到4上方和下方曲线下的面积,这个程序现在可以工作了 虽然在绘图中,matlab进行了样条拟合(或连接离散值的某种拟合),但有一个y值对应于matlab计算的x=4,我似乎无法存储或访问它 %Example for Area under the curve and partial area under the curve

我想在x轴上绘制特定值上方和下方的区域

我面临的问题是离散值。例如,下面的代码有一个显式的X=10,因此我编写它的方式是,我可以找到索引并计算该特定值上方和下方的值,但是如果我想找到4上方和下方曲线下的面积,这个程序现在可以工作了

虽然在绘图中,matlab进行了样条拟合(或连接离散值的某种拟合),但有一个y值对应于matlab计算的x=4,我似乎无法存储或访问它

%Example for Area under the curve and partial area under the curve using Trapezoidal rule of integration
clc;
close all;
clear all;
x=[0,5,10,15,20];% domain
y=[0,25,50,25,0];% Values

LP=log2(y);
plot(x,y);

full = trapz(x,y);% plot of the total area

I=find(x==10);% in our case will be the distance value up to which we want 
half = trapz(x(1:I),y(1:I));%Plot of the partial area

对于ie x=2或3或4或6或7或…,我们如何找到曲线下的面积?我认为您需要更多的样本,或者对数据进行插值。另一种选择是使用函数句柄。然后你需要知道函数。下面是使用线性插值的示例

x0 = [0;5;10;15;20];
y0 = [0,25,50,25,0];
x1 = 0:20;
y1 = interp1(x0,y0,x1,'linear');
xMax = 4;
partInt = trapz(x1(x1<=xMax),y1(x1<=xMax));
x0=[0;5;10;15;20];
y0=[0,25,50,25,0];
x1=0:20;
y1=interp1(x0,y0,x1,'线性');
xMax=4;

partInt=trapz(x1(x1这是对patrik评论“先插值,然后积分”的详细阐述

为了回答这个问题,我将假设所讨论的区域是可以在绘图中看到的区域,并且由于
plot
通过直线连接点,我假设线性插值就足够了。此外,由于梯形规则本身是基于线性插值的,我们只需要在开始时使用插值ng和间隔结束

从给定的点开始

x = [0, 5, 10, 15, 20];
y = [0, 25, 50, 25, 0];
和积分间隔限制,比如说

xa = 4;
xb = 20;
我们首先选择限制范围内的数据点

ind = (x > xa) & (x < xb);
xw = x(ind);
yw = y(ind);
现在我们可以简单地应用梯形积分:

area = trapz(xw, yw);

我必须承认,我不知道你在这个问题上的意思。我所知道的matlab只是在
绘图
中的点之间画了一条直线。关于
陷阱
中发生的事情,我真的不记得了,但如果我记得正确的话,它只是2点梯形方法。不过,这是可以检查的,因为
trapz
是用matlab写的。简单地说,如果我想计算曲线下的面积,从X=0到X=4,然后从X=4到X=20。怎么做。这取决于你的志向。你想使用线性插值吗?一般来说,我会说你先插值,然后积分。我问的原因是没有对于这个问题,“我该如何做”。问题相当于“我该如何足够准确地计算它?”。由于您拥有的数据确实不准确,因此准确度要求在这里至关重要。您的样本之间的值未知,我要问的是,“我该如何做才能得到准确的估计?”?"只有一个人知道这一点,那就是你。对我来说,这只是密度太低的样本,任何人都无法进行正确的估计。谢谢。现在我明白你的意思了。我拥有的原始数据集的采样密度也很低。插值和积分对于我的情况来说已经足够好了。谢谢你的建议。谢谢对于您的回答,插值是一个相当便宜的操作。我将发布一个建议,不关心数据是否为金字塔形。@patrik,您的解决方案将给出与我相同的结果,无论数据的形状如何。正如我所写的,
trapz
隐式地进行线性插值。如果使用d其他类型的插值。
area = trapz(xw, yw);