fnsqexp2.gms : sqexp 내장의 정확성 테스트

설명

sqexp(x,S) = exp(x) if x <= S
               exp(S) * (1 + r + r^2/2) 그렇지 않으면 r = x - S
S <= 150인 경우 기본값 S = 150입니다.

기고자: Steve, 2017년 3월

소형 모델 유형 :메가 슬롯


카테고리 : 메가 슬롯 테스트 라이브러리


메인 파일 : fnsqexp2.gms 포함: fnset_xy.inc[htmlfntest_xy.inc[html]

$title 'sqexp 내장의 정확성 테스트' (FNSQEXP2,SEQ=720)

$onText
sqexp(x,S) = exp(x) x <= S인 경우
               exp(S) * (1 + r + r^2/2) 그렇지 않으면 r = x - S
S <= 150인 경우 기본값 S = 150입니다.

기고자: Steve, 2017년 3월
$offText

$include fnset_xy.inc

스칼라 xd;
담당자 = 8e-16;
세트
  티/
    t1 * t6,
    t11 * t16
    t21 * t26
  /
  티맵(t,t) /
    t3. (t4*t6)
    t13.(t14*t16)
    t23.(t24*t26)
  /
  TC(티)
  ;
별칭(t,t2);
tc(t2) = 합계t, tmap(t,t2);

테이블 데이터(T,V)
        x y f_ fx_ fxx_ rc_ ec_
t1 1 150
t2 149 150
t3 150 150
t4 150.001 150
t5 151 150
t6 1e117 150

t11 1 20
t12 19 20
t13 20 20
t14 20.0001 20
t15 30 20
t16 1e145 20

t21 -50 -20
t22 -21 -20
t23 -20 -20
t24 -19.9999 -20
t25 0 -20
t26 1e148 -20
;

* 루프T$[data(T,'x') <= 데이터(T,'y')],
루프T$[tc(t) 아님],
  data(T, 'f_') = exp(data(T,'x'));
  data(T, 'fx_') = data(T,'f_');
  data(T,'fxx_') = data(T,'f_');
;
루프tmap(t,t2),
  xd = 데이터(t2,'x')-데이터(t,'x');
  data(t2, 'f_') = data(t,'f_') * (1 + xd + 0.5*sqr(xd));
  data(t2, 'fx_') = data(t,'f_') * (1 + xd);
  데이터(t2,'fxx_') = 데이터(t,'f_');
;

루프 T,
  data(T,'fxy_') = data(T,'fxy_');

  data(T, 'f') = sqexp.value( data(T,'x'),data(T,'y'));
  data(T, 'fx') = sqexp.grad(1: data(T,'x'),data(T,'y'));
  data(T, 'fy') = sqexp.grad(2: data(T,'x'),data(T,'y'));
  data(T,'fxx') = sqexp.hess(1:1:data(T,'x'),data(T,'y'));
  data(T,'fxy') = sqexp.hess(1:2:data(T,'x'),data(T,'y'));
  data(T,'fyx') = sqexp.hess(2:1:data(T,'x'),data(T,'y'));
  data(T,'fyy') = sqexp.hess(2:2:data(T,'x'),data(T,'y'));
  data(T, 'rc') = mathlastrc;
  data(T, 'ec') = mathlastec;
;

데이터 표시;

$include fntest_xy.inc