Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- public class GradDescent {
- private static double er = 10E-6;
- private static int mode = 1; // 0 - pomak nenormirani v.g., 1 - zlatni rez
- public static final Fun f = new F3();
- public static void main(String[] args) throws NumberFormatException, IOException {
- BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
- String input = "";
- System.out.println("Mode (default 0):");
- input = in.readLine();
- if (!input.isEmpty()) {
- mode = Integer.parseInt(input);
- }
- System.out.println("Error (default 10E-6):");
- input = in.readLine();
- if (!input.isEmpty()) {
- er = Double.parseDouble(input);
- }
- System.out.println("Starting point:");
- input = in.readLine();
- String[] nums = input.split("\\s+");
- double[] x = new double[nums.length];
- for (int i = 0; i < nums.length; i++) {
- x[i] = Double.parseDouble(nums[i]);
- }
- double[] gradx = f.grad(x);
- double normgradx = norm(gradx);
- int i = 0;
- while (Math.abs(normgradx) > er) {
- System.out.print("x" + i + " = ");
- printVec(x);
- System.out.print("grad x" + i + " = ");
- printVec(gradx);
- System.out.println("norm (grad x" + i + ") = " + normgradx);
- double[] v = smul(-1 / normgradx, gradx);
- System.out.print("v" + i + " = ");
- printVec(v);
- System.out.print("F(x) = " + f.eval(x)+"\n");
- System.out.print("Broj poziva funkcije = " + f.getCallCount()+"\n");
- System.out.print("Broj racunanja gradijenata = " + f.getGradCount()+"\n");
- printVec(x);
- if (mode == 0) {
- x = vecop("+", x, v);
- } else if (mode == 1) {
- System.out.println("~~~~~Zlatni rez~~~~~");
- GSFun gsf = new GSFun();
- gsf._x = x;
- gsf._v = v;
- GoldenSection gs = new GoldenSection(1);
- gs.find(gsf, 1);
- double lambda = (gs.a + gs.b) / 2;
- System.out.println("lambda: " + lambda);
- System.out.print("Broj poziva funkcije = " + f.getCallCount()+"\n");
- System.out.print("Broj racunanja gradijenata = " + f.getGradCount()+"\n");
- System.out.println("~~~~~~~~~~~~~~~~~~~~");
- } else {
- System.out.println("Unknown mode");
- System.exit(0);
- }
- gradx = f.grad(x);
- normgradx = norm(gradx);
- i++;
- printVec(x);
- System.out.print("F(x) = " + f.eval(x)+"\n");
- System.out.println("------------------------");
- }
- }
- private static double norm(double[] x) {
- double sum = 0;
- for (double xi : x) {
- sum += Math.pow(xi, 2);
- }
- return Math.sqrt(sum);
- }
- private static double[] smul(double scalar, double[] vector) {
- double[] res = new double[vector.length];
- for (int i = 0; i < vector.length; i++)
- res[i] = scalar * vector[i];
- return res;
- }
- private static double[] vecop(String op, double[] arg1, double[] arg2) {
- double[] res = new double[arg1.length];
- for (int i = 0; i < res.length; i++) {
- if ("-".equals(op)) {
- res[i] = arg1[i] - arg2[i];
- } else {
- res[i] = arg1[i] + arg2[i];
- }
- }
- return res;
- }
- private static void printVec(double[] v) {
- String ret = "(";
- for (int i = 0; i < v.length; i++)
- ret += v[i] + " ";
- ret.trim();
- ret += ")";
- System.out.println(ret);
- }
- static class GSFun implements Fun {
- public double[] _x;
- public double[] _v;
- @Override
- public double eval(double... x) {
- double lambda = x[0];
- return f.eval(_x[0] + lambda * _v[0], _x[1] + lambda * _v[1]);
- }
- @Override
- public int getCallCount() {
- return 0;
- }
- @Override
- public int getGradCount() {
- return 0;
- }
- @Override
- public void setCallCount(int c) {}
- @Override
- public double[] grad(double... x) {
- return null;
- }
- @Override
- public Matrix hessian(double... x) {
- return null;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement