Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中求解非线性方程组的最快方法_Matlab_Performance_Processing Efficiency_Bigdata - Fatal编程技术网

MATLAB中求解非线性方程组的最快方法

MATLAB中求解非线性方程组的最快方法,matlab,performance,processing-efficiency,bigdata,Matlab,Performance,Processing Efficiency,Bigdata,假设我们有三个方程: 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; 而已知的六个变量是: a = 42 ; b = 12 ; x1 = 316190; z1 = 234070; x2 = 316190; z2 = 234070; 因此,我们正在寻找三个未

假设我们有三个方程:

 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;
而已知的六个变量是:

a  =  42 ; 
b  =  12 ;
x1 =  316190;
z1 =  234070;
x2 =  316190;
z2 =  234070;
因此,我们正在寻找三个未知变量:

X , Z and t
我写了两个方法来解决它。但是,由于我需要为570万个数据运行这些代码,所以速度变得非常慢

方法一(使用“求解”):

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))
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
方法一的结果:

X =  316190;
Z =  234060;
t = -2.9280;
Elapsed time is 0.770429 seconds.
方法二(使用“fsolve”):

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))
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
方法二的结果:

 X =  316190; % X = M(1)
 Z =  234060; % Z = M(2)
 t = -2.9280; % t = M(3)
Elapsed time is 0.014 seconds.
虽然第二种方法速度更快,但仍需改进。如果您有更好的解决方案,请告诉我。谢谢


*额外信息:
如果你想知道这三个方程是什么,前两个是二维直线方程,第三个是椭圆方程。我需要找到直线和椭圆的交点。显然,我们有两点作为结果。但是,为了简单起见,让我们忘记第二个答案

我的建议是使用第二种方法,这是matlab推荐的用于非线性方程组的方法。 声明一个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);
如果您可能希望通过更改
步进公差
(默认1e-6)来降低默认精度。
此外,为了获得更高的效率,您可能需要使用雅可比矩阵。
有关更多参考,请参阅官方文档:


基本上,为解算器提供系统的雅可比矩阵(和特殊选项),可以提高方法效率。

首先,方法一不会返回您指定的解决方案。请编辑以提供实际代码和值。第二,两种方法的输出与当前编写的完全相同–您所说的“但仍需改进”是什么意思?您是否尝试过调整
fsolve
的公差或其他属性?