将多变量函数集成到单个变量上,而无需定义新函数

问题描述 投票:0回答:2

我有一个函数 f = @(x,y,z) ... 我想用给定的 y 和 z 数值对 x 执行有限数值积分。

目前,我这样做 -

f2 = @(x) f(x,5,10)
integral(f2,-1,1)

(5 和 10 实际上只是在程序过程中假定某些值的一些 y 和 z)。

我的问题如下-

因为我必须对 (y,z) 的许多值进行积分(通常在循环中)。每次,我都必须重新定义一个函数。这可能会让我的程序变得非常慢。是否有更优化的方法来执行此操作,其中我不必不断地重新定义我的函数。我需要程序运行得更快。

谢谢!

matlab numerical-integration
2个回答
1
投票

匿名函数很慢。将

f
f2
重写为嵌套函数怎么样?例如:

function result = iterate_trough(A, B)

        result = 0;
        for a = 1:2:A, for b = 5:5:B
                result = result + quad(@f2,-1,1);
        end; end;

        function r  = f(x,y,z),  r  = x+y+z;     end
        function r2 = f2(x),     r2 = f(x,a,b);  end
end

这会降低代码的灵活性吗?

稍后编辑:或者甚至更好,消除调用

f
的开销:

function result = iterate_trough(A, B)

        result = 0;
        for a = 1:2:A, for b = 5:5:B
                result = result + quad(@f2,-1,1);
        end; end;

        function r2 = f2(x),  r2 = x+a+b;  end
end

0
投票

我能够使用复合辛普森方法加速一些具有许多积分的循环代码(MCMC),详细信息请参阅文件交换中的“编写快速 Matlab 代码”:

http://www.mathworks.com/matlabcentral/fileexchange/5685

从文档中,这里以一维积分为例:

h = (b − a)/(N−1);
x = (a:h:b).';
w = ones(1,N); w(2:2:N−1) = 4; w(3:2:N−2) = 2; w = w*h/3; 
I = w * f(x);

该文档还显示了 2d 和 3d 示例。

缺点是,该代码放弃了某些内置求积方法中的一些自适应步长。然而,这种方法速度非常快,我能够通过强力集成达到如此高的精度,这不是问题。 (不过,我的积分都相对温和。)

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.