fitlib01.gms : 슬롯 무료체험 내에서 FITPACK 사용 테스트

설명

이 테스트는 fitfclib 라이브러리를 사용합니다. 이 라이브러리에는 다음이 작성한 FITPACK이 포함되어 있습니다.
P. Dierckx 교수, 슬롯 무료체험 내부에서 다음 기능을 사용할 수 있는 방식
도서관 시설.
우리는 어느 정도의 스플라인(이 경우 3과 4)이 보간될 수 있는지 테스트합니다.
정확히 같은 차수의 다항식 함수. 이것은 곡선에 대해 다음과 같이 수행됩니다.
표면에도 마찬가지입니다.

기여자: L. Westermann

소형 모델 유형 :슬롯 무료체험


카테고리 : 슬롯 무료체험 테스트 라이브러리


메인 파일 : fitlib01.gms

$title 슬롯 무료체험 내에서 FITPACK 사용 테스트 (FITLIB01,SEQ=528)

$onText
이 테스트에서는 fitfclib 라이브러리를 사용합니다. 이 라이브러리에는 다음이 작성한 FITPACK이 포함되어 있습니다.
P. Dierckx 교수, 슬롯 무료체험 내부에서 다음 기능을 사용할 수 있는 방식
도서관 시설.
우리는 어느 정도의 스플라인(이 경우 3과 4)이 보간될 수 있는지 테스트합니다.
정확히 같은 차수의 다항식 함수. 이것은 곡선에 대해 다음과 같이 수행됩니다.
표면에도 마찬가지입니다.

기여자: L. Westermann
$offText

* 데이터를 생성하여 GDX 파일에 씁니다.
$onEcho > data.gms
m /0*120/로 설정
n(m) /0*10 /로 설정
매개변수 nv(m);
nv(n) = 5*(ord(n)-1)/(카드(n)-1);
nv(n)$(nv(n)=0) = EPS;
매개변수 fitdata(*,m,*);
fitdata('1',n,'x') = nv(n);
fitdata('1',n,'y') = 1 + 2*nv(n) + 3*nv(n)**2 + 4*nv(n)**3;

fitdata('2',n,'x') = nv(n);
fitdata('2',n,'y') = 1 + 2*nv(n) + 3*nv(n)**2 + 4*nv(n)**3 + 5*nv(n)**4 ;

별칭(n,nn);
스칼라 cnt /1/;
루프(n,
  루프(nn,
    fitdata('3',m,'x')$(ord(m)=cnt) = nv(n);
    fitdata('3',m,'y')$(ord(m)=cnt) = nv(nn);
    fitdata('3',m,'z')$(ord(m)=cnt) = 1 + 2*nv(n)*nv(nn) + 3*(nv(n)*nv(nn))**2 + 4*(nv(n)*nv(nn))**3;

    fitdata('4',m,'x')$(ord(m)=cnt) = nv(n);
    fitdata('4',m,'y')$(ord(m)=cnt) = nv(nn);
    fitdata('4',m,'z')$(ord(m)=cnt) = 1 + 2*nv(n)*nv(nn) + 3*(nv(n)*nv(nn))**2 + 4*(nv(n)*nv(nn))**3 + 5*(nv(n)*nv(nn))**4;

    CNT = CNT + 1;
  );
);

Execute_unload 'fit' fitdata;
$offEcho

$call 슬롯 무료체험 data.gms lo=%슬롯 무료체험lo%

n 노드 설정 /0*100/;
별칭(n,nn);
매개변수 nv(n);
nv(n) = 5*(ord(n)-1)/(카드(n)-1);

* 외부 함수 로드
$funcLibIn fitlib fitfclib
함수 fitp /fitlib.fitparam/
         적합 /fitlib.fitfunc /;

기능 설정 /ord3, ord4 /
    h 헤더 /func, grad, hess /;

매개변수 fittestC(funcs,*,h,n) 테스트 곡선 결과
          fittestS(funcs,*,h,n,n) 테스트 표면 결과;

fittestC('ord3','orig' ,'func',n) = 1 + 2*nv(n) + 3*nv(n)**2 + 4*nv(n)**3;
fittestC('ord3','orig' ,'grad',n) = 2 + 6*nv(n) + 12*nv(n)**2;
fittestC('ord3','orig' ,'hess',n) = 6 + 24*nv(n) ;

