【问题标题】:Produce integration array as a function of integration limit in MATLAB [duplicate]在MATLAB中将积分数组作为积分限制的函数[重复]
【发布时间】:2016-05-20 03:29:00
【问题描述】:

我正在尝试使用函数integral 来返回积分点数组

我定义了一个函数:

v = @(t) cos(t);

我想找到集成函数 x(t) 用于存储在 tvec 中的几个这样的值:

tvec = linspace(0,10,1000);    
x = @(tf) integral(@(t) v(t),0,tf,'ArrayValued',true);

但似乎Matlab不允许数组值位作为积分的限制,因为x(tvec)会导致错误。有什么建议吗?

【问题讨论】:

    标签: arrays matlab integral


    【解决方案1】:

    注意:a duplicate question 的解决方案比这个更有效。

    问题是integral 只接受标量限制。在您的示例中,被积函数是标量值,因此您应该省略 'ArrayValued' 设置:这将允许 MATLAB 对每个上限的积分进行矢量化。

    您可以使用arrayfun 将每个上限提供给integrate。另外,你可以只传递v,一个函数句柄到integral,不需要在本地为它重新定义一个匿名函数:

    v = @(t) cos(t);
    x = @(tf) arrayfun(@(tmax) integral(v,0,tmax),tf);
    
    tvec = linspace(0,10,1000);    
    sinvec = x(tvec);
    

    它似乎有效:

    figure;
    plot(tvec,sin(tvec),'s-',tvec,sinvec,'o-');
    legend('sin(tvec)','sinvec')
    

    【讨论】:

    • @Troy 毫无疑问:D 认为我们应该投票给骗子?要么,要么你应该在这里添加一个类似的答案。
    • 当我看到你的回答时,我正在考虑这个问题。问题不同,但期望的结果是相同的......这是一个骗子还是两个问题都有优点(即,我认为这个问题比我链接到的问题更好)?
    • 是的,这个问题比较独立,但是另一个问题以“I am trying to integrate the sine-function. My goal is to get not just the value of the area inbetween a certain distance but the specific values of the integrated course.”开头。这正是我们的 OP 想要的,只有cos。所以我认为这可能是一个有效的骗局,对于更大的问题,您的解决方案应该快得多。后者让我说要么我们应该投票给欺骗(在这种情况下,读者会被重定向到你的答案),或者你应该在这里添加一个具体的答案。
    • @TroyHaskin 我最初担心特洛伊的解决方案(在欺骗问题中)会在几个小积分的边界处累积误差。我确认这些解决方案在浮点精度内是相同的(并且 Troy 的要快得多!)对于几个 dX 增量大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2021-02-21
    • 2020-12-25
    相关资源
    最近更新 更多