import
java.util.Arrays;
public
class
ConjugateMethod {
public
static
void
main(String[] args) {
double
[] x_0 = {
0
,
0
};
double
[] x_k = x_0;
double
[] d_k = {
1
,
1
};
double
[] grad;
double
alpha =
0.1
;
double
eps = 1e-
6
;
int
k =
0
;
do
{
grad = gradient(x_k);
d_k = conjugateDirection(grad, d_k, k);
x_k = updateX(x_k, d_k, alpha);
k++;
}
while
(norm(grad) > eps);
System.out.println(
"Local optima: "
+ Arrays.toString(x_k));
}
public
static
double
[] gradient(
double
[] x) {
double
[] grad =
new
double
[x.length];
grad[
0
] =
4
* Math.pow(x[
0
] -
2
,
3
) +
2
* (x[
0
] -
2
* x[
1
]);
grad[
1
] = -
4
* (x[
0
] -
2
* x[
1
]);
return
grad;
}
public
static
double
[] conjugateDirection(
double
[] grad,
double
[] d_k,
int
k) {
double
[] d_kp1 =
new
double
[grad.length];
double
beta = dotProduct(grad, grad) / dotProduct(d_k, grad);
for
(
int
i =
0
; i < grad.length; i++) {
d_kp1[i] = -grad[i] + beta * d_k[i];
}
return
d_kp1;
}
public
static
double
[] updateX(
double
[] x,
double
[] d,
double
alpha) {
double
[] x_new =
new
double
[x.length];
for
(
int
i =
0
; i < x.length; i++) {
x_new[i] = x[i] + alpha * d[i];
}
return
x_new;
}
public
static
double
norm(
double
[] x) {
double
sum =
0
;
for
(
int
i =
0
; i < x.length; i++) {
sum += x[i] * x[i];
}
return
Math.sqrt(sum);
}
public
static
double
dotProduct(
double
[] x,
double
[] y) {
double
sum =
0
;
for
(
int
i =
0
; i < x.length; i++) {
sum += x[i] * y[i];
}
return
sum;
}
}