求解非线性方程的 levenberg-marquardt 方法
The levenberg-marquardt method for solving non-linear equations
我尝试使用 levenberg-marquardt 方法基于数值优化在 Julia 上求解非线性方程
Levenberg-Marquardt 算法 介绍。这是我的代码:
function get_J(ArrOfFunc,X,delta)
N = length(ArrOfFunc)
J = zeros(Float64,N,N)
for i = 1:N
for j=1:N
Temp = copy(X);
Temp[j]=Temp[j]+delta;
J[i,j] = (ArrOfFunc[i](Temp)-ArrOfFunc[i](X))/delta;
end
end
return J
end
function get_resudial(ArrOfFunc,Arg)
return map((x)->x(Arg),ArrOfFunc)
end
function lm_solve(Funcs,Init)
X = copy(Init)
delta = 0.01;
Lambda = 0.01;
Factor = 2;
J = get_J(Funcs,X,delta)
R = get_resudial(Funcs,X)
N = 5
for t = 1:N
G = J'*J+Lambda.*eye(length(X))
dC = J'*R
C = sum(R.*R)/2;
Xnew = X-(inv(G)\dC);
Rnew = get_resudial(Funcs,Xnew)
Cnew = sum(Rnew.*Rnew)/2;
if ( Cnew < C)
X = Xnew;
R = Rnew;
Lambda = Lambda/Factor;
J = get_J(Funcs,X,delta)
else
Lambda = Lambda*Factor;
end
if(maximum(abs(Rnew)) < 0.001)
return X
end
end
return X
end
function test()
ArrOfFunc = [
(X)->X[1]+X[2]-2;
(X)->X[1]-X[2]
];
X = lm_solve(ArrOfFunc,Float64[3;3])
println(X)
return X
end
但是从任何起点开始的步骤都不被接受。我做错了什么?
任何帮助将不胜感激。
目前我无法对此进行测试,但有一行在数学上没有意义:
在 Xnew
的计算中,它应该是 inv(G)*dC
或 G\dC
,但不能是两者的混合。最好是第二种,因为线性系统的解不需要计算逆矩阵。
由于迭代中心的这一错误计算,计算的轨迹几乎肯定会误入歧途。
我尝试使用 levenberg-marquardt 方法基于数值优化在 Julia 上求解非线性方程 Levenberg-Marquardt 算法 介绍。这是我的代码:
function get_J(ArrOfFunc,X,delta)
N = length(ArrOfFunc)
J = zeros(Float64,N,N)
for i = 1:N
for j=1:N
Temp = copy(X);
Temp[j]=Temp[j]+delta;
J[i,j] = (ArrOfFunc[i](Temp)-ArrOfFunc[i](X))/delta;
end
end
return J
end
function get_resudial(ArrOfFunc,Arg)
return map((x)->x(Arg),ArrOfFunc)
end
function lm_solve(Funcs,Init)
X = copy(Init)
delta = 0.01;
Lambda = 0.01;
Factor = 2;
J = get_J(Funcs,X,delta)
R = get_resudial(Funcs,X)
N = 5
for t = 1:N
G = J'*J+Lambda.*eye(length(X))
dC = J'*R
C = sum(R.*R)/2;
Xnew = X-(inv(G)\dC);
Rnew = get_resudial(Funcs,Xnew)
Cnew = sum(Rnew.*Rnew)/2;
if ( Cnew < C)
X = Xnew;
R = Rnew;
Lambda = Lambda/Factor;
J = get_J(Funcs,X,delta)
else
Lambda = Lambda*Factor;
end
if(maximum(abs(Rnew)) < 0.001)
return X
end
end
return X
end
function test()
ArrOfFunc = [
(X)->X[1]+X[2]-2;
(X)->X[1]-X[2]
];
X = lm_solve(ArrOfFunc,Float64[3;3])
println(X)
return X
end
但是从任何起点开始的步骤都不被接受。我做错了什么? 任何帮助将不胜感激。
目前我无法对此进行测试,但有一行在数学上没有意义:
在 Xnew
的计算中,它应该是 inv(G)*dC
或 G\dC
,但不能是两者的混合。最好是第二种,因为线性系统的解不需要计算逆矩阵。
由于迭代中心的这一错误计算,计算的轨迹几乎肯定会误入歧途。