fittestC('ord3','spline','func',n) = fit ( 1,nv(n));
fittestC('ord3','spline','grad',n) = fit.grad(2 :1,nv(n));
fittestC('ord3','spline','hess',n) = fit.hess(2:2:1,nv(n));

스칼라 rc;
* 함수 2~4에서 x에 대한 스플라인 각도 설정
rc = 핏p(2,2,4);
fittestC('ord4','orig' ,'func',n) = 1 + 2*nv(n) + 3*nv(n)**2 + 4*nv(n)**3 + 5*nv(n)**4 ;
fittestC('ord4','orig' ,'grad',n) = 2 + 6*nv(n) + 12*nv(n)**2 + 20*nv(n)**3 ;
fittestC('ord4','orig' ,'hess',n) = 6 + 24*nv(n) + 60*nv(n)**2 ;

fittestC('ord4','spline','func',n) = fit ( 2,nv(n));
fittestC('ord4','spline','grad',n) = fit.grad(2 :2,nv(n));
fittestC('ord4','spline','hess',n) = fit.hess(2:2:2,nv(n));

fittestS('ord3','orig ','func',n,nn) = 1 + 2*nv(n)*nv(nn) + 3*(nv(n)*nv(nn))**2 + 4*(nv(n) * nv(nn))**3;
* x/n에 대해서만 Grad 및 Hess
fittestS('ord3','orig ','grad',n,nn) = 2*nv(nn) + 6* nv(n)*nv(nn)**2 + 12* nv(n)**2 * nv(nn)**3;
fittestS('ord3','orig ','hess',n,nn) = + 6* nv(nn)**2 + 24* nv(n) * nv(nn)**3;

fittestS('ord3','spline','func',n,nn) = fit ( 3,nv(n),nv(nn));
fittestS('ord3','spline','grad',n,nn) = fit.grad(2 :3,nv(n),nv(nn));
fittestS('ord3','spline','hess',n,nn) = fit.hess(2:2:3,nv(n),nv(nn));

* 기능 4~4에서 x와 y에 대한 스플라인 각도 설정
rc = fitp(4,2,4);
rc = fitp(4,3,4);

fittestS('ord4','orig ','func',n,nn) = 1 + 2*nv(n)*nv(nn) + 3*(nv(n)*nv(nn))**2 + 4*(nv(n) * nv(nn))**3 + 5 *(nv(n) * nv(nn))**4;
* x/n에 대해서만 Grad 및 Hess
fittestS('ord4','orig ','grad',n,nn) = 2*nv(nn) + 6* nv(n)*nv(nn)**2 + 12* nv(n)**2 * nv(nn)**3 + 20* nv(n)**3 * nv(nn)**4;
fittestS('ord4','orig ','hess',n,nn) = + 6* nv(nn)**2 + 24* nv(n) * nv(nn)**3 + 60* nv(n)**2 * nv(nn)**4;

fittestS('ord4','spline','func',n,nn) = fit ( 4,nv(n),nv(nn));
fittestS('ord4','spline','grad',n,nn) = fit.grad(2 :4,nv(n),nv(nn));
fittestS('ord4','spline','hess',n,nn) = fit.hess(2:2:4,nv(n),nv(nn));

매개변수 MeanAbsDiffC(funcs,h)
          MeanAbsDiffS(funcs,h);

MeanAbsDiffC(funcs,h) = sum(n,abs(fittestC(funcs,'orig',h,n)-fittestC(funcs,'spline',h,n)))/card(n);
MeanAbsDiffS(funcs,h) = sum((n,nn),abs(fittestS(funcs,'orig',h,n,nn)-fittestS(funcs,'spline',h,n,nn)))/(card(n)*card(nn));

abort$(smax((funcs,h),MeanAbsDiffC(funcs,h))>1e-8) '스플라인이 곡선을 정확하게 보간하지 않았습니다.', MeanAbsDiffC;
abort$(smax((funcs,h),MeanAbsDiffS(funcs,h))>1e-8) '스플라인이 표면을 정확하게 보간하지 않았습니다.', MeanAbsDiffS;