#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,xn,yn,r1,r2; 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); xn=x+alfa*p1; yn=y+alfa*p2; r1=((*g1)(xn,yn))*((*g1)(xn,yn)-(*g1)(x,y)); r2=((*g1)(x,y))*((*g1)(x,y))+((*g2)(x,y))*((*g2)(x,y)); beta=r1/r2; 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)); x=xn; y=yn; k++; } printf ("%f %f\n", x, y); printf ("Broj iteracija: %d", k); return 0; }