qfilter.gms : 쿼드 정밀도 MINOS를 이용한 오디오 필터 설계

설명

주어진:
   오디오 주파수 세트 i,
   매개변수 오메가(i) 및 감마(i)
   양수 변수 u1, u2, v1, v2 및 중간 변수
   U(i) = 1 + u1*sqr(오메가(i)) + u2*전력(오메가(i),4)
   V(i) = 1 + v1*sqr(오메가(i)) + v2*전력(오메가(i),4)

NLP1: 찾기
   최소 베타
   성 abs[V(i)/U(i) - gamma(i)] <= 모든 i에 대한 베타

U(i)를 곱하고 abs[] < beta*U를 다음으로 바꿉니다.
   -베타*U <= V - 감마*U <= 베타*U

베타를 상수로 만들면 LP가 됩니다. 베타 버전의 이진 검색은
비선형 솔버 없이도 솔루션을 제공합니다.  스케일링
오메가의 거듭제곱은 배정밀도만으로는 충분하지 않습니다.
이 모델을 정확하게 풀고 일반적인 경험 법칙을
수렴 허용 오차와 작은 값(즉,
0으로 처리)를 적용하지 않습니다.  4배 정밀도를 사용하면 다음을 얻을 수 있습니다.
의미 있는 결과가 나오지만 수렴 허용 오차를 조정해야 합니다.
MINOS에서는 허용되지 않으며 무료 슬롯에서는 허용되지 않습니다.

소형 모델 유형 :무료 슬롯


카테고리 : 무료 슬롯 모델 라이브러리


메인 파일 : qfilter.gms

$title 쿼드 정밀도 MINOS를 사용한 오디오 필터 설계(QFILTER,SEQ=405)

$onText
주어진:
   오디오 주파수 세트 i,
   매개변수 오메가(i) 및 감마(i)
   양수 변수 u1, u2, v1, v2 및 중간 변수
   U(i) = 1 + u1*sqr(오메가(i)) + u2*전력(오메가(i),4)
   V(i) = 1 + v1*sqr(오메가(i)) + v2*전력(오메가(i),4)

NLP1: 찾기
   최소 베타
   성 abs[V(i)/U(i) - gamma(i)] <= 모든 i에 대한 베타

U(i)를 곱하고 abs[] < beta*U를 다음으로 바꿉니다.
   -베타*U <= V - 감마*U <= 베타*U

베타를 상수로 만들면 LP가 됩니다. 베타 버전의 이진 검색은
비선형 솔버 없이도 솔루션을 제공합니다.  스케일링
오메가의 거듭제곱은 배정밀도만으로는 충분하지 않습니다.
이 모델을 정확하게 풀고 일반적인 경험 법칙을
수렴 허용 오차와 작은 값(즉,
0으로 처리)를 적용하지 않습니다.  4배 정밀도를 사용하면 다음을 얻을 수 있습니다.
의미 있는 결과가 나오지만 수렴 허용 오차를 조정해야 합니다.
MINOS에서는 허용 오차가 없고 무료 슬롯에서는 허용 오차가 없습니다.

Michael A. Saunders, 개인 커뮤니케이션, filter.pdf: 2014년 8월 22일.

키워드: 비선형 프로그래밍, 무료 슬롯 언어 기능, 오디오 필터 설계
$offText

$onDollar

'오디오 주파수' / 20, 125, 250, 500, 750, 1000, 1500 설정
                            2000, 3000, 4000, 6000, 8000, 16000, 32000 /;

매개변수
   오메가(i) '빈도 값'
   감마(i) 'g-제곱'
   g(i) '청력도 측정'
            / 20 1, 750 1.51991, 3000 12.3285, 16000 100
              125 1, 1000 1.51991, 4000 18.7382, 32000 100
              250 1, 1500 2.31013, 6000 50
              500 1, 2000 3.51119, 8000 71 /;

오메가(i) = i.val*2*pi;
감마(i) = sqr(g(i));

무료 변수 베타, z;
양수 변수 u1, u2, v1, v2, U(i), V(i), x(i) '베타 * U(i)';

방정식
   zDef
   xDef(i) 'define x := beta*U(i) - 유일한 비선형 제약 조건'
   absUp(i) '절대값 제약 상반부'
   absLo(i) '절대값 제약조건의 하반부'
   Udef(i)
   VDef(i);

zDef.. z =e= 베타;

xDef(i).. x(i) =e= 베타*U(i);

