我需要编写自己的函数,其形式为f(x,y)=Integrate(g(x,y,z),z from 0 to inf) 所以我使用的代码是:

function y=f(x,y)
g=@(z)exp(-z.^2)./(z.^x).*(z.^2+y.^2).^(x/2);% as a function of x,y and z
y=quadgk(g,0,inf)

如果我用f(x0,y0)类的单个值调用它,它就可以工作,但是如果我尝试计算f([1:10],y0) ,则错误消息表明该函数有问题时间和维度。 原则上,我可以使用for循环,但是这样我的代码就会变慢并且要花很长时间。 我能从你们那里得到什么帮助吗? 或参考?

我试图避免for循环,因为在matlab中使用矩阵计算比使用for循环要快得多。 我想知道是否有任何技巧可以利用此功能。

感谢您的任何帮助,

林恩

===============>>#1 票数:0

也许您可以尝试转置间隔,创建基于行的值而不是基于列的f([1:10]',y0) 否则,函数中的某些内容可能是错误的,例如,要使x^y可以将列表用作输入,您必须在前缀x.^y加上前缀。 我认为多方面的划分也是如此。

===============>>#2 票数:0

如果循环对您来说没有问题,则应执行以下操作:

function y2=f(x,y)
y2=zeros(size(x));

for n=1:numel(x)
  g=@(z)exp(-z.^2)./(z.^x(n)).*(z.^2+y.^2).^(x(n)/2);% as a function of x,y and z
  y2(n)=quadgk(g,0,inf)
end

===============>>#3 票数:0

这里的问题是, quadk本身使用向量作为g参数。 然后,您在g有了z.^x类的东西,这是两个向量的幂,仅当z和x具有相同维数时才定义。 但这不是您想要的。

我假设您要为x所有参数求值函数,并且输出向量的尺寸与x相同。 但这似乎是不可能的,因为即使是这个简单的例子

g=@(x)[x;x.^2]
quad(g,0,1)

不起作用:

Error using quad (line 79)
The integrand function must return an output vector of the same length as the
input vector.

使用quadgk时会显示类似的错误。 该文档还说,该例程仅适用于标量函数,这并不奇怪,因为自适应正交规则通常会对每个函数使用不同的点来评估积分。

您必须改用quadv ,它可以集成向量值函数。 但这会产生错误的结果,因为您的函数集成在间隔[0,\\ infty)中。

  ask by user1092696 translate from so

未解决问题?本站智能推荐: