Advertisement
Guest User

Untitled

a guest
Jan 19th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.82 KB | None | 0 0
  1.  
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5.  
  6. public class GradDescent {
  7. private static double er = 10E-6;
  8. private static int mode = 1; // 0 - pomak nenormirani v.g., 1 - zlatni rez
  9. public static final Fun f = new F3();
  10.  
  11. public static void main(String[] args) throws NumberFormatException, IOException {
  12. BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  13. String input = "";
  14. System.out.println("Mode (default 0):");
  15. input = in.readLine();
  16. if (!input.isEmpty()) {
  17. mode = Integer.parseInt(input);
  18. }
  19. System.out.println("Error (default 10E-6):");
  20. input = in.readLine();
  21. if (!input.isEmpty()) {
  22. er = Double.parseDouble(input);
  23. }
  24. System.out.println("Starting point:");
  25. input = in.readLine();
  26. String[] nums = input.split("\\s+");
  27.  
  28. double[] x = new double[nums.length];
  29. for (int i = 0; i < nums.length; i++) {
  30. x[i] = Double.parseDouble(nums[i]);
  31. }
  32.  
  33. double[] gradx = f.grad(x);
  34. double normgradx = norm(gradx);
  35. int i = 0;
  36. while (Math.abs(normgradx) > er) {
  37. System.out.print("x" + i + " = ");
  38. printVec(x);
  39. System.out.print("grad x" + i + " = ");
  40. printVec(gradx);
  41. System.out.println("norm (grad x" + i + ") = " + normgradx);
  42. double[] v = smul(-1 / normgradx, gradx);
  43. System.out.print("v" + i + " = ");
  44. printVec(v);
  45. System.out.print("F(x) = " + f.eval(x)+"\n");
  46. System.out.print("Broj poziva funkcije = " + f.getCallCount()+"\n");
  47. System.out.print("Broj racunanja gradijenata = " + f.getGradCount()+"\n");
  48. printVec(x);
  49.  
  50. if (mode == 0) {
  51. x = vecop("+", x, v);
  52. } else if (mode == 1) {
  53. System.out.println("~~~~~Zlatni rez~~~~~");
  54. GSFun gsf = new GSFun();
  55. gsf._x = x;
  56. gsf._v = v;
  57. GoldenSection gs = new GoldenSection(1);
  58. gs.find(gsf, 1);
  59. double lambda = (gs.a + gs.b) / 2;
  60. System.out.println("lambda: " + lambda);
  61. System.out.print("Broj poziva funkcije = " + f.getCallCount()+"\n");
  62. System.out.print("Broj racunanja gradijenata = " + f.getGradCount()+"\n");
  63. System.out.println("~~~~~~~~~~~~~~~~~~~~");
  64.  
  65. } else {
  66. System.out.println("Unknown mode");
  67. System.exit(0);
  68. }
  69. gradx = f.grad(x);
  70. normgradx = norm(gradx);
  71. i++;
  72. printVec(x);
  73. System.out.print("F(x) = " + f.eval(x)+"\n");
  74. System.out.println("------------------------");
  75. }
  76. }
  77.  
  78. private static double norm(double[] x) {
  79. double sum = 0;
  80.  
  81. for (double xi : x) {
  82. sum += Math.pow(xi, 2);
  83. }
  84.  
  85. return Math.sqrt(sum);
  86. }
  87.  
  88. private static double[] smul(double scalar, double[] vector) {
  89. double[] res = new double[vector.length];
  90.  
  91. for (int i = 0; i < vector.length; i++)
  92. res[i] = scalar * vector[i];
  93.  
  94. return res;
  95. }
  96.  
  97. private static double[] vecop(String op, double[] arg1, double[] arg2) {
  98. double[] res = new double[arg1.length];
  99.  
  100. for (int i = 0; i < res.length; i++) {
  101. if ("-".equals(op)) {
  102. res[i] = arg1[i] - arg2[i];
  103. } else {
  104. res[i] = arg1[i] + arg2[i];
  105. }
  106. }
  107.  
  108. return res;
  109. }
  110.  
  111. private static void printVec(double[] v) {
  112. String ret = "(";
  113. for (int i = 0; i < v.length; i++)
  114. ret += v[i] + " ";
  115. ret.trim();
  116. ret += ")";
  117. System.out.println(ret);
  118. }
  119.  
  120. static class GSFun implements Fun {
  121.  
  122. public double[] _x;
  123. public double[] _v;
  124.  
  125. @Override
  126. public double eval(double... x) {
  127. double lambda = x[0];
  128. return f.eval(_x[0] + lambda * _v[0], _x[1] + lambda * _v[1]);
  129. }
  130.  
  131. @Override
  132. public int getCallCount() {
  133. return 0;
  134. }
  135. @Override
  136. public int getGradCount() {
  137. return 0;
  138. }
  139.  
  140. @Override
  141. public void setCallCount(int c) {}
  142.  
  143. @Override
  144. public double[] grad(double... x) {
  145. return null;
  146. }
  147.  
  148. @Override
  149. public Matrix hessian(double... x) {
  150. return null;
  151. }
  152.  
  153. }
  154.  
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement