Closed. This question needs to be more focused. It is not currently accepting answers. Learn more
想改进这个问题吗更新问题,使其只关注一个问题editing this post
11个月前关闭。
MATLAB有两种方法来求解非线性方程:
fzero:解一个非线性方程
fsolve:解非线性方程组
因此,可以使用以下方法来求解非线性独立方程组:
使用循环分别使用n
使用循环分别使用fzero
使用fsolve一起解决它们
我的直觉是:
复杂度(梯度计算)为0(n ^ 2),循环法比单系统大。
对于较小的fsolve来说,一个循环可能会慢一些,因为在MATLAB中,一个循环有很高的开销,并且可能有一些恒定的启动时间
nn快,因为它是专门为一个非线性方程设计的。
问:解决这个问题最快的方法是什么应该使用哪些选项来加快进程?
相关线程
Solving multiple independent non linear equations
Solve a large number of independent nonlinear equations with fsolve without loops

最佳答案

评估某个方法性能的最佳方法是编写基准考虑了四种情况:
循环fzero:使用循环分别使用fzero
loop fsolve:使用循环分别使用fsolve
默认fsolve:将方程作为一个方程组一起求解
独立fsolve:与默认fsolve相同,但specifies that the equations are independent

f = @(x) x.^2-1; % the set of non-linear equations
ns = 1:1:100; % the sizes for which the benchmark is performed
options=optimset('Display','off'); % disable displaying

figure
hold on
plot(ns, loopFSolve(f, ns, options), 'DisplayName', 'loop fsolve')
plot(ns, loopFZero(f, ns, options), 'DisplayName', 'loop fzero')
plot(ns, defaultFSsolve(f, ns, options), 'DisplayName', 'default fsolve')
plot(ns, independentFSolve(f, ns, options), 'DisplayName', 'independent fsolve')

legend ('Location', 'northwest')

function t = loopFZero(f, ns, options)
  t1 = timeit(@() fzero(f, rand(1), options));
  t = ns * t1;
end

function t = loopFSolve(f, ns, options)
  t1 = timeit(@() fsolve(f, rand(1), options));
  t = ns * t1;
end

function t = defaultFSsolve(f, ns, options)
  t = zeros(size(ns));
  for i=1:length(ns)
    n = ns(i);
    un = rand(n, 1);
    t(i) = timeit(@() fsolve(f, un, options));
  end
end

function t = independentFSolve(f, ns, options)
  t = zeros(size(ns));
  for i=1:length(ns)
    n = ns(i);
    un = rand(n, 1);
    options.Algorithm = 'trust-region-reflective';
    options.JacobPattern = speye(n);
    options.PrecondBandWidth = 0;

    t(i) = timeit(@() fsolve(f, un, options));
  end
end

结果
所有的图都显示了整个系统的计算时间,函数为n,方程的个数。
前两个图绘制的n最大值为1000,间隔为100最后两个数字以1为间隔绘制n到100对于每一个图,第二个图与第一个图相同,但没有循环f0,因为它比其他图慢得多。
matlab - 在MATLAB中求解多个非线性独立方程的最快方法?-LMLPHP
matlab - 在MATLAB中求解多个非线性独立方程的最快方法?-LMLPHP
matlab - 在MATLAB中求解多个非线性独立方程的最快方法?-LMLPHP
matlab - 在MATLAB中求解多个非线性独立方程的最快方法?-LMLPHP
结论
loop fsolve:不要使用,启动时间太长
循环fzero:您可以将它用于smalln(对于n < ~20,最快的方法)
默认fsolve:您可以将它用于相对较小的n(对于~20 < n < ~50,使用最快的方法,但与2和3的差异相对较小)。
独立的fsolve:您应该使用它来处理大型的n(对于~50 < n,最快的方法是使用它)
一般来说,您应该使用独立的fsolve,只能使用小的n循环fzero,即使用fsolve和以下选项:
options.Algorithm = 'trust-region-reflective';
options.JacobPattern = speye(n);
options.PrecondBandWidth = 0;

懒惰的人可能只使用默认的fsolve,因为它对中等数量的方程有合理的性能(n < ~200
评论
注意,默认F化解的时间复杂度是O(n ^ 2),而其他的是O(n)。
注意fzerofsolve在某些边界情况下的行为可能不同,f.efzero在搜索符号变化的位置时找不到x^2的解。

10-07 17:52