Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

makima

조각별 3차 에르미트 다항식 변형 보간

설명

예제

yq = makima(x,y,xq)는 쿼리 점 xq에서 보간된 값 yq를 구하기 위해 샘플 점 x에서의 y 값을 사용하여 수정된 아키마 보간(Modified Akima)을 수행합니다.

예제

pp = makima(x,y)ppval 및 스플라인 유틸리티 unmkpp와 함께 사용하기 위한 조각별 다항식 구조체를 반환합니다.

예제

모두 축소

makima를 사용하여 간격이 균일하지 않은 샘플 점에서 코사인 곡선을 보간합니다.

x = [0 1 2.5 3.6 5 7 8.1 10];
y = cos(x);
xq = 0:.25:10;
yq = makima(x,y,xq);
plot(x,y,'o',xq,yq,'--')

Figure contains an axes. The axes contains 2 objects of type line.

진동 함수를 사용하여 아키마 알고리즘이 국소 극값 근처의 곡선을 평탄화합니다. 이 평탄화를 보상하려면 국소 극값 근처에 더 많은 샘플 점을 추가하면 됩니다.

x=6.5x=9를 추가하고 보간을 다시 플로팅합니다.

x = [0 1 2.5 3.6 5 6.5 7 8.1 9 10];
y = cos(x);
xq = 0:.25:10;
yq = makima(x,y,xq);
plot(x,y,'o',xq,yq,'--')

Figure contains an axes. The axes contains 2 objects of type line.

두 개의 다른 데이터 세트에 대해 spline, pchip, makima에서 생성된 보간 결과를 비교합니다. 이들 함수는 모두 다양한 형태의 조각별 3차 에르미트 보간을 수행합니다. 각각의 함수는 보간 함수의 기울기를 계산하는 방법이 다르므로, 기본 데이터에 평탄 영역이나 요동이 있을 때 다양한 동작이 나타납니다.

평탄 영역을 연결하는 샘플 데이터에 대한 보간 결과를 비교합니다. x 값, 해당 점에서의 함수 값 y, 쿼리 점 xq로 구성된 벡터를 만듭니다. spline, pchip, makima를 사용하여 쿼리 점에서 보간을 계산합니다. 비교를 위해 쿼리 점에서 보간된 함수 값을 플로팅합니다.

x = -3:3; 
y = [-1 -1 -1 0 1 1 1]; 
xq1 = -3:.01:3;
p = pchip(x,y,xq1);
s = spline(x,y,xq1);
m = makima(x,y,xq1);
plot(x,y,'o',xq1,p,'-',xq1,s,'-.',xq1,m,'--')
legend('Sample Points','pchip','spline','makima','Location','SouthEast')

Figure contains an axes. The axes contains 4 objects of type line. These objects represent Sample Points, pchip, spline, makima.

이 경우, pchipmakima는 오버슈트를 피하고 평탄 영역을 정확하게 연결할 수 있다는 점에서 비슷하게 동작합니다.

진동 샘플 함수를 사용하여 두 번째 비교를 수행합니다.

x = 0:15;
y = besselj(1,x);
xq2 = 0:0.01:15;
p = pchip(x,y,xq2);
s = spline(x,y,xq2);
m = makima(x,y,xq2);
plot(x,y,'o',xq2,p,'-',xq2,s,'-.',xq2,m,'--')
legend('Sample Points','pchip','spline','makima')

Figure contains an axes. The axes contains 4 objects of type line. These objects represent Sample Points, pchip, spline, makima.

기본 함수가 진동 함수인 경우 국소 극값 근처에서 과감하게 평탄화되는 pchip보다 splinemakima가 점 사이의 움직임을 포착하는 능력이 더 우수합니다

샘플 점 x와 이러한 점에서의 값 y에 대한 벡터를 만듭니다. makima를 사용하여 데이터에 대한 조각별 다항식 구조체를 생성합니다.

x = -5:5;
y = [1 1 1 0 0 1 1 2 2 2 2];
pp = makima(x,y)
pp = struct with fields:
      form: 'pp'
    breaks: [-5 -4 -3 -2 -1 0 1 2 3 4 5]
     coefs: [10x4 double]
    pieces: 10
     order: 4
       dim: 1

구조체에는 데이터를 포괄하는 차수가 4인 10개의 다항식에 대한 정보가 포함됩니다. pp.coefs(i,:)에는 절점 [breaks(i) breaks(i+1)]에 의해 정의된 영역에서 유효한 다항식 계수가 포함됩니다.

구조체에 ppval을 사용하여 여러 쿼리 점에서 보간을 계산한 다음 결과를 플로팅합니다. 3개 이상의 상수 점이 있는 영역에서 아키마 알고리즘은 직선을 사용하여 각 점을 연결합니다.

xq = -5:0.2:5;
m = ppval(pp,xq);
plot(x,y,'o',xq,m,'-.')
ylim([-0.2 2.2])

Figure contains an axes. The axes contains 2 objects of type line.

입력 인수

모두 축소

