【问题标题】:Nested calls to integral and integral2 in MatlabMatlab中对integral和integral2的嵌套调用
【发布时间】:2015-03-12 17:23:02
【问题描述】:

我这里有一些代码说明了我想在 matlab 中执行的一些积分的嵌套性质。当我运行以下代码时,我得到了错误

Error using  .* 
Matrix dimensions must agree.

Error in fun1/integrand (line 7)
   f = x.^2.*t;

似乎我现在设置的方式不允许integral 函数的矢量化输出。我该怎么做才能让我的代码运行?我已经在下面评论了我想要这些功能做什么。

我的代码如下:

%主脚本:

z = linspace(0,10,10);
I = zeros(10,1);

for i = 1:10
    I(i) = fun2(z(i));
end

%函数 1 在单独的文件中:

function I = fun1(x)

I = integral(@integrand,-1,1);

   function f = integrand(t)
   f = x.^2.*t;
   end
end

%Function 2 在单独的文件中:

function I = fun2(z)

I = integral2(@integrand,-1,1,-1,1);

   function f = integrand(x,y)
       f = z.*fun1(x).*y;    // here fun1 should return the value for all x that is swept through by integral2 during its call.
   end
end

【问题讨论】:

  • 您的错误信息有问题。您只使用.*,因此您不会收到错误消息Error using * 。请确认您复制了正确的代码和错误消息。
  • 抱歉,已编辑。有一个小错误,但现在我所有的操作都应该是元素明智的。
  • 请再次检查。 “内部矩阵尺寸必须一致。”不是由.* 引起的异常
  • 对不起,你是对的,我没有复制整个错误信息。它应该和我现在在 matlab 提示符上看到的一样!
  • 我正在尝试了解您想要实现的内容。这是您尝试实施的公式吗? bit.ly/18B5itX 那么你应该使用integral3

标签: matlab nested


【解决方案1】:

您的代码的问题是您正在组合使用integral2integral1。这样integral2xy 生成一个网格,integral1 生成t 值。这样tx 的值在大小上不匹配,即使它们是不同网格的一部分。

如前所述,使用ingetral3 是正确的选择。或者,您可以简单地“修复”这个引入循环,但这会导致代码慢得多:

function I = fun1(x)
I=nan(size(x));
for ix=1:numel(x)
    I(ix) = integral(@(t)integrand(x(ix),t),-1,1);
end
   function f = integrand(x,t)
   f = x.^2.*t;
   end
end

【讨论】:

  • 感谢您的回答。是的,我想这是唯一的选择!
猜你喜欢
  • 2013-08-26
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多