Main Content

bvpinit

경계값 문제 솔버의 초기 추측값 생성

설명

예제

solinit = bvpinit(x,yinit)는 초기 메시 x와 초기 해 추측값 yinit를 사용하여 경계값 문제에 대한 초기 추측값을 생성합니다. 그러면 사용자가 초기 추측값 solinitbvp4c 또는 bvp5c에 대한 입력값 중 하나로 사용하여 경계값 문제를 풀 수 있습니다.

예제

solinit = bvpinit(sol,[anew bnew])는 구간 [anew bnew]에서 해에 대한 초기 추측값을 생성합니다. 여기서 solbvp4c 또는 bvp5c에서 얻은 해 구조체입니다. 새 구간 [anew bnew]sol이 정의된 이전 구간보다 커야 합니다. 이전 해 sol은 새 구간으로 외삽됩니다.

solinit = bvpinit(___,parameters)는 경계값 문제의 알 수 없는 파라미터에 대한 초기 추측값 벡터를 지정합니다. 이 구문은 위에 열거된 입력 인수 조합 중 하나와 함께 사용할 수 있습니다.

예제

모두 축소

BVP에 대한 해의 초기 추측값을 만들고 bvp4c를 사용하여 BVP를 푼 다음 해를 새 정의역으로 확장합니다.

BVP 문제에 대한 해의 양호한 초기 추측값을 형성하는 일은 문제를 푸는 과정에서 아마도 가장 어려운 부분일 것입니다. BVP 해는 반드시 고유하지는 않으므로 초기 추측값은 솔버가 반환하는 여러 해 중에서 하나를 정하는 결정적인 단서가 될 수 있습니다. 초기 추측값은 경계 조건을 충족해야 하고, 그 동작이 문제에 대한 일반적인 기대치(해가 진동하는지, 간단한 선형 함수인지 등등)를 반영해야 합니다.

다음과 같은 미분 방정식을 가정해 보겠습니다.

y=-y.

이 방정식에는 다음과 같은 경계 조건이 적용됩니다.

y(0)=y(π)=0.

이 방정식을 1계 시스템으로 코딩하는 함수는 다음과 같습니다.

function dydx = bvpfun(x,y)
dydx = [y(2)
       -y(1)];
end

마찬가지로, 경계 조건을 코딩하는 함수는 다음과 같습니다.

function res = bcfun(ya,yb)
res = [ya(1)
       yb(1)];
end

필요한 함수를 이 예제와 같이 파일 끝에 로컬 함수로 포함시킬 수도 있고, MATLAB® 경로에 있는 디렉터리에 이름이 지정된 별도의 파일로 저장할 수도 있습니다.

함수 핸들이 있는 초기 추측값

방정식에 대한 해가 진동할 것이라고 합리적으로 예상할 수 있으므로, 사인 함수와 코사인 함수가 해의 동작과 고정된 경계점 사이에 있는 해의 도함수의 동작에 대한 양호한 초기 추측값이 됩니다.

function y = guess(x)
y = [sin(x)
     cos(x)];
end

정의역 [0,π]에 균일한 간격으로 배치된 10개의 메시 점과 초기 추측값 함수를 사용하여 해 구조체를 만듭니다.

xmesh = linspace(0,pi,10);
solinit = bvpinit(xmesh,@guess);

BVP 풀기

ODE 함수, 경계 조건 및 해 추측값을 사용하여 bvp4c를 호출합니다. 결과를 플로팅합니다.

sol = bvp4c(@bvpfun, @bcfun, solinit);
plot(sol.x,sol.y,'-o')

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

로컬 함수(Local Function)

BVP 솔버 bvp4c가 해를 계산하기 위해 호출하는 로컬 헬퍼 함수는 다음과 같습니다. 또는 이러한 함수를 MATLAB 경로에 있는 디렉터리에 고유의 파일로 저장할 수도 있습니다.

function dydx = bvpfun(x,y) % equation being solved
dydx = [y(2)
       -y(1)];
end
%-------------------------------------------
function res = bcfun(ya,yb) % boundary conditions
res = [ya(1)
       yb(1)];
