念のためにその方程式は、実際のあなたのある式(とではないダミーの例):その方程式は線形あり、意味、あなたは簡単なmldivide
ですべてv
のためにそれを解決することができます:
v = sort(rand(1,1000));
x = [1 1; 1 -1] \ bsxfun(@plus, -v, [2; 1.8])
そして、ケースのものですない実際の方程式、あなたは全部をベクトル化することができ、ループする必要はありません。
function x = solver()
options = optimset('Display' , 'off',...
'MaxFunEvals', 1e5,...
'MaxIter' , 1e4);
v = sort(rand(1, 1000));
x0 = repmat([0 0], numel(v), 1);
x = fsolve(@(x)root(x,v'), x0, options);
end
function D = root(x,v)
D = [x(:,1) + x(:,2) + v - 2
x(:,1) - x(:,2) + v - 1.8];
end
これは、またはループよりも高速であってもなくてもよい、それはあなたの実際の式に依存します。
fsolve
は2×2,1000回(4k要素)の代わりに2000×2000(4M要素)のヤコビアンを計算する必要があるため、処理が遅くなることがあります。
しかし、起動コストがfsolve
と大きいため、多くのコールのオーバーヘッドが実際にはより大きなヤコビアンを計算するコストを上回る可能性があるため、速度が速くなる可能性があります。いずれの場合においても
、第二の出力は、むしろ非常にすべてをスピードアップとしてヤコビアンを提供する:
function solver()
options = optimset('Display' , 'off',...
'MaxFunEvals', 1e5,...
'MaxIter' , 1e4,...
'Jacobian' , 'on');
v = sort(rand(1, 1000));
x0 = repmat([1 1], numel(v), 1);
x = fsolve(@(x)root(x,v'), x0, options);
end
function [D, J] = root(x,v)
% Jacobian is constant:
persistent J_out
if isempty(J_out)
one = speye(numel(v));
J_out = [+one +one
+one -one];
end
% Function values at x
D = [x(:,1) + x(:,2) + v - 2
x(:,1) - x(:,2) + v - 1.8];
% Jacobian at x:
J = J_out;
end
を...あなたは右、これらは線形方程式であることを知っていますか?あなたはそれらを解決するために 'fsolve'を必要としません。実際、むしろ遅く、おそらく不正確になるでしょう...' root'は実例ですか、あなたの本当の*関数は解決するのでしょうか? –