import
java.util.Arrays;
public
class
SteepestDescent {
public
static
double
f(
double
x,
double
y) {
return
x*x +
2
*y*y -
2
*x*y +
3
*x +
5
*y;
}
public
static
double
[] grad(
double
x,
double
y) {
return
new
double
[] {
2
*x -
2
*y +
3
,
4
*y -
2
*x +
5
};
}
public
static
double
alpha =
0.1
;
public
static
int
maxIter =
100
;
public
static
double
epsilon = 1e-
6
;
public
static
void
main(String[] args) {
double
[] x0 = {
1
,
1
};
double
[] x = x0;
double
[] xPrev =
new
double
[x0.length];
int
k =
0
;
while
(k < maxIter && euclideanNorm(x, xPrev) > epsilon) {
xPrev = Arrays.copyOf(x, x.length);
double
[] g = grad(x[
0
], x[
1
]);
x[
0
] = x[
0
] - alpha * g[
0
];
x[
1
] = x[
1
] - alpha * g[
1
];
k++;
}
System.out.println(
"Local optima: "
+ Arrays.toString(x));
}
public
static
double
euclideanNorm(
double
[] x,
double
[] y) {
double
sum =
0
;
for
(
int
i =
0
; i < x.length; i++) {
sum += (x[i] - y[i]) * (x[i] - y[i]);
}
return
Math.sqrt(sum);
}
}