Closed. This question needs to be more focused. It is not currently accepting answers. Learn more。
想改进这个问题吗更新问题,使其只关注一个问题editing this post。
11个月前关闭。
MATLAB有两种方法来求解非线性方程:
因此,可以使用以下方法来求解非线性独立方程组:
使用循环分别使用
使用循环分别使用
使用
我的直觉是:
复杂度(梯度计算)为0(n ^ 2),循环法比单系统大。
对于较小的
问:解决这个问题最快的方法是什么应该使用哪些选项来加快进程?
相关线程
Solving multiple independent non linear equations
Solve a large number of independent nonlinear equations with fsolve without loops
结果
所有的图都显示了整个系统的计算时间,函数为
前两个图绘制的
结论
loop fsolve:不要使用,启动时间太长
循环fzero:您可以将它用于small
默认fsolve:您可以将它用于相对较小的
独立的fsolve:您应该使用它来处理大型的
一般来说,您应该使用独立的fsolve,只能使用小的
懒惰的人可能只使用默认的fsolve,因为它对中等数量的方程有合理的性能(
评论
注意,默认F化解的时间复杂度是O(n ^ 2),而其他的是O(n)。
注意
想改进这个问题吗更新问题,使其只关注一个问题editing this post。
11个月前关闭。
MATLAB有两种方法来求解非线性方程:
fzero
:解一个非线性方程fsolve
:解非线性方程组因此,可以使用以下方法来求解非线性独立方程组:
使用循环分别使用
n
使用循环分别使用
fzero
使用
fsolve
一起解决它们我的直觉是:
复杂度(梯度计算)为0(n ^ 2),循环法比单系统大。
对于较小的
fsolve
来说,一个循环可能会慢一些,因为在MATLAB中,一个循环有很高的开销,并且可能有一些恒定的启动时间n
比n
快,因为它是专门为一个非线性方程设计的。问:解决这个问题最快的方法是什么应该使用哪些选项来加快进程?
相关线程
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,因为它比其他图慢得多。结论
loop fsolve:不要使用,启动时间太长
循环fzero:您可以将它用于small
n
(对于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)。
注意
fzero
和fsolve
在某些边界情况下的行为可能不同,f.efzero
在搜索符号变化的位置时找不到x^2
的解。10-07 17:52