샘플 점으로, 벡터로 지정됩니다. 벡터 x는 데이터 y가 주어지는 점을 지정합니다. x의 요소는 유일해야 합니다.

데이터형: single | double

샘플 점에서의 함수 값으로, 숫자형 벡터, 행렬 또는 배열로 지정됩니다. xy와 길이가 동일해야 합니다.

y가 행렬이나 배열인 경우 마지막 차원의 값 y(:,...,:,j)x와 일치시킬 값으로 간주됩니다. 이 경우, y의 마지막 차원은 x와 길이가 동일해야 합니다.

데이터형: single | double

쿼리 점으로, 스칼라, 벡터, 행렬 또는 배열로 지정됩니다. xq에 지정된 점은 makima가 계산하는 보간된 함수 값 yq의 x 좌표입니다.

데이터형: single | double

출력 인수

모두 축소

쿼리 점에서 보간된 값으로, 스칼라, 벡터, 행렬 또는 배열로 반환됩니다. yq의 크기는 다음과 같이 yxq의 크기와 관련이 있습니다.

  • y가 벡터인 경우, yqxq와 크기가 동일합니다.

  • y가 크기 Ny = size(y)로 구성된 배열인 경우, 다음 조건이 적용됩니다.

    • xq가 스칼라나 벡터인 경우, size(yq)[Ny(1:end-1) length(xq)]를 반환합니다.

    • xq가 배열인 경우 size(yq)[Ny(1:end-1) size(xq)]를 반환합니다.

조각별 다항식으로, 구조체로 반환됩니다. 이 구조체를 ppval 함수와 함께 사용하여 한 개 이상의 쿼리 점에서 보간 다항식의 값을 계산합니다. 이 구조체는 다음 필드를 가집니다.

필드설명
form

조각별 다항식의 경우 'pp'

breaks

L 구간의 시작과 끝에 해당하는 순증가하는 요소가 포함된, 길이가 L+1인 벡터

coefs

각 행 coefs(i,:)i번째 구간 [breaks(i),breaks(i+1)]k차 다항식의 로컬 계수가 포함된 L×k 행렬

pieces

구간 조각의 개수, L

order

다항식의 차수

dim

대상의 차원

coefs의 다항식 계수는 각 구간의 로컬 계수이기 때문에, 이 계수를 일반적인 다항 방정식에서 사용하려면 대응하는 매듭 구간의 아래쪽 끝점을 빼야 합니다. 즉, 구간 [x1,x2]에서 계수 [a,b,c,d]에 대해, 대응하는 다항식은 다음과 같습니다.

f(x)=a(xx1)3+b(xx1)2+c(xx1)+d.

세부 정보

모두 축소

수정된 아키마 보간(Modified Akima)

1차원 보간에 대한 아키마 알고리즘은 연속 1계 도함수(C1)를 갖는 조각별 다항식들을 생성하기 위해 3차 보간을 수행합니다. 자세한 설명은 [1][2]를 참조하십시오. 이 알고리즘은 과도한 국소 요동을 방지합니다.

δi=vi+1vixi+1xi가 구간 [xixi+1)의 기울기이면 샘플 점 xi에서의 도함수 di의 값은 인근 기울기들의 가중 평균입니다.

di=w1w1+w2δi1+w2w1+w2δi.

아키마의 기존 공식에서 가중치는 다음과 같습니다.

w1=|δi+1δi|,w2=|δi1δi2|.

기존 아키마 알고리즘은 양쪽 점에 동일한 가중치를 주므로 요동이 균일하게 분배됩니다.

기울기가 서로 다른 두 평탄 영역이 만나는 경우, 기존 아키마 알고리즘에 적용된 수정 사항은 기울기가 0에 더 가까운 쪽에 가중치를 더 줍니다. 수정된 알고리즘은 가로에 더 가까운 쪽에 우선 순위를 주는데, 이는 보다 직관적이면서 오버슈트를 방지합니다. 특히, 동일직선상의 점이 3개 이상 연속될 때마다 이 알고리즘은 이러한 점들을 직선으로 연결하므로 오버슈트를 방지합니다.

수정된 아키마 알고리즘에서 사용하는 가중치는 다음과 같습니다.

w1=|δi+1δi|+|δi+1+δi|2,w2=|δi1δi2|+|δi1+δi2|2.

아키마 알고리즘은 spline 알고리즘과 비교했을 때 요동을 더 적게 생성하며 평탄 영역 간의 빠른 변화를 처리하기에 더 적합합니다. pchip 알고리즘에 비해 아키마 알고리즘은 과감하게 평탄화되지 않으므로 진동 데이터를 처리할 수 있습니다.

참고 문헌

[1] Akima, Hiroshi. "A new method of interpolation and smooth curve fitting based on local procedures." Journal of the ACM (JACM) , 17.4, 1970, pp. 589–602.

[2] Akima, Hiroshi. "A method of bivariate interpolation and smooth surface fitting based on local procedures." Communications of the ACM , 17.1, 1974, pp. 18–20.

R2019b에 개발됨