【问题标题】:matlab function which is a function of an intergralmatlab函数,它是一个积分的函数
【发布时间】:2011-12-11 21:08:09
【问题描述】:

我需要编写自己的函数,其形式为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 循环快得多。我想知道是否有任何技巧可以利用此功能。

提前感谢您的帮助,

林恩

【问题讨论】:

  • 在您的情况下,我认为您应该使用 for 循环。如果你有x=1:10,我想它所花费的时间不会超过正常功能的十倍。
  • 好吧,如果我执行 for 循环 10 次,那不是问题,但是我需要将此函数传递给另一个函数以进行一些优化,为了做到这一点,这个 f 函数必须是能够接受向量输入并产生向量输出...

标签: function matlab


【解决方案1】:

也许您可以尝试转置间隔,创建基于行的值而不是基于列的f([1:10]',y0)。否则你的函数中的某些东西可能是错误的,例如让x^y 使用列表作为输入,你必须在前面加上一个点x.^y。我认为乘法和除法也是如此..

【讨论】:

  • 非常感谢您的回答,我尝试了行向量和列向量,并确保在每个 * 和 ^ 和 /. 之后放置一个点,我应该包含我的确切函数写下来。
【解决方案2】:

如果循环对你来说没有问题,你应该这样做:

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

【讨论】:

  • 非常感谢您的回复,我确实尝试了 for 循环,但运行我的整个代码需要很长时间。这个功能只是我项目的一部分。在我定义了这个函数之后,我需要对它执行一个逆拉普拉斯函数,然后最大化结果函数......所以如果我每次都使用 for 循环代码会太慢,因为对于 matlab,执行矩阵计算要快得多比 for 循环,只希望有一些技巧可以做到这一点。无论如何,非常感谢。
【解决方案3】:

这里的问题是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) 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2015-06-03
    • 2012-08-24
    • 2012-06-08
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多