@su
2014-06-10T04:28:50.000000Z
字数 3531
阅读 2702
matlab 计算
使用共轭梯度法求解该题,代码如下:
main 函数
function GG_main()G = zeros(10);for t = 1:10G(t,t) = 4^t;if t>=2G(t,t-1) = 1;endif t<=9G(t,t+1) = 1;endenddisp(G);b =[5 18 66 258 1026 4098 16386 65538 262146 1048577];x0 = zeros(1,10);max_iter = 1000;fprintf('\n')fprintf('Conjugate Gradient Methord:\n');fprintf('=============================');[y,iter] = frcg(G, b, x0, max_iter );fprintf('\n')fprintf(' Iterative number: \n %d \n',iter);fprintf(' Solution:\n');fprintf(' %10.6f',y);fprintf('\n\n==========================\n')
cg 函数
function [x iter] = cg(G, b, x0, max_iter)x = x0';b=b';tolerance = 1.0e-6;fprintf('\n x0=');fprintf(' %10.6f',x0);%save sb.mat G b xsize(x);size(b);size(G);r = G*x-b;d=-r;for k=1:max_iterif norm(r,2) <= toleranceiter = k-1;fprintf('\n Algorithm finds a solution!');returnendalpha = (r'*r)/(d'*G*d);xx = x+alpha*d;rr = r+alpha*G*d;beta = (rr'*rr)/(r'*r);d = -rr+beta*d;x = xx;r = rr;fprintf('\n x%d = ',k);fprintf(' %10.6f',x);enditer = max_iter;return

main 函数:
function GG_main()G = zeros(10);for t = 1:10G(t,t) = 4^t;if t>=2G(t,t-1) = 1;endif t<=9G(t,t+1) = 1;endenddisp(G);b =[5 18 66 258 1026 4098 16386 65538 262146 1048577];x0 = zeros(1,10);max_iter = 1000;fprintf('\n')fprintf('Conjugate Gradient Methord:\n');fprintf('=============================');[y,iter] = frcg(G, b, x0, max_iter );fprintf('\n')fprintf(' Iterative number: \n %d \n',iter);fprintf(' Solution:\n');fprintf(' %10.6f',y);fprintf('\n\n==========================\n')
frcg 函数:
function [x iter] = frcg(G, b, x0, max_iter)x = x0';b=b';tolerance = 1.0e-6;fprintf('\n x0=');fprintf(' %10.6f',x0);r = G*x-b;d=-r;rou = 0.1;deta = 0.75;alphamax = 1;alpha1 = 0;alpha2 = alphamax;for k=1:max_iterif norm(r,2) <= toleranceiter = k-1;fprintf('\n Algorithm finds a solution!');returnend%temp1 = main(-r'*r,norm(r,2));%fprintf('%d',k);if k >= 2fai1 = 0.5*x'*G*x - b'*x;fai1d = -(G*x-b)'*d;alpha = 0.618*(alpha2- alpha1)+alpha1;fai = 0.5*(x+ alpha*d)'*G*(x+ alpha*d) - b'*(x+ alpha*d);while trueif (fai-fai1) > -rou*alpha*min(fai1d'*d, norm((G*x - b)'*d,2));alphab = alpha1 + 0.5*(alpha -alpha1)/(1+(fai1-fai)/((alpha-alpha1)*fai1d));alpha2 = alpha;alpha = alphab;endfaid =-(G'*(x+alpha*d)-b)'*d;if abs(faid'*d) >= deta*min(faid,norm(fai1d,2))alphab = alpha + (alpha - alpha1)*faid/(fai1d-faid);alpha1 = alpha;fai1d = faid;fai1 = fai;alpha = alphab;elsealpha = abs(alpha);breakendendelse%fprintf('wo zei')alpha = (r'*r)/(d'*G*d);endfprintf('\n Wolfe alpha: %d',alpha)alpha = (r'*r)/(d'*G*d);fprintf('\n cg alpha: %d',alpha)xx = x+alpha*d;rr = r+alpha*G*d;beta = (rr'*rr)/(r'*r);d = -rr+beta*d;x = xx;r = rr;fprintf('\n x%d = ',k);fprintf(' %10.6f',x);disp(alpha)endend
可以看出wolfe 准则求解获得的