imsl.gms : 조각별 선형 근사

설명

이 샘플 문제는 측면에서 가장 좋은 조각별 선형 근사치를 찾습니다.
샘플링된 관측치의 절대 편차 합계입니다. 는
보간 가중치 계산은
근사 함수. 사인 함수는 거듭제곱으로도 구현됩니다.
특정 언어 기능을 보여주기 위한 시리즈 확장입니다. 문제는
원시 및 이중 버전에서 해결되었습니다.

소형 모델 유형 :LP


카테고리 : 슬롯 게임 모델 라이브러리


메인 파일 : imsl.gms

$title 조각별 선형 근사(IMSL,SEQ=59)

$onText
이 샘플 문제는 다음과 같은 측면에서 가장 좋은 조각별 선형 근사치를 찾습니다.
샘플링된 관측치의 절대 편차 합계입니다. 는
보간 가중치 계산은
근사 함수. 사인 함수는 거듭제곱으로도 구현됩니다.
특정 언어 기능을 보여주기 위한 시리즈 확장입니다. 문제는
원시 버전과 이중 버전으로 해결되었습니다.

IMSL, LP/PROTRAN - 선형 프로그래밍을 위한 문제 해결 시스템 .
기술. 대표, IMSL INC, 1984.

키워드: 선형 계획법, 조각별 선형 근사, 보간, 수학
$offText

세트
   n '데이터의 x좌표 레이블' / d-00*d-60 /
   m '근사를 위한 x 좌표 레이블' / a-00*a-10 /;

매개변수
   y(n) '데이터 값'
   t(n) '데이터의 x 좌표 값'
   s(m) '근사를 위한 x 좌표 값'
   w(m,n) '보간 가중치';

스칼라
   k 'n / m'
   deltn '데이터 증분'
   deltm '근사치 증분';

t(n) = (ord(n) - 1)/(카드(n) - 1);
s(m) = (ord(m) - 1)/(카드(m) - 1);
k = (카드(n) - 1) / (카드(m) - 1);
abort$[0 <> mod(k,1)] 'k는 정수여야 합니다.', k;
deltm = 1/(카드(m) - 1);
deltn = 1/(카드(n) - 1);

w(m+floor((ord(n)-1)/k),n)$(ord(m) = 1) = 1 - mod(ord(n)-1,k)/k;
w(m+1,n)$w(m,n) = 1 - w(m,n);

* 함수 sin(x)는 0과 pi 사이의 x에 대해 평가됩니다.
* 세트 l과 r은 sin(x)의 멱급수 근사에만 사용됩니다.
세트
   l '멱급수의 길이' / 0*6 /
   r '계산에 필요한 세트' / 0*14 /;

abort$(card(l) > 2*card(r) - 1) "잘못된 근사 세트", l, r;

y(n) = sum(l, power(-1,ord(l) - 1)*power(t(n)*pi,2*ord(l) - 1)/prod(r$(ord(r) <= 2*ord(l) - 1), ord(r)));
y(n) = round(y(n),6);

y, t, s, deltm, deltn, w를 표시합니다.

매개변수 test(n,*) 'sin() 근사값 비교';
test(n,"power-ser") = y(n);
test(n,"sinus-fun") = sin(t(n)*pi);
test(n,"error") = test(n,"sinus-fun") - test(n,"power-ser");

디스플레이 테스트;

변수
   ym(m) '근사값'
   dp(n) '양의 편차'
   dn(n) '음의 편차'
   tdev '총 편차'
   tdual '총 이중 값'
   z(n) '편차의 이중 값';

양수 변수 dp, dn;

방정식
   ddev(n) '편차 정의'
   ddual(m) '이중 정의'
   dtdev '전체 개발 정의'
   dtdual '전체 이중 정의';

ddev(n).. sum(m, w(m,n)*ym(m)) - y(n) =e= dp(n) - dn(n);

ddual(m).. sum(n, w(m,n)*z(n)) =e= 0;

dtdev..tdev =e= sum(n, dp(n) + dn(n));

dtdual.. tdual =e= sum(n, y(n)*z(n)) + 1;

모델
   원시 / ddev, dtdev /
   이중 / 이중, dtdual /;

tdev를 최소화하는 lp를 사용하여 원시 문제를 해결합니다.

매개변수
   prep(n,*) '기본 솔루션 보고서'
   primaldev '원시 해로부터의 절대 편차의 합';

준비(n,"t") = t(n);
준비(n,"y") = y(n);
prep(n,"dev") = dp.l(n) - dn.l(n);
primaldev = sum(n, abs(prep(n,"dev")));

디스플레이 준비, primaldev;

z.lo(n) = -1;
z.up(n) = 1;

tdual을 최대화하는 lp를 사용하여 듀얼을 해결합니다.

매개변수
   drep(n,*) '이중 솔루션 보고서'
   Dualdev '이중 솔루션의 절대 편차 합계';

drep(n,"t") = t(n);
drep(n,"y") = y(n);
drep(n,"dev")= sum(m, -ddual.m(m)*w(m,n)) - y(n);
Dualdev = sum(n, abs(drep(n,"dev")));

디스플레이 drep, Dualdev;