end
%-------------------------------------------
function y = guess(x) % guess at solution behavior
y = [sin(x)
     cos(x)];
end
%-------------------------------------------

초기 구간에 대해 BVP를 푼 다음 각 해를 다음 구간에 대한 초기 추측값으로 사용하여 반복적으로 구간을 확장합니다.

다음과 같은 방정식이 있다고 가정해 보겠습니다.

y=y.

이 방정식을 1계 시스템으로 바꾸면 다음과 같이 두 개로 이루어진 연립방정식이 됩니다.

y1=y2,

y2=y1.

이 방정식은 처음에는 구간 [0,3]에 대해 정의되며 다음 경계 조건이 적용됩니다.

y(0)=0,

y(3)=1.

이 방정식을 1계 시스템으로 코딩하는 함수는 다음과 같습니다.

function dydx = bvpfun(x,y)
dydx = [y(2)
        y(1)];
end

마찬가지로, 경계 조건을 코딩하는 함수는 다음과 같습니다.

function res = bcfun(ya,yb)
res = [ya(1)
       yb(1)-1];
end

필요한 함수를 이 예제와 같이 파일 끝에 로컬 함수로 포함시킬 수도 있고, MATLAB 경로에 있는 디렉터리에 이름이 지정된 별도의 파일로 저장할 수도 있습니다.

초기 추측값

지수 함수를 해에 대한 초기 추측값으로 사용합니다. 이 방정식에 2개의 해 성분이 있으므로, 벡터를 반환하는 초기 추측값 함수를 y = guess(x) 형식으로 작성합니다.

function y = guess(x)
y = [exp(x)
     exp(x)];
end

5개 점으로 구성된 메시로 추측값 함수의 동작을 충분히 파악할 수 있습니다.

xmesh = linspace(0,3,5);
solinit = bvpinit(xmesh,@guess);

방정식 풀기

초기 구간 [0,3]에서 방정식을 풀고 y1에 대한 결과를 플로팅합니다.

sol = bvp4c(@bvpfun, @bcfun, solinit);
plot(sol.x(1,:),sol.y(1,:),'-o')

Figure contains an axes object. The axes object contains an object of type line.

구간 확장하기

이번에는 bvpinit를 사용하여 루프에서 적분 구간을 확장하며 각각의 새로운 문제를 풀고 플로팅합니다. 매번 반복할 때마다 이전 해 sol을 새 구간 [0 k]에 반영하여 초기 추측값을 생성합니다. 각각의 새로운 문제에서 bvp4c는 새 경계 [0 k]에 경계 조건을 적용합니다.

hold on
for k = 4:8
    solinit = bvpinit(sol,[0 k]);
    sol = bvp4c(@bvpfun, @bcfun, solinit);
    plot(sol.x(1,:),sol.y(1,:),'-o')
end

Figure contains an axes object. The axes object contains 6 objects of type line.

이 예제에서는 BVP 문제를 보다 작은 구간으로 또는 보다 간단한 문제로 나누어서 푸는 연속법(Continuation)이라는 유용한 기법을 간략히 보여주었습니다. 이 기법에 대한 예제를 보려면 다음을 참조하십시오.

로컬 함수(Local Function)

BVP 솔버 bvp4c가 해를 계산하기 위해 호출하는 로컬 헬퍼 함수는 다음과 같습니다. 또는 이러한 함수를 MATLAB 경로에 있는 디렉터리에 고유의 파일로 저장할 수도 있습니다.

function dydx = bvpfun(x,y) % equation being solved
dydx = [y(2)
        y(1)];
end
%-------------------------------------------
function res = bcfun(ya,yb) % boundary conditions
res = [ya(1)
       yb(1)-1];
end
%-------------------------------------------
function y = guess(x) % guess at solution behavior
y = [exp(x)
     exp(x)];
end
%-------------------------------------------

입력 인수

모두 축소

