在单个变量上集成多变量函数而不定义新函数

时间:2013-04-16 21:46:43

标签: matlab integration

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

目前,我这样做如下 -

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

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

我的问题如下 -

因为我必须在(y,z)的许多值上进行积分(通常在循环中)。每次,我都必须重新定义一个功能。这可能使我的程序非常慢。有没有更好的方法去做这个操作,我不必经常重新定义我的功能。我需要程序运行得更快。

谢谢!

2 个答案:

答案 0 :(得分:1)

匿名函数很慢。如何将ff2重写为嵌套函数?例如:

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

答案 1 :(得分:0)

我能够使用文件交换中提供的“编写快速Matlab代码”中详述的复合Simpson方法来加速一些带有许多积分的循环代码(MCMC):

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);

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

作为缺点,代码在一些内置正交方法中放弃了一些自适应步长。然而,这种方法非常快,我能够将蛮力集成到如此高的精度,这不是问题。 (不过,我的积分都相对温和。)

希望这有帮助。