Numerical Analysis

Three dimensional max-min optimization

by Reinaldo Baretti Machín
www.geocities.com/serienumerica
www.geocities.com/serienumerica2
[email protected]

c three dimensional max-min  optimization
c See Numerical Analysis Burden & Faires Chapter 9
c exercise set 9.4
c the code presented is used to minimize
c i.e.  sm= sm=amin1(f1,f2,f3,f4,f5,f6)
c to maximize use sm=amax1(f1,f2,f3,f4,f5,f6)
      equivalence(dx,dy,dz,delta),(x,x1) ,(y,x2),(z,x3)
      data nstep ,delta, epsi,tol/ 1000, .01 ,1.e-4, 1.e-2/
      data x0,y0,z0/0.,0.,0./
      eq1(x,y,z)=x+cos(x*y*z)-1.
      eq2(x,y,z)=  (1.-x)**.25+y+.05*z**2-.15*z-1.
      eq3(x,y,z) = -x**2  -.1*y**2+.01*y+z-1.
      f(x,y,z)= eq1(x,y,z)**2  +eq2(x,y,z)**2 + eq3(x,y,z)**2
c      f(x,y,z)=(x-1.)**2 +(y-2.)**2 +(z-3.)**2
      dfdx1(x1,x2,x3)=(f(x1+epsi,x2,x3)-f(x1,x2,x3))/epsi
      dfdx2(x1,x2,x3)=(f(x1,x2+epsi,x3)-f(x1,x2,x3))/epsi
      dfdx3(x1,x2,x3)=(f(x1,x2,x3+epsi)-f(x1,x2,x3))/epsi
      pi=2.*asin(1.)
      kp=int(float(nstep)/20.)
      kount=kp
      s= f(x0,y0,z0)
      do 10 i=1,nstep
      f1=f(x0+dx,y0,z0)
      f2=f(x0-dx,y0,z0)
      f3=f(x0,y0+dy,z0)
      f4=f(x0,y0-dy,z0)
      f5=f(x0,y0,z0+dz)
      f6=f(x0,y0,z0-dz)
      sm=amin1(f1,f2,f3,f4,f5,f6)
      if(sm.eq.f1)then
      x0=x0+dx
      endif
      if(sm.eq.f2)then
      x0=x0-dx
      endif
      if(sm.eq.f3)then
      y0=y0+dy
      endif
      if(sm.eq.f4)then
      y0=y0-dy
      endif
      if(sm.eq.f5)then
      z0=z0+dz
      endif
      if(sm.eq.f6)then
      z0=z0-dz
      endif
      if(i.eq.kount)then
      print 100,x0,y0,z0,f(x0,y0,z0)
      print*,'  '
      kount=kount+kp
      endif
      if(abs(dfdx1(x0,y0,z0)).le.tol.and.abs(dfdx2(x0,y0,z0)).le.tol
     $ .and.abs(dfdx3(x0,y0,z0)).le.tol)goto 300
      if(i.gt.int(.5*float(nstep)))delta=.002
      if(i.gt.int(.8*float(nstep)))delta=.0005
      s=f(x0,y0,z0)
10    continue
100   format(1x,'x0,y0,z0,f=',3(3x,e13.6),2x,e11.4)
300   print*,'number of iterations=',i
      print 100,x0,y0,z0,f(x0,y0,z0)
      print*,'dfdx1,dfdx2,dfdx3=',dfdx1(x0,y0,z0), dfdx2(x0,y0,z0),
     $ dfdx3(x0,y0,z0)
      stop
      end

      RUN
      The initial value is (0., 0., 0.5)
      the root value is  (0., .1, 1.)
       x0,y0,z0,f=    0.000000E+00    0.000000E+00    0.500000E+00   0.2539E+00

 x0,y0,z0,f=    0.000000E+00    0.500000E-01    0.949999E+00   0.4720E-02

 number of iterations= 110
 x0,y0,z0,f=    0.000000E+00    0.100000E+00    0.999999E+00   0.4300E-12
 dfdx1,dfdx2,dfdx3=  0.000106230233  0.000100054858  9.88517713E-005


Hosted by www.Geocities.ws

1