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