我有一个函数f = @(x,y,z)... 我想在x和y和z的给定数值上执行有限数值积分。
目前,我这样做如下 -
f2 = @(x) f(x,5,10)
integral(f2,-1,1)
(5和10实际上只是在程序过程中假定某些值的y和z)。
我的问题如下 -
因为我必须在(y,z)的许多值上进行积分(通常在循环中)。每次,我都必须重新定义一个功能。这可能使我的程序非常慢。有没有更好的方法去做这个操作,我不必经常重新定义我的功能。我需要程序运行得更快。
谢谢!
答案 0 :(得分: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
答案 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示例。
作为缺点,代码在一些内置正交方法中放弃了一些自适应步长。然而,这种方法非常快,我能够将蛮力集成到如此高的精度,这不是问题。 (不过,我的积分都相对温和。)
希望这有帮助。