线段与曲线之间的面积(无函数)

3

我想计算橙线和蓝线之间的面积。我已经成功地将该区域标记出来,但我不知道如何使用trapz函数来获取面积。在这篇文章中:两条曲线之间表面下的面积 我找到了一些解决方案,但我没有具体的曲线方程,只有图形本身。

橙线的代码如下:

x_1 = [0,M1_1];
y_1 = [c1,c1];
v = plot(x_1,y_1,'LineWidth',2)

蓝色曲线是一个数组的绘图,横坐标为(10000x1)长度,纵坐标为(1x10000)长度。

如果我使用

%c0_1: Intersection blue curve with y-axis
%c1_1: Intersection orange curve with y-axis
A = trapz(ab1(0:c1_1),ab_y1(c1_1:c0_1))

我遇到了以下错误:
警告:当用作索引时,冒号运算符需要整数操作数 警告:当用作索引时,冒号运算符需要整数操作数 错误使用trapz(第58行):X的长度必须等于Y在dim 2中的长度。
如何在我的问题上轻松应用trapz函数?

enter image description here


2
可能是两条曲线之间曲面下的面积的重复问题。 - Matt
是的,我修改了图表以便更好地理解我的问题。如果我修改旧问题,人们会看到吗? - MatlabNewb
是的,人们可以看到它,因为它会将问题推到主页上活跃列表的顶部。请参阅元帖和页面中的[帮助],其中写道:“*编辑一个帖子也会将问题推到主页的顶部。[...]”。请注意,不鼓励重复提问同一个问题,而且通常不会受到社区的欢迎。 - Matt
2
谢谢 @Matt 的提示!对此感到抱歉。将记住这一点,以备将来提问之用。 - MatlabNewb
如果蓝线在x->0时渐近,则除非你也从顶部限制它,否则将得到面积=无穷大。 - EBH
嗨 @EBH,它是有界的,但您看不到它。事实上,在我的工作区中,我已经找到了蓝色曲线与 y 轴的交点,所以这很好:-) 有什么提示吗? - MatlabNewb
1个回答

1
这里有一个答案,虽然我不确定这里和这里的情况有什么区别,因此我不确定它是否真正回答了你的问题...无论如何,你不需要明确知道y1函数,只需要拥有它的一系列数据。
x = 0:0.1:12;       % x data
y1 = 3*exp(-0.5*x); % y data
y2 = 0.5;
lineStart = find(x>=0,1);
lineEnd = find(y1<=y2,1);
f = plot(x,y1,'b',x,ones(1,length(x))*y2,'r','LineWidth',2);
ylim([0 4])
hold on
area(x(lineStart:lineEnd),y1(lineStart:lineEnd), y2,...
    'EdgeColor', 'none', 'FaceColor', [0.5 0.5 1],'ShowBaseLine','off')
hold off
A = trapz(x(lineStart:lineEnd),y1(lineStart:lineEnd));

我也添加了集成区域的插图: 在y1和y2之间进行积分 告诉我这是否解决了问题;)

非常感谢!我看到我没有正确设置交集的条件!现在非常明显,特别感谢你的代码!非常感激,伙计! :) - MatlabNewb
1
您的y轴单位,因为您在x轴上进行了积分。 - EBH
最后一个问题。我尝试使用相同的函数但只是转换了一下。https://s31.postimg.org/mc3ym1omz/Zwischenablage01.jpg 但是在工作区中,我得到了一个错误或者更好地说,StartLine和EndLine都是1。你知道我可能犯了什么错误吗?非常感谢您的帮助! - MatlabNewb
代码 lineEnd = find(y1<=y2,1) 假设 y1y2 上方,因此它正在查找它们的第一个交点。如果 y2 已经在 y1 上方,则结果为 lineEnd = 1,要集成的长度为 0 - 这就是为什么会出现错误的原因。 - EBH
谢谢你讲得清楚。我试图修改这些行,使得lineStart = find(x<=100,1);(因为在我的情况下100是最大的x值)和lineEnd = find(y1>=y2,1); 我认为这就是错误所在。但逻辑上,我只是告诉Matlab找到y1大于y2的位置。但不幸的是它不起作用。有什么想法吗?谢谢! - MatlabNewb
@MatlabNewb,这变得太混乱了,我发现很难理解你的最终目标。我建议你编辑你的问题或者写一个新的问题,以更一般的方式满足你的需求(例如,你有多个函数),然后就可以编写一个脚本来执行你需要的操作。具体到你所写的内容,我认为你交换了lineStartlineEnd - EBH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接