【问题标题】:Integration returning required y value for predefined area积分返回预定义区域所需的 y 值
【发布时间】:2019-08-21 05:20:39
【问题描述】:

鉴于以下情况:

  • x(时间 [s])和 y(此处排放 [m³/s])的时间序列

  • V1(相同单位积分y),小于所有x 的积分。在这种情况下,体积很小 [m³]。

我要计算:

  • yy_V1 使得线 y = y_V1 和曲线 y 之间的积分等于 V1

    下图显示了这一点,橙色区域是V1,我想要y轴上的圆圈值:

  • V1 必须放在峰顶周围。

我认为这必须是一个迭代过程,其中还必须由用户设置拟合标准(和精确度)。

到目前为止,我还没有找到开始的方法;除了纯粹的整合。

这个想法是指定一个区域。应计算包围该区域的峰的左右 y 值。


编辑

如果应用了接受的答案,这就是结果。

【问题讨论】:

    标签: matlab integration area


    【解决方案1】:

    您可以通过减少一些y 值来做到这一点,直到达到您的区域目标。有关详细信息,请参阅下面的 cmets。

    % Input data
    x = 0:0.01:pi;
    y = sin(x);
    
    target = 1;     % Target area
    
    yi = max( y );  % Initialise yi to be max possible y
    dy = 0.001;     % Step change in yi
    
    Ai = 0;         % Area each iteration
    thresh = 0;     % Threshold for stopping loop
    while target - Ai > thresh && yi >= min(y)
        yi = yi - dy;
        ix = y >= yi;
        % Approximate integral above the line
        Ai = trapz( x(ix), y(ix) - yi ); 
    end
    
    % Plot
    figure(1); clf; hold on
    plot( x, y );
    patch( x(ix), y(ix), [1,0.5,0.5], 'facealpha', 0.5 );
    plot( x, ones(size(x))*yi, '--', 'linewidth', 2 )
    xlim( [min(x),max(x)] )
    

    输出:

    【讨论】:

    • 太棒了!伟大的!伟大的!它可以完成这项工作,并且通过您的 cmets,我了解其结构。现在我可以根据我的具体需求进一步开发它。对于我的数据的结果,请检查已编辑的问题。
    • 不清楚的是:ix = y >= yi;这里发生了什么?很酷,结果是合乎逻辑的,但这是怎么来的?
    • @Ferdi ix 只是一个数组,大小与y 相同,当条件y>=yi 为真时为真。这里yi 是当前最小y 值的标量。然后我们可以使用ix 作为我们感兴趣的区域的逻辑索引数组。也许更清楚(但等效)的是ix = (y>=yi)
    • 如果有多个峰值,如何避免错误的插值?我对最大的感兴趣,所以说我只需要ix 中的第一块真值。我正在寻找到ix = y>=yi 的出口。只要ix 与之前的真实情况不同,我就想停下来。提前致谢
    • @Ferdi 你可以寻找[0, diff(ix)] < 1,那是它从真到假的时候。如果您需要更多帮助,请尝试发送minimal reproducible example 并提出新问题。
    猜你喜欢
    • 2014-07-19
    • 2011-04-16
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多