function [V,K] = economics_vk(expense,income,rnd) % function to find V and K parameters using scaled conjugate gradients over % each round returning the time dependent parameters V and K for each % income (i.e. Cnorm + Fnorm + Nnorm) against expense (e.g. Cnorm). options = foptions; % options for Netlab gradient descent algorithm options(9) = 0; % do a gradient check? 1 = yes, 0 = no options(1) = -1; % show error at iterations? 1 = yes, -1 = no. N = length(income); index = find((rnd(1:end-1)-rnd(2:end))<0); index = [0,index']; index(end+1) = N; rounds = length(index)-1; for i = 1:rounds %pars(i,:) = scg('economics_vk_err',rand(2,1)',options,'economics_vk_grad',expense(index(i)+1:index(i+1)),income(index(i)+1:index(i+1))); % do gradient descent internally instead of using netlab pars(i,:) = rand(1,2); err_old = economics_vk_err(pars(i,:),expense(index(i)+1:index(i+1)),income(index(i)+1:index(i+1))); success = 1; eta = 0.8; for ind1 = 1:150 if success grad = economics_vk_grad(pars(i,:),expense(index(i)+1:index(i+1)),income(index(i)+1:index(i+1))); end pars(i,:) = pars(i,:) - eta*grad; err_new = economics_vk_err(pars(i,:),expense(index(i)+1:index(i+1)),income(index(i)+1:index(i+1))); if err_new < err_old success = 1; eta = eta*1.2; err_old = err_new; else success = 0; pars(i,:) = pars(i,:) + eta*grad; eta = eta*0.2; end end end V = pars(:,1); K = pars(:,2); end