Main Content

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

경직성(Stiff) 트랜지스터 미분대수 방정식 풀기

이 예제에서는 ode23t를 사용하여 전기 회로를 나타내는 경직성 미분대수 방정식(DAE)을 푸는 방법을 보여줍니다 [1]. 예제 파일 amp1dae.m에 작성된 단일 트랜지스터 증폭기 문제는 반명시적(semi-explicit) 형식으로 재작성할 수 있지만, 이 예제에서는 원래 형식 Mu=ϕ(u)로 이 문제를 풉니다. 이 문제에는 상수 특이 질량 행렬 M이 포함됩니다.

트랜지스터 증폭기 회로에는 저항기 6개, 축전기 3개, 그리고 트랜지스터 1개가 있습니다.

  • 초기 전압 신호는 Ue(t)=0.4sin(200πt)입니다.

  • 동작 전압은 Ub=6입니다.

  • 노드에서의 전압은 Ui(t) (i=1,2,3,4,5)로 지정됩니다.

  • 저항기 Ri (i=1,2,3,4,5,6)의 값은 일정하며 각 저항기를 통과하는 전류는 I=U/R를 충족합니다.

  • 커패시터 Ci (i=1,2,3)의 값은 일정하며 각 커패시터를 통과하는 전류는 I=CdU/dt를 충족합니다.

5번째 노드에 걸리는 출력 전압 U5(t)를 구하는 것이 목적입니다.

MATLAB®에서 이 방정식을 풀려면 솔버 ode23t를 호출하기 전에 방정식을 코딩하고 질량 행렬을 코딩하고 초기 조건과 적분 구간을 설정해야 합니다. 필요한 함수를 이 예제와 같이 파일 끝에 로컬 함수로 포함시킬 수도 있고, MATLAB 경로에 있는 디렉터리에 이름이 지정된 별도의 파일로 저장할 수도 있습니다.

질량 행렬 코딩하기

키르히호프의 법칙(Kirchoff's law)에 따라 각 노드(1~5)를 통과하는 전류를 등식으로 하여 회로를 나타내는 5개 방정식으로 이루어진 연립방정식을 구할 수 있습니다.

node1:  Ue(t)R0-U1R0+C1(U2-U1)=0,node2:  UbR2-U2(1R1+1R2)+C1(U1-U2)-0.01f(U2-U3)=0,node3:f(U2-U3)-U3R3-C2U3=0,node4:  UbR4-U4R4+C3(U5-U4)-0.99f(U2-U3)=0,node5:-U5R5+C3(U4-U5)=0.

방정식 좌변의 도함수 항을 모아서 찾아낸 이 연립방정식의 질량 행렬의 형식은 다음과 같습니다.

M=(-c1c1000c1-c100000-c200000-c3c3000c3-c3),

여기서 k=1,2,3에 대해 ck=k×10-6입니다.

적절한 상수 ck를 사용하여 질량 행렬을 만든 다음 odeset 함수를 사용하여 질량 행렬을 지정합니다. 질량 행렬이 특이 행렬임이 명백하더라도, 솔버가 자동으로 DAE 문제를 감지하는지 테스트하려면 'MassSingular' 옵션을 디폴트 값인 'maybe'로 유지합니다.

c = 1e-6 * (1:3);
M = zeros(5,5);
M(1,1) = -c(1);
M(1,2) =  c(1);
M(2,1) =  c(1);
M(2,2) = -c(1);
M(3,3) = -c(2);
M(4,4) = -c(3);
M(4,5) =  c(3);
M(5,4) =  c(3);
M(5,5) = -c(3);
opts = odeset('Mass',M);

방정식 코딩하기

함수 transampdae에는 이 예제에 사용되는 연립방정식이 포함되어 있습니다. 이 함수는 모든 전압 및 상수 파라미터 값을 정의합니다. 방정식 좌변에서 수집한 도함수는 질량 함수로 코딩되고 transampdae는 방정식의 우변을 코딩합니다.

function dudt = transampdae(t,u)
% Define voltages and parameters
Ue = @(t) 0.4*sin(200*pi*t);
Ub = 6;
R0 = 1000;
R15 = 9000;
alpha = 0.99;
beta = 1e-6;
Uf = 0.026;

% Define system of equations
f23 = beta*(exp((u(2) - u(3))/Uf) - 1);
dudt = [ -(Ue(t) - u(1))/R0
    -(Ub/R15 - u(2)*2/R15 - (1-alpha)*f23)
    -(f23 - u(3)/R15)
    -((Ub - u(4))/R15 - alpha*f23)
    (u(5)/R15) ];
end

참고: 이 함수는 예제 끝에 로컬 함수로 포함되어 있습니다.

초기 조건 코딩하기

초기 조건을 설정합니다. 이 예제에서는 [1]에서 계산된 각 노드를 통과하는 전류에 대해 일관된 초기 조건을 사용합니다.

Ub = 6;
u0(1) = 0;
u0(2) = Ub/2;
u0(3) = Ub/2;
u0(4) = Ub;
u0(5) = 0;

연립방정식 풀기

ode23t를 사용하여 시간 구간 [0 0.05]에 대한 연립 DAE를 풉니다.

tspan = [0 0.05];
[t,u] = ode23t(@transampdae,tspan,u0,opts);

결과 플로팅하기

초기 전압 Ue(t)와 출력 전압 U5(t)를 플로팅합니다.

Ue = @(t) 0.4*sin(200*pi*t);
plot(t,Ue(t),'o',t,u(:,5),'.')
axis([0 0.05 -3 2]);
legend('Input Voltage U_e(t)','Output Voltage U_5(t)','Location','NorthWest');
title('One Transistor Amplifier DAE Problem Solved by ODE23T');
xlabel('t');

Figure contains an axes. The axes with title One Transistor Amplifier DAE Problem Solved by ODE23T contains 2 objects of type line. These objects represent Input Voltage U_e(t), Output Voltage U_5(t).

참고 문헌

[1] Hairer, E., and Gerhard Wanner. Solving Ordinary Differential Equations II: Stiff and Differential-Algebraic Problems. Springer Berlin Heidelberg, 1991, p. 377.

로컬 함수(Local Function)

여기 나열된 함수는 ODE 솔버 ode23t가 해를 계산하기 위해 호출하는 로컬 헬퍼 함수입니다. 또는 이 함수를 MATLAB 경로에 있는 디렉터리에 고유의 파일로 저장할 수도 있습니다.

function dudt = transampdae(t,u)
% Define voltages and parameters
Ue = @(t) 0.4*sin(200*pi*t);
Ub = 6;
R0 = 1000;
R15 = 9000;
alpha = 0.99;
beta = 1e-6;
Uf = 0.026;

% Define system of equations
f23 = beta*(exp((u(2) - u(3))/Uf) - 1);
dudt = [ -(Ue(t) - u(1))/R0
    -(Ub/R15 - u(2)*2/R15 - (1-alpha)*f23)
    -(f23 - u(3)/R15)
    -((Ub - u(4))/R15 - alpha*f23)
    (u(5)/R15) ];
end

참고 항목

|

관련 항목