/* FILE: mynewt2.c begins. */ /* gcc mynewt2.c -L../lib -o a -lm -lnr */ #include #include #define NRANSI #include "../lib/nr.h" #include "../lib/nrutil.h" /* #include "../../lib/newt.c" */ #include "../gnuplot/gnusurf.c" #define SCALE 1 #define N 2 void funcv(int n,float x[],float f[]) { f[1]=SQR(x[1])+SQR(x[2])-2.0; f[2]=exp(x[1]-1.0)+x[2]*SQR(x[2])-2.0; } double ff(double x, double y) { float *u, *v, tmp; u=vector(1,N); v=vector(1,N); u[1]=x; u[2]=y; funcv(2,u,v); tmp=v[1]*v[1]+v[2]*v[2]; free_vector(u,1,N); free_vector(v,1,N); return pow(tmp, 0.5); } int main() { int i,check, p,k; float *x,*f,*x0; double xx[]={-2.,10.},yy[]={-2.,10.}; x=vector(1,N); f=vector(1,N); x0=vector(1,N); for (k=0;k<=3;k++) for (p=0;p<=3;p++) { x[1]=0.5+k; x0[1]=x[1]; x[2]=0.5+p; x0[2]=x[2]; printf(" \n ---------------------- \n"); newt(x,N,&check,funcv); funcv(N,x,f); if (check) printf("Convergence problems.\n"); printf("%5s %12s %12s %12s\n","Index","xstart", "x","f"); for (i=1;i<=N;i++) printf("%5d %12.6f %12.6f %12.4e\n",i,x0[i],x[i],f[i]); } gnusurf(ff,xx,yy,SCALE,0,"ff(x,y)","|ff(x,y)|"); free_vector(f,1,N); free_vector(x,1,N); return 0; } #undef NRANSI /* FILE: mynewt2.c ends. */ /* ---------------------- Index xstart x f 1 0.500000 1.000002 7.1526e-06 2 0.500000 1.000002 6.9141e-06 ---------------------- Index xstart x f 1 0.500000 1.000000 8.3447e-07 2 1.500000 1.000001 2.0862e-06 ---------------------- Index xstart x f 1 0.500000 -0.713747 -3.1296e-08 2 2.500000 1.220887 2.4626e-08 ---------------------- Index xstart x f 1 0.500000 -0.713747 -3.1296e-08 2 3.500000 1.220887 2.4626e-08 ---------------------- Index xstart x f 1 1.500000 1.000000 1.1921e-07 2 0.500000 1.000000 2.9802e-07 ---------------------- Index xstart x f 1 1.500000 0.999999 1.4305e-06 2 1.500000 1.000002 3.8147e-06 ---------------------- Index xstart x f 1 1.500000 1.000000 0.0000e+00 2 2.500000 1.000000 0.0000e+00 ---------------------- Index xstart x f 1 1.500000 0.999990 2.1697e-05 2 3.500000 1.000021 5.2811e-05 ---------------------- Index xstart x f 1 2.500000 1.000000 0.0000e+00 2 0.500000 1.000000 0.0000e+00 ---------------------- Index xstart x f 1 2.500000 1.000000 9.5368e-07 2 1.500000 1.000001 2.3842e-06 ---------------------- Index xstart x f 1 2.500000 1.000000 1.1921e-07 2 2.500000 1.000000 2.9802e-07 ---------------------- Index xstart x f 1 2.500000 -0.713747 2.5979e-07 2 3.500000 1.220887 5.5769e-07 ---------------------- Index xstart x f 1 3.500000 1.000000 5.9605e-07 2 0.500000 1.000001 1.7285e-06 ---------------------- Index xstart x f 1 3.500000 0.999988 2.3723e-05 2 1.500000 1.000023 5.8593e-05 ---------------------- Index xstart x f 1 3.500000 -0.713747 1.4465e-06 2 2.500000 1.220888 4.3966e-06 ---------------------- Index xstart x f 1 3.500000 -0.713747 5.3790e-08 2 3.500000 1.220887 1.3886e-08 Give the x-interval for ff(x,y) (x1 x2): Enter x1 [-2.0000000000,...,10.0000000000]:-0.5 Enter x2 [-0.5000000000,...,10.0000000000]:1.5 Enter h [0.0000000001,...,1.8000000000]:0.1 Give the y-interval for ff(x,y) (y1 y2): Enter y1 [-2.0000000000,...,10.0000000000]:-0.5 Enter y2 [-0.5000000000,...,10.0000000000]:1.5 Enter h [0.0000000001,...,1.8000000000]:0.1 Press enters f = ff(x,y) In the region -0.5 < x < 1.5, -0.5 < y < 1.5 Minimal function value 0 Attained at x = 1 , y = 1 Maximal function value 2.94709 Attained at x = 1.4 , y = 1.4 */