📄 input-algo-bfgs
字号:
/*
* =====================================================
* Use BFGS Algorithm to Solve Nonlinear Equations
*
* Function :
* 2x[1]^2 + x[2] = 4
* x[1] + 2x[2]^2 = 5
*
* R^t = (4, 5)
* F[1] = 2x[1]^2 + x[2]
* F[2] = x[1] + 2x[2]^2
* K[i][j] = dF[i]/dx[j] Jacobain matrix
*
* Written By : X.G. Chen June 1994
* =====================================================
*/
dimen = 2;
IMAX = 20; /* Maximum number of iteration */
Ef = 1E-4;
Ee = 1.E-5;
beta = 1.0;
STOL = 0.5;
EPS = 1.E-5;
ii = 1;
MaxLineSearchCount = 5;
/* [a] : Initialize and print problem parameters and initial solution */
x = [7; 10];
R = [4; 5];
print "------initial Guess -----\n";
PrintMatrix(x);
print "\n------Given R value -----\n";
PrintMatrix(R);
Y = [2*x[1][1], 1; 1, 2*x[2][1]];
K = [4*x[1][1], 1; 1, 4*x[2][1]];
F = Y*x;
Residu0 = R-F;
Residu = R-F;
K_inver = Inverse(K);
/* [b] : Allocate working matrices */
Residu_old = Residu;
I = Diag([dimen, 1]);
delta_old = Zero([dimen, 1]);
/* [c] : Main Loop for Iteration */
Iter_no = 0;
for (ii = 1; ii <= IMAX; ii = ii + 1) {
Iter_no = Iter_no + 1;
beta = 1.0;
delta = K_inver*Residu;
/* [c.1] : Armijo Line Search */
x_temp = x + beta*delta;
temp1 = QuanCast(Trans(delta)*Residu);
Y = [2*x_temp[1][1], 1; 1, 2*x_temp[2][1]];
F = Y*x_temp;
Residu = R- F;
temp2 = QuanCast(Trans(delta)*Residu);
counter = 0;
while(temp2 > temp1*STOL + EPS) {
counter = counter + 1;
if(counter > MaxLineSearchCount) then {
print " \n ========== \n Too much iterations for line search \n";
break;
} else {
beta = beta/2.0;
x_temp = x + beta*delta;
Y = [2*x_temp[1][1], 1; 1, 2*x_temp[2][1]];
F = Y*x_temp;
Residu = R-F;
temp2 = QuanCast(Trans(delta)*Residu);
}
}
x = x_temp;
/* [c.2] : Restart for failed line search */
if(counter > MaxLineSearchCount) then {
ii = 1;
print " \n **** Restart at new initial Value \n";
Y = [2*x[1][1], 1; 1, 2*x[2][1]];
K = [4*x[1][1], 1; 1, 4*x[2][1]];
F = Y*x;
Residu = R-F;
K_inver = Inverse(K);
Residu_old = Residu;
delta_old = Zero([dimen, 1]);
} else {
/* [c.3] : BFGS Update (i.e counter < MaxLineSearchCount) */
gamma = Residu_old - Residu;
tem1 = QuanCast(Trans(delta)*Residu_old);
tem1 = tem1*beta*beta;
tem2 = QuanCast(Trans(delta)*gamma);
tem2 = tem2*beta;
ConditionNo = sqrt(tem2/tem1);
V = -ConditionNo*beta*Residu_old - gamma;
W = beta*delta/tem2;
A = I + V*Trans(W);
K_inver = Trans(A)*K_inver*A;
/* [c.4] : Check convergence criteria */
if (ConditionNo > 1E+5) {
print"ConditionNo = ", ConditionNo, " \n";
print"ERROR -- Condition Number Too Large \n";
break;
}
/* [c.5] : Force and energy criteria */
force_crt1 = L2Norm(Residu);
force_crt2 = L2Norm(Residu0)*Ef;
energy_crt1 = QuanCast(Trans(delta)*Residu_old);
energy_crt1 = abs(energy_crt1);
if (ii == 1) {
energy_crt2 = QuanCast(Trans(delta)*Residu0);
energy_crt2 = abs(energy_crt2*Ee);
}
if((force_crt1 <= force_crt2) && (energy_crt1 < energy_crt2)) {
break;
}
Residu_old = Residu;
delta_old = delta;
}
}
/* [d] : Print results and terminate program execution */
print" \n RESULTS : \n --------------\n";
print" Iteration Number =", Iter_no, "\n";
Y = [2*x[1][1], 1; 1, 2*x[2][1]];
F = Y*x;
PrintMatrix(x, F);
quit;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -