[討論] 為什麼我的Newton's method有時不收斂?

看板MATLAB作者 (熊眼)時間13年前 (2012/09/13 14:45), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
我想解Stephen Boyd書中的一個example http://a.imageshack.us/img42/7095/59027129.jpg
根據書中描述 A, c, b都是隨機產生 u和v的初始值則皆為0 我使用infeasible start Newton's mthod去解這個問題 結果發生有時候residual norm收斂在很大的值0.02左右 (書上說是10^-14) 甚至有時候stepsize都收到0了,residual norm還沒減少! 想麻煩大家幫我看看 是我對method理解有錯 還是code有錯呢? 謝謝大家 ------------------------------------------------------------------------------ clear all; clc; alpha = 0.01; % parameter used to do <<<< backtracking line search >>>> beta = 0.5; % change of stepsize in the <<<< backtracking line search >>>> epsilon = 10^(-6); % a very small positive value t = 1; % gap decreasing scalar I = eye(100); A = rand(100,100); b = rand(100,1); c = rand(100,1); u = zeros(100,1); v = zeros(100,1); new_r = epsilon; % initial condition to go into while loop for iter = 1:8 % iteration number %% Derivative Equations to find residual D_u = A*v + b + 2*u/(1-u'*u)/log(10); % gradient of f to u D_v = A'*u + c - 2*v/(1-v'*v)/log(10); % gradient of f to v D_u_v = A; % gradient of f to u and v D_v_u = A'; % gradient of f to v and u D_u_u = (2/(1-u'*u)*I + 4*u*u'/(1-u'*u)^2)/log(10); % gradient of f to u and u D_v_v = (2/(1-v'*v)*I - 4*v*v'/(1-v'*v)^2)/log(10); % gradient of f to v and v r = [D_u D_v]; % residual gradient_r = [D_u_u, D_u_v; D_v_u, D_v_v]; difference = -inv(gradient_r)*r; % search direction %% backtracking line search standard = 1; s = 1; while ( standard>=0 ) new_u = u + s*difference(1:100); % u的下一個state new_v = v + s*difference(101:200); % v的下一個state D_new_u = A*new_v + b + 2*new_u/(1-new_u'*new_u)/log(10); D_new_v = A'*new_u + c - 2*new_v/(1-new_v'*new_v)/log(10); new_r = [D_new_u D_new_v]; standard = norm(new_r) - (1-alpha*s)*norm(r); s = beta*s; end u = new_u; v = new_v; end norm_new_r = norm(new_r) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.15.49 ※ 編輯: beareyes 來自: 140.114.15.49 (09/13 14:45)
文章代碼(AID): #1GKO3oUo (MATLAB)
文章代碼(AID): #1GKO3oUo (MATLAB)