Advertisement
Guest User

Untitled

a guest
Mar 31st, 2020
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.84 KB | None | 0 0
  1. #include "gradient_descent.h"
  2.  
  3. ////////////////////////////////////////////////////////////////////////////////
  4. //////////////////////////////Functii matematice////////////////////////////////
  5. ////////////////////////////////////////////////////////////////////////////////
  6. real f2d1(real x, real y) // functia patratica de ord 2; pt [-2;2]
  7. {
  8. return x*x+y*y;
  9. }
  10.  
  11. real f2d2(real x, real y) // functia Rosenbrock; pt [-2;2]
  12. {
  13. return sin(0.5*x*x-0.25*y*y+3)*cos(2*x+1-exp(y));
  14. }
  15. real f2d3(real x, real y) // functia banana
  16. {
  17. return (1-x)*(1-x) + 100*(y-x*x)*(y-x*x);
  18. }
  19. real f2d4(real x, real y)
  20. {
  21. return (0.5*x*x+0.2*y*y);
  22. }
  23. real f2d5(real x, real y)
  24. {
  25. return (0.5*(x-1)*(x-1)+1.5*(y-0.5)*(y-0.5));
  26. }
  27. real f2d6(real x, real y)
  28. {
  29. return (0.5*(x-1)*(x-1)+0.5*x*y+1.5*(y-0.5)*(y-0.5));
  30. }
  31. ////////////////////////////////////////////////////////////////////////////////
  32. //////////////////////////////Optimizare////////////////////////////////////////
  33. ////////////////////////////////////////////////////////////////////////////////
  34. bool check_params(real x1, real x2, real y1, real y2)
  35. {
  36. if (x1>=x2) return false;
  37. if (y1>=y2) return false;
  38. return true;
  39. }
  40. bool mesh2d(real(*pf)(real,real), real x1, real x2, real y1, real y2, real pasx, real pasy)
  41. {
  42. FILE *fp, *fp2;
  43. fp = fopen("mesh.in","w");
  44. fp2 = fopen("param.in","w");
  45. dword par_i = 0,
  46. par_j = 0;
  47. bool checked = false;
  48. if (!fp)
  49. {
  50. cout<<"mesh: EROARE! Nu am putut deschide fisierul mesh.in!"<<endl;
  51. fclose(fp);
  52. return false;
  53. }
  54. if (!fp2)
  55. {
  56. cout<<"mesh: EROARE! Nu am putut deschide fisierul param.in!"<<endl;
  57. fclose(fp2);
  58. fclose(fp);
  59. return false;
  60. }
  61. if (!check_params(x1,x2,y1,y2))
  62. {
  63. fclose(fp2);
  64. fclose(fp);
  65. return false;
  66. }
  67. fprintf(fp2, "%llf %llf %llf %llf %llf %llf\n", x1, x2, y1, y2, pasx, pasy);
  68. for (real i=x1; i<=x2; i+=pasx)
  69. {
  70. par_i++;
  71. for (real j=y1; j<=y2; j+=pasy)
  72. {
  73. if (!checked) par_j++;
  74. fprintf(fp, "%llf %llf %llf\n",i,j,pf(i,j));
  75. }
  76. checked = true;
  77. }
  78. fprintf(fp2, "%li %li\n", par_i, par_j);
  79. fclose(fp2);
  80. fclose(fp);
  81. return true;
  82. }
  83. inline real norm2d(real x, real y)
  84. {
  85. return sqrt(x*x+y*y); // este sqrt(VT*V)
  86. }
  87. inline real dist2d(real x1, real y1, real x2, real y2)
  88. {
  89. return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
  90. }
  91. preal diff2d2(real (*pf)(real,real), real x, real y)
  92. {
  93. preal temp = new real[2];
  94. temp[0] = (pf(x+h,y)-pf(x-h,y))/h;
  95. temp[1] = (pf(x,y+h)-pf(x,y-h))/h;
  96. return temp;
  97. }
  98. preal diff2d5(real (*pf)(real,real), real x, real y) // ret Jacobianul
  99. {
  100. preal temp = new real[2];
  101.  
  102. temp[0] = (-pf(x+2*h,y)+8*pf(x+h,y)-8*pf(x-h,y)+pf(x-2*h,y)) / (12*h);
  103. temp[1] = (-pf(x,y+2*h)+8*pf(x,y+h)-8*pf(x,y-h)+pf(x,y-2*h)) / (12*h);
  104.  
  105. return temp;
  106. }
  107. inline preal genfibvec(dword n)
  108. {
  109. preal fib = new real[n+1];
  110. dword i=0;
  111.  
  112. fib[0] = 0;
  113. fib[1] = 1;
  114. fib[2] = 1;
  115. for (i=2; i<n+1; i++)
  116. fib[i] = fib[i-2] + fib[i-1];
  117.  
  118. return fib;
  119. }
  120. real optmf1d(real (*pf)(real,real), preal fib, preal i, preal pc, preal sd)
  121. {
  122. dword n = 47,
  123. k = 0;
  124. real ak = i[0],
  125. bk = i[1],
  126. ck = 0.0,
  127. dk = 0.0;
  128. bool dbg_cnd1 = fabs(pf(pc[0]+bk*sd[0],pc[1]+bk*sd[1])-pf(pc[0]+ak*sd[0],pc[1]+ak*sd[1]))<dltf,
  129. dbg_cnd2 = fabs(bk-ak)<dltx;
  130. while ((fabs(bk-ak)>dltx) &&
  131. (fabs(pf(pc[0]+bk*sd[0],pc[1]+bk*sd[1])-pf(pc[0]+ak*sd[0],pc[1]+ak*sd[1]))>dltf) &&
  132. (k<n-2))
  133. {
  134. ck = ak + (1-fib[n-1-k]/fib[n-k]) *(bk-ak);
  135. dk = ak + fib[n-1-k]/fib[n-k] *(bk-ak);
  136. if (pf(pc[0]+ck*sd[0],pc[1]+ck*sd[1])<=pf(pc[0]+dk*sd[0],pc[1]+dk*sd[1]))
  137. {
  138. bk = dk;
  139. }
  140. else
  141. {
  142. ak = ck;
  143. }
  144. k++;
  145. }
  146. return fabs(ak+bk)/2;
  147. }
  148. bool optgd2d(real (*pf)(real,real), real x0, real y0, real a, real b)
  149. {
  150. FILE *fp;
  151. dword n = 47;
  152. preal grad = NULL, // gradient intr-un punct
  153. sdir = NULL, // directie de cautare
  154. interval = NULL, // interval de cautare pt 1D
  155. pcurent = NULL, // punct curent
  156. pnou = NULL, // noul punct
  157. fib = genfibvec(n);
  158. real alfa = 0,
  159. alfa_vechi = 0;
  160. dword contor = 0;
  161. bool cndstop = true;
  162.  
  163. fp = fopen("grd_dsc.out","w");
  164. if (!pf)
  165. {
  166. cout<<"optgd2d: LIPSA! Lipseste functia ce trebuie optimizata!\n";
  167. return false;
  168. }
  169. if (!fp)
  170. {
  171. cout<<"optgd2d: EROARE! Nu am putut deschide fisierul grd_dsc.out!\n";
  172. fclose(fp);
  173. return false;
  174. }
  175.  
  176. fprintf(fp,"%llf %llf %llf\n",x0,y0,pf(x0,y0));
  177. grad = diff2d5(pf, x0, y0);
  178. if (dist2d(grad[0],grad[1],0,0)>delta)
  179. {
  180. sdir = new real[2];
  181. sdir[0] = -grad[0]/norm2d(-grad[0],-grad[1]);
  182. sdir[1] = -grad[1]/norm2d(-grad[0],-grad[1]);
  183. interval = new real[2]; interval[0] = a; interval[1] = b;
  184. pcurent = new real[2];
  185. pcurent[0] = x0;
  186. pcurent[1] = y0;
  187. alfa = optmf1d(pf, fib, interval, pcurent, sdir);
  188. pnou = new real[2];
  189. pnou[0] = pcurent[0] + alfa * sdir[0];
  190. pnou[1] = pcurent[1] + alfa * sdir[1];
  191. fprintf(fp,"%llf %llf %llf\n",pnou[0],pnou[1],pf(pnou[0],pnou[1]));
  192. while ((dist2d(pcurent[0],pcurent[1],pnou[0],pnou[1])>delta) &&
  193. (contor<N) && cndstop && (alfa-alfa_vechi!=0))
  194. {
  195. delete []grad;
  196. delete []sdir;
  197. delete []pcurent;
  198. alfa_vechi = alfa;
  199. grad = diff2d5(pf,pnou[0],pnou[1]);
  200. //if (!(grad[0]==0 && grad[1]==0))
  201. if (dist2d(grad[0],grad[1],0,0)>delta)
  202. {
  203. sdir = new real[2];
  204. sdir[0] = -grad[0]/norm2d(-grad[0],-grad[1]);
  205. sdir[1] = -grad[1]/norm2d(-grad[0],-grad[1]);
  206. pcurent = pnou;
  207. alfa = optmf1d(pf, fib, interval, pcurent, sdir);
  208. pnou = new real[2];
  209. pnou[0] = pcurent[0] + alfa * sdir[0];
  210. pnou[1] = pcurent[1] + alfa * sdir[1];
  211.  
  212. fprintf(fp,"%llf %llf %llf\n",pnou[0],pnou[1],pf(pnou[0],pnou[1]));
  213. contor++;
  214. } else cndstop = false;
  215. } //while
  216. delete []pnou;
  217. delete []pcurent;
  218. delete []interval;
  219. delete []sdir;
  220. delete []grad;
  221. } //if
  222.  
  223. delete []fib;
  224. delete []grad;
  225. fclose(fp);
  226. return true;
  227. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement