我有一个函数 f = @(x,y,z) ... 我想用给定的 y 和 z 数值对 x 执行有限数值积分。
目前,我这样做 -
f2 = @(x) f(x,5,10)
integral(f2,-1,1)
(5 和 10 实际上只是在程序过程中假定某些值的一些 y 和 z)。
我的问题如下-
因为我必须对 (y,z) 的许多值进行积分(通常在循环中)。每次,我都必须重新定义一个函数。这可能会让我的程序变得非常慢。是否有更优化的方法来执行此操作,其中我不必不断地重新定义我的函数。我需要程序运行得更快。
谢谢!
匿名函数很慢。将
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
我能够使用复合辛普森方法加速一些具有许多积分的循环代码(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 示例。
缺点是,该代码放弃了某些内置求积方法中的一些自适应步长。然而,这种方法速度非常快,我能够通过强力集成达到如此高的精度,这不是问题。 (不过,我的积分都相对温和。)
希望这有帮助。