fmcmap/tp068r3.map


If Cut/Copy and Paste fails, then click here for download.


fmcTitle ("tp068r3"):

# Source version 4
# FMCMAP post processor version 1.1

# FMC's first native input language.
# The Hock & Schittkowski test problem #68.
# This is the formulation of #68 to obtain the reference values for
# tp068r2, i.e., tp068r3 is equivalent to tp068r2 down to the last detail.

a := 0.0001:
b := 1:
d := 1:
n := 24:
ubx2hs := 100:
            # phi0(x[2] = 6) > 9.8*10^(-10)
            # phi0(x[2] = 5) > 2.8*10^( -7)
ubx2r := 4: # phi0(x[2] = 4) > 3.1*10^( -5)
            # phi0(x[2] = 3) > 1.3*10^( -3)
            # phi0(x[2] = 2) > 2.2*10^( -2)
ubx2 := ubx2r:

iv[1] := 1: slb[1] := 0.0001: sub[1] :=  100:
iv[2] := 1: slb[2] := 0:      sub[2] := ubx2:
iv[3] := 1: slb[3] := 0:      sub[3] :=    2:
iv[4] := 1: slb[4] := 0:      sub[4] :=    2:

for i from 1 to 4 do
  fmcInitialValue     (nprintf ("x%d", i),  iv[i]):
  fmcStrongLowerBound (nprintf ("x%d", i), slb[i]):
  fmcStrongUpperBound (nprintf ("x%d", i), sub[i]):
  od:

argn := (-1) * x2 - d * sqrt (n):
arg0 := (-1) * x2:
argp := (-1) * x2 + d * sqrt (n):
argnerfc := (-1) * argn / sqrt (2):
arg0erfc := (-1) * arg0 / sqrt (2):
argperfc := (-1) * argp / sqrt (2):
phin := (1/2) * myerfc (fmc_ident_tcb, argnerfc):
phi0 := (1/2) * myerfc (fmc_ident_tcb, arg0erfc):
phip := (1/2) * myerfc (fmc_ident_tcb, argperfc):
c[1] := x3 - 2 * phi0:
c[2] := x4 - phip - phin: # phin may vanish but not phip
num := b * (exp (x1) - 1) - x3:
den := exp (x1) - 1 + x4:
mf := (a * n - (num / den) * x4) / x1:

for j from 1 to 2 do
  fmcEquality (nprintf ("ce%d", j), c[j]):
  od:

myminfun := mf:
fmcMinimum (myminfun):

fmcFunctionDiffHint ([ myerfc, 0,
  myerfcd (fmcFunctionArg1, fmcFunctionArg2) ]):

fmcExternalCodePath ("../../doc/RevisedHockSchittkowski/src/tp068r3x.c"):

fmcEscortFloat ('argnerfc', argnerfc):
fmcEscortFloat ('arg0erfc', arg0erfc):
fmcEscortFloat ('argperfc', argperfc):

fmcEscortFloat (derfcn, myerfc (fmc_ident_tcb, argnerfc) - erfc (argnerfc)):
fmcEscortFloat (derfc0, myerfc (fmc_ident_tcb, arg0erfc) - erfc (arg0erfc)):
fmcEscortFloat (derfcp, myerfc (fmc_ident_tcb, argperfc) - erfc (argperfc)):

fmcEscortFloat ('phin', phin):
fmcEscortFloat ('phi0', phi0):
fmcEscortFloat ('phip', phip):

# argnerfc =  6.042362036830880
# arg0erfc =  2.578260421693126
# argperfc = -0.8858411934446289

# derfcn =  2.9*10^(-17)
# derfc0 = -1.4*10^(-17)
# derfcp = -4.5*10^(-18)

# phin = 2.1*10^(-17)
# phi0 = 0.0001330678126076933
# phip = 0.8948550393735502

myownabs := proc (x::algebraic) local y: y := fmc_m_abs (x): RETURN (y): end:

myabsdevnod0_0 := myownabs (myminfun + 0.9204250036397504):
myreldevnod0_0 := myownabs (myminfun/0.9204250036397504 + 1):
myabsdevnod0_1 := myownabs (x1 - 0.06785857708551205):
myreldevnod0_1 := myownabs (x1/0.06785857708551205 - 1):
myabsdevnod0_2 := myownabs (x2 - 3.646210855688194):
myreldevnod0_2 := myownabs (x2/3.646210855688194 - 1):
myabsdevnod0_3 := myownabs (x3 - 0.0002661356252153867):
myreldevnod0_3 := myownabs (x3/0.0002661356252153867 - 1):
myabsdevnod0_4 := myownabs (x4 - 0.8948550393735502):
myreldevnod0_4 := myownabs (x4/0.8948550393735502 - 1):
myabsdevnod1_0 := (1/2)*(myownabs (myabsdevnod0_0 - myabsdevnod0_1) + (myabsdevnod0_0 + myabsdevnod0_1)):
myreldevnod1_0 := (1/2)*(myownabs (myreldevnod0_0 - myreldevnod0_1) + (myreldevnod0_0 + myreldevnod0_1)):
myabsdevnod1_2 := (1/2)*(myownabs (myabsdevnod0_2 - myabsdevnod0_3) + (myabsdevnod0_2 + myabsdevnod0_3)):
myreldevnod1_2 := (1/2)*(myownabs (myreldevnod0_2 - myreldevnod0_3) + (myreldevnod0_2 + myreldevnod0_3)):
myabsdevnod1_4 := myabsdevnod0_4:
myreldevnod1_4 := myreldevnod0_4:
myabsdevnod2_0 := (1/2)*(myownabs (myabsdevnod1_0 - myabsdevnod1_2) + (myabsdevnod1_0 + myabsdevnod1_2)):
myreldevnod2_0 := (1/2)*(myownabs (myreldevnod1_0 - myreldevnod1_2) + (myreldevnod1_0 + myreldevnod1_2)):
myabsdevnod2_4 := myabsdevnod1_4:
myreldevnod2_4 := myreldevnod1_4:
myabsdevnod3_0 := (1/2)*(myownabs (myabsdevnod2_0 - myabsdevnod2_4) + (myabsdevnod2_0 + myabsdevnod2_4)):
myreldevnod3_0 := (1/2)*(myownabs (myreldevnod2_0 - myreldevnod2_4) + (myreldevnod2_0 + myreldevnod2_4)):
zmyabsdevmax := myabsdevnod3_0:
zmyreldevmax := myreldevnod3_0:
fmcEscortFloat ('x1', x1):
fmcEscortFloat ('x2', x2):
fmcEscortFloat ('x3', x3):
fmcEscortFloat ('x4', x4):
fmcEscortFloat ('myminfun', myminfun):
fmcEscortFloat ('zmyabsdevmax', zmyabsdevmax):
fmcEscortFloat ('zmyreldevmax', zmyreldevmax):


Stephan K.H. Seidl