#include #include #include #include double Rosen (double x, double y) { double z; z=100*(x-y*y)*(x-y*y)+(1-x*x)*(1-x*x); return z; } double grad1 (double x, double y) { double z; z=200*(x-y*y)-4*x*(1-x*x); return z; } double grad2 (double x, double y) { double z; z=-400*y*(x-y*y); return z; } int main () { double x, y, pom1, p1, p2, pom2, alfa, beta, pom3, b1, b2; int k, i, j; double (*f)(double x, double y); double (*g1)(double x, double y); double (*g2)(double x, double y); f=&Rosen; g1=&grad1; g2=&grad2; x=0.25; y=0; p1=-(*g1)(x,y); p2=-(*g2)(x,y); k=0; pom1=1; while (pom1>0.0001) { b1=(196+8*x)*p1-400*y*p2; b2=-400*y*p1+1200*y*y*p2; pom3=b1*p1+b2*p2; alfa=-((*g1)(x,y)*p1+(*g2)(x,y)*p2)/pom3; pom2=(*g1)(x,y)*(*g1)(x,y)+(*g2)(x,y)*(*g2)(x,y); x=x+alfa*p1; y=y+alfa*p2; beta=((*g1)(x,y)*(*g1)(x,y)+(*g2)(x,y)*(*g2)(x,y))/pom2; p1=-(*g1)(x,y)+beta*p1; p2=-(*g2)(x,y)+beta*p2; pom1=sqrt((*g1)(x,y)*(*g1)(x,y)+(*g2)(x,y)*(*g2)(x,y)); k++; } printf ("%f %f\n", x, y); printf ("Broj iteracija: %d", k); return 0; }