초기 메시로, 벡터로 지정됩니다. 구간 [a,b]에서 문제를 풀려면 x(1)을 a로 지정하고 x(end)를 b로 지정하십시오. x의 요소는 a < b이면 오름차순이어야 하고 a > b이면 내림차순이어야 합니다. 그러면 솔버가 (메시 점을 추가하고, 제거하고, 이동하여) 이 메시를 해에 적용하게 되며, 대개 x = linspace(a,b,10)과 같은 양호한 추측값이 도출됩니다. 까다로운 문제를 처리하려면 해가 빠르게 변하는 지점에 몇 개의 메시 점을 배치하십시오.

  • 2점 경계값 문제에서 x의 항목은 고유해야 합니다. 즉, a < b이면 항목이 x(1) < x(2) < ... < x(end)를 충족해야 하고 a > b이면 항목이 x(1) > x(2) > ... > x(end)를 충족해야 합니다.

  • 다중 점 경계값 문제(Multipoint Boundary Value Problem)에서는, 경계 조건이 적용되는 [a,b]에서 끝점 a와 끝점 b를 제외한 점을 지정해 x의 항목을 반복할 수 있습니다. 예를 들어, 다음과 같은 벡터가 있다고 가정해 보겠습니다.

    x = [0 0.5 1 1 1.5 2];
    이 메시에서 경계 조건은 끝점 0, 끝점 2, 그리고 반복되는 요소 1 등 세 개 점에 적용됩니다. 일반적으로 반복되는 항목은 [a,b] 영역 사이에 있는 경계점을 나타냅니다. 반복되는 요소 1은 구간 [0 2][0 1][1 2]의 두 영역으로 나눕니다.

예: solinit = bvpinit(linspace(a,b,10),yinit)

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
복소수 지원 여부:

해의 초기 추측값으로, 벡터 또는 함수로 지정됩니다.

  • 벡터 - 해의 각 성분마다 bvpinit가, 대응하는 벡터 요소를 모든 메시 점에 걸친 상수 추측값으로 복제합니다. 즉, yinit(i)x의 모든 메시 점에서 해의 i번째 성분 yinit(i,:)에 대한 상수 추측값입니다.

  • 함수 – 이 추측값 함수(Guess Function)는 지정된 메시 점에 대해, 해의 대응하는 성분에 대한 추측값을 요소로 하는 벡터를 반환해야 합니다. 이 함수는 다음과 같은 형식이어야 합니다.

    y = guess(x)

    x는 메시 점이고 y는 해의 성분 개수와 길이가 같은 벡터입니다. 예를 들어, yinit가 함수인 경우 bvpinit는 각 메시 점에서 다음을 호출합니다.

    y(:,j) = guess(x(j))

    다중 점 경계값 문제에서 추측값 함수(Guess Function)는 다음과 같은 형식어야 합니다.

    y = guess(x,k)

    y는 영역 k에서, x의 해에 대한 초기 추측값입니다. 이 함수는 유연한 추측값 함수(Guess Function) 작성을 위해, 반드시 k를 입력 인수로 받아야 합니다. 그러나 이 함수가 k를 꼭 사용해야 하는 것은 아닙니다.

예: solinit = bvpinit(x,[sqrt(3)/2; 0])

예: solinit = bvpinit(x,@guess)

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | function_handle
복소수 지원 여부:

알 수 없는 파라미터 값에 대한 초기 추측값으로, 스칼라 또는 벡터로 지정됩니다.

예: solinit = bvpinit(x, yinit, [0 1 sqrt(2)])는 3개의 알 수 없는 파라미터에 대한 추측값으로 구성된 벡터를 지정합니다.

예: 알 수 없는 파라미터를 가진 BVP의 예제를 보려면 edit mat4bvp를 입력하십시오.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
복소수 지원 여부:

이전 해로, bvp4c 또는 bvp5c가 반환하는 해 구조체로 지정됩니다. sol에 파라미터가 있으면 solinit로 복사됩니다.

데이터형: struct

출력 인수

모두 축소

해의 초기 추측값으로, 구조체로 반환됩니다. 이 구조체를 bvp4c 또는 bvp5c에 대한 세 번째 입력값으로 사용하여 경계값 문제를 풀 수 있습니다.

확장 기능

버전 내역

R2006a 이전에 개발됨

참고 항목

| | | | |