/ / MATLABにおける非線形方程式の解法の最速方法 - MATLAB、性能、処理効率、ビッグデータ

MATLABにおける非線形方程式の解法の最速方法 - MATLAB、性能、処理効率、ビッグデータ

3つの式があるとします。

 eq1 =  x1 + (x1 - x2) * t - X         == 0;
eq2 =  z1 + (z1 - z2) * t - Z         == 0;
eq3 = ((X-x1)/a)^2 + ((Z-z1)/b)^2 - 1 == 0;

既知の変数のうち6つは次のとおりです。

a  =  42 ;
b  =  12 ;
x1 =  316190;
z1 =  234070;
x2 =  316190;
z2 =  234070;

だから私たちは3つの未知の変数を探しています:

X , Z and t

私はそれを解決する2つの方法を書いた。しかし、私はこれらのコードを570万のデータに対して実行する必要があるので、実際には遅くなります。

方法1( "solve"を使用):

tic
S  = solve( eq1 , eq2  , eq3 , X , Z , t ,...
"ReturnConditions", true, "Real", true);
toc
X = double(S.X(1))
Z = double(S.Z(1))
t = double(S.t(1))

方法1の結果:

X =  316190;
Z =  234060;
t = -2.9280;
Elapsed time is 0.770429 seconds.

方法2( "fsolve"を使用):

coeffs = [a,b,x1,x2,z1,z2];       % Known parameters
x0     = [ x2 ; z2 ; 1 ].";       % Initial values for iterations
f_d = @(x0) myfunc(x0,coeffs);    % f_d considers x0 as variables
options = optimoptions("fsolve","Display","none");
tic
M = fsolve(f_d,x0,options);
toc

方法2の結果:

 X =  316190; % X = M(1)
Z =  234060; % Z = M(2)
t = -2.9280; % t = M(3)
Elapsed time is 0.014 seconds.

しかし、2番目の方法は高速ですが、改善する必要があります。もしあなたがもっと良い解決策を持っていれば教えてください。ありがとう


* 追加情報: あなたがこれら3つのものを知りたい場合は、最初の2つは2Dの線の方程式であり、第3の方程式は楕円の方程式である。私は楕円と線の交点を見つける必要があります。明らかに、結果として2つのポイントがあります。しかし、単純化のために2番目の答えを忘れてしまいましょう。

回答:

回答№1は1

私の提案は、それは非線形方程式システムのためのmatlabで推奨される2番目の承認を使用することです。 M関数を宣言する

function Y=mysistem(X)
%X(1) = X
%X(2) = t
%X(3) = Z
a  =  42 ;
b  =  12 ;
x1 =  316190;
z1 =  234070;
x2 =  316190;
z2 =  234070;
Y(1,1) = x1 + (x1 - x2) * X(2) - X(1);
Y(2,1) = z1 + (z1 - z2) * X(2) - X(3);
Y(3,1) = ((X-x1)/a)^2 + ((Z-z1)/b)^2 - 1;
end

次に、使用を解決するために

x0     = [ x2 , z2 , 1 ];
M = fsolve(@mysistem,x0,options);

デフォルトの精度を変更したい場合は、 StepTolerance (デフォルトは1e-6)。 また、より多くの場合は、効率を上げるためにジャコビア行列を使用することもできます。 詳細については、公式文書を参照してください: フォルヴェ 解析的ヤコビ行列を用いた非線形方程式

基本的にソルバーにシステムのヤコビ行列(および特別なオプション)を与えれば、メソッドの効率を上げることができます。