두 개의 해를 갖는 BVP 풀기
이 예제에서는 두 개의 서로 다른 초기 추측값을 갖는 bvp4c
를 사용하여 BVP 문제에 대한 두 개의 해를 구합니다.
다음과 같은 미분 방정식을 가정해 보겠습니다.
.
이 방정식에는 다음 경계 조건이 적용됩니다.
.
MATLAB®에서 이 방정식을 풀려면 경계값 문제 솔버 bvp4c
를 호출하기 전에 방정식과 경계 조건을 코딩한 다음 해에 적합한 초기 추측값을 생성해야 합니다. 필요한 함수를 이 예제와 같이 파일 끝에 로컬 함수로 포함시킬 수도 있고, MATLAB 경로에 있는 디렉터리에 이름이 지정된 별도의 파일로 저장할 수도 있습니다.
방정식 코딩하기
방정식을 코딩하는 함수를 만듭니다. 이 함수는 시그니처 dydx = bvpfun(x,y)
또는 dydx = bvpfun(x,y,parameters)
를 사용해야 합니다. 여기서,
x
는 독립 변수입니다.y
는 해입니다(종속 변수).parameters
는 알 수 없는 파라미터 값의 벡터입니다(선택 사항).
이 입력값은 솔버에 의해 자동으로 함수로 전달되지만 변수 이름에 따라 방정식 코딩 방식이 달라집니다. 이 경우 2계 방정식을 1계 연립방정식으로 다시 작성할 수 있습니다.
,
.
이러한 방정식을 인코딩하는 함수는 다음과 같습니다.
function dydx = bvpfun(x,y) dydx = [y(2) -exp(y(1))]; end
경계 조건 코딩하기
이 문제처럼 2점 경계값 조건의 경우, 경계 조건 함수는 알 수 없는 파라미터 포함 여부에 따라 시그니처 res = bcfun(ya,yb)
또는 res = bcfun(ya,yb,parameters)
를 사용해야 합니다. ya
와 yb
는 솔버가 자동으로 함수에 전달하는 열 벡터이며 bcfun
은 경계 조건에서의 잔차를 반환합니다.
경계 조건 의 경우 bcfun
함수는 잔차 값이 두 경계에서 모두 0임을 지정합니다. 이 잔차 값은 초기 추측값의 bvpinit
에 지정한 메시의 첫 번째 점과 마지막 점에서 적용됩니다. 이 문제에서 초기 메시는 x(1) = 0
및 x(end) = 1
을 가져야 합니다.
function res = bcfun(ya,yb) res = [ya(1) yb(1)]; end
초기 추측값 생성하기
bvpinit
를 호출하여 해의 초기 추측값을 생성합니다. x
의 메시에는 많은 점이 있을 필요가 없지만 첫 번째 점은 0이어야 합니다. 또한 경계 조건이 제대로 지정되도록 마지막 점은 1이어야 합니다. y
에 대한 초기 추측값을 사용합니다. 여기서 첫 번째 성분은 작은 양수 값이고 두 번째 성분은 0입니다.
xmesh = linspace(0,1,5); solinit = bvpinit(xmesh, [0.1 0]);
방정식 풀기
bvp4c
솔버를 사용하여 BVP를 풉니다.
sol1 = bvp4c(@bvpfun, @bcfun, solinit);
다른 초기 추측값 사용하기
해에 대한 다른 초기 추측값을 사용하여 다시 BVP를 풉니다.
solinit = bvpinit(xmesh, [3 0]); sol2 = bvp4c(@bvpfun, @bcfun, solinit);
해 비교하기
bvp4c
가 다른 초기 조건에 대해 계산하는 해를 플로팅합니다. 두 개의 해가 모두 명시된 경계 조건을 충족하지만 중간의 동작은 다릅니다. 해가 항상 고유하지는 않기 때문에 이러한 서로 다른 동작은 해에 대한 양호한 초기 추측값을 제공하는 것이 중요함을 보여줍니다.
plot(sol1.x,sol1.y(1,:),'-o',sol2.x,sol2.y(1,:),'-o') title('BVP with Different Solutions That Depend on the Initial Guess') xlabel('x') ylabel('y') legend('Solution 1','Solution 2')
로컬 함수(Local Function)
BVP 솔버 bvp4c
가 해를 계산하기 위해 호출하는 로컬 헬퍼 함수는 다음과 같습니다. 또는 이러한 함수를 MATLAB 경로에 있는 디렉터리에 고유의 파일로 저장할 수도 있습니다.
function dydx = bvpfun(x,y) % equation being solved dydx = [y(2) -exp(y(1))]; end %------------------------------------------- function res = bcfun(ya,yb) % boundary conditions res = [ya(1) yb(1)]; end %-------------------------------------------