absUp(i).. V(i) - 감마(i)*U(i) =l= x(i);

absLo(i).. V(i) - 감마(i)*U(i) =g= -x(i);

UDef(i).. U(i) =e= 1 + u1*sqr(omega(i)) + u2*power(omega(i),4);

VDef(i).. V(i) =e= 1 + v1*sqr(omega(i)) + v2*power(omega(i),4);

모델 m / 모두 /;

* 참조에서와 같이 초기값을 계산합니다.
스칼라
   a1 / 2.6e-5 /
   b1 / 2.6e-4 /
   a2 / 3.5e-10 /
   b2 / 3.5e-8 /;

u1.l = sqr(a1) - 2*a2;
v1.l = sqr(b1) - 2*b2;
u2.l = sqr(a2);
v2.l = sqr(b2);

U.l(i) = 1 + u1.l*sqr(omega(i)) + u2.l*power(omega(i),4);
V.l(i) = 1 + v1.l*sqr(omega(i)) + v2.l*power(omega(i),4);

$onEcho >quadminos.o10
타당성 공차 1e-14
$offEcho

$onEcho >quadminos.o11
타당성 공차 1e-17
$offEcho

스칼라
   dTol '수렴 tol' / 1e-5 /
   델타 '오류 경계'
   n '반복 횟수' / 0 /
   로베타 / 274.5 /
   업베타 / 275 /;

옵션 lp = 쿼드미노스, sysOut = 꺼짐, solPrint = 자동;
m.opt파일 = 10;
m.tolProj = 1e-24;
m.holdFixed = 1;
m.tryLinear = 1;

파일 fp / '' /;
fp.nr = 2;
fp.nw = 18;
fp.nd = 10;
fp.nz = 1e-30;
fp를 넣어;

* 왼쪽 끝점 시도: 실행 불가능해야 함
beta.fx = loBeta;
x.l(i) = 베타.l*U.l(i);

nlp min z를 사용하여 m을 해결합니다.
abort$[m.modelStat <> %modelStat.infeasible%] '왼쪽 끝점은 실행 불가능할 것으로 예상됩니다.', loBeta;

* 올바른 끝점 시도: 실행 가능해야 함
beta.fx = upBeta;
x.l(i) = 베타.l*U.l(i);

nlp min z를 사용하여 m을 해결합니다.
abort$[m.modelStat <> %modelStat.optimal%] '올바른 끝점이 실현 가능하다고 예상됨', upBeta;

* 웜 스타트를 사용하면 더 작은 허용 오차로 문제를 해결할 수 있습니다.
m.opt파일 = 11;
x.l(i) = 베타.l*U.l(i);

nlp min z를 사용하여 m을 해결합니다.
abort$[m.modelStat <> %modelStat.optimal%] '작은 tol로 올바른 끝점이 가능할 것으로 예상됨', upBeta;

동안1,
   델타 = upBeta - loBeta;
   break$(델타 <= dTol);

   n = n + 1;
   beta.fx = loBeta + 0.5*delta;
   x.l(i) = 베타.l*U.l(i);
   putClose ''
      / 'n = ', n:0:0, ' delta = ', delta, ' beta = ', beta.l /;

   nlp min z를 사용하여 m을 해결합니다.
   중단$[(m.modelStat <> %modelStat.optimal%) 및
          (m.modelStat <> %modelStat.infeasible%)] '예기치 않은 모델 상태', m.modelStat, beta.l;
   if(m.modelStat = %modelStat.optimal%),
      upBeta = 베타.l;
   그렇지 않으면
      loBeta = 베타.l;
      beta.fx = upBeta;
   ;
;

if(m.modelStat <> %modelStat.optimal%),
   x.l(i) = 베타.l*U.l(i);
   putClose ''
      / '오른쪽 끝점에서 최종 해결' /;

   nlp min z를 사용하여 m을 해결합니다.
   abort$[(m.modelStat <> %modelStat.optimal%)] '종료 시 실현 가능한 베타가 예상됨', m.modelStat, beta.l;
;

''를 넣어
  / '종료 성공'
  / '반복 횟수: ', n:10:0
  / ' dTol: ', dTol
  / '델타: ', 델타
  / '베타:', beta.l
  / ' loBeta: ', loBeta
  / ' u1: ', u1.l
  / 'u2:', u2.l
  / ' v1: ', v1.l
  / ' v2: ', v2.l
  /;