Matlab:如何加速计算弧长的积分(int)?

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

作为代码的一部分,我通过积分计算 2d 弧长来构建网格划分几何体。 下面是执行此操作的示例代码:

fun=@(ss)integral(@(t)sqrt((r0+a1*cos(1*t)+a2*cos(2*t)+a3*cos(3*t)+a4*cos(4*t)+a5*cos(5*t)+a6*cos(6*t)+a7*cos(7*t)+a8*cos(8*t)).^2 ...
    + (-a1*1*sin(1*t)-a2*2*sin(2*t)-a3*3*sin(3*t)-a4*4*sin(4*t)-a5*5*sin(5*t)-a6*6*sin(6*t)-a7*7*sin(7*t)-a8*8*sin(8*t)).^2),0,ss);

积分在“t”上,所有其他参数均为常数(即 r0、a1 等)

但是集成需要很长时间,而且由于我尝试了许多不同的几何形状,如果我能找到一种方法来加速这个需要一点时间的集成,那就太好了。

如何以更快的方式计算相同的积分?

performance matlab numerical-integration
1个回答
0
投票

也许你可以使用替代品。

% Assuming you have a range of ss values to compute the integral for
ssValues = linspace(startValue, endValue, numberOfValues);

% Preallocate result array
arcLengths = zeros(size(ssValues));

% Use parallel processing
parfor idx = 1:length(ssValues)
    ss = ssValues(idx);
    fun = @(t) sqrt((r0+a1*cos(1*t)+a2*cos(2*t)+a3*cos(3*t)+a4*cos(4*t)+a5*cos(5*t)+a6*cos(6*t)+a7*cos(7*t)+a8*cos(8*t)).^2 ...
        + (-a1*1*sin(1*t)-a2*2*sin(2*t)-a3*3*sin(3*t)-a4*4*sin(4*t)-a5*5*sin(5*t)-a6*6*sin(6*t)-a7*7*sin(7*t)-a8*8*sin(8*t)).^2);
    arcLengths(idx) = integral(fun, 0, ss);
end

您需要启用并配置并行处理工具箱

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