3

私は、Numerical Optimization using the Levenberg-Marquardt Algorithmのプレゼンテーションに基づいてJuliaの非線形方程式を解くためにlevenberg-marquardt法を実装しようとしました。この私のコード:非線形方程式を解くための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 

しかし、任意の出発点からステップは受け入れられません。私は間違って何をしていますか? ご協力いただければ幸いです。

+0

関数 'compute'の定義が含まれていないため、コードをテストするのが難しくなります。 – DNF

+0

'inv(G)* dC'でも' G \ dC'でもないのですが、両方の組み合わせではありませんか?好ましくは、線形システムの解は逆行列の計算を必要としないので、第2のものである。 – LutzL

+0

エラーメッセージは何ですか? – DNF

答えて

3

私は、現時点ではこれをテストする方法がありませんが、1行が数学的に意味をなさない:

Xnewの計算では、それはinv(G)*dCまたはG\dC、両方ではないのミックスのいずれかでなければなりません。好ましくは、線形システムの解は逆行列の計算を必要としないので、第2のものである。

反復の中心でこの誤った計算をすると、計算の軌跡がほぼ間違っています。

関連する問題