- 점 x_k + i h (i = 0, 1, ..., n)에서 f(x)의 보간 다항식에 대한 뉴턴의 전향 차분 공식 (Forward difference formula)라 부름.
뉴턴의 전향 차분 공식 예시
- k = 0인경우, 보간 점을 x_0, x_1, ..., x_n일 때
- 위 식의 계수는 전향 차분표로 쉽게 구할 수 있음
function y = NewtonDiff(xd, yd, x)
nd = length(xd);
F = zeros(nd, nd);
F(:, 1) = yd(:);
for j = 2:nd
for i= 1:nd-j+1
F(i,j) = (F(i+1, j-1) - F(i, j-1))/(xd(i+j-1)-xd(i));
end
end
y = F(1, 1);
ytemp = 1;
for j=2:nd
ytemp = ytemp*(x - xd(j-1));
y = y + F(1, j)*ytemp;
end
end
x = [2 3 4 5 6];
y =[4.8 9.4 19.2 36.6 58];
NewtonDiff(x, y, 2.5)
접촉 보간
- 앞에서 보간 다항식을 구할 떄 구간 [a, b]안에 있는 점 x0, x1, x2 , .. xn이 서로 다른 경우에만 고려
- 점들이 서로 다른점이라 가정하지 않고 보간 다항식을 구하는 방법
- 점 x0, ... xk가 구간 [a, b]에서 서로 다른 점일때 -> f(x)의 k차 분할 차분 f[x0, .. xk]를 차수가 k보다 크지않은 보간 다항식 p_k(x)의 최고차 계수 (x^k의 계수) 계수로 정의
서로 같은 점들이 있는 경우 P_k(x_i) = f(x_i)의 의미
- 점 x0, ..., xk 중 m번째 나타나는 점 x - f^(j) (x) = g^(j) (x) => j = 0, 1, ..., m-1
- f(x), g(x)는 점 x0, x1, ... xk에서 같다고 정의
=> 보간 다항식이 한 점 c에서 f(x)와 (m+1)번 접촉(m번 같을 때) 접촉 보간
스플라인
- 매끄러운 곡선을 그리기위해 제도하는 도구에서 유래
- 급격하게 변하는 데이터를 나타내는데 적합한 방법
- 두 점 사이의 각 구간에 대해 스플라인으로 불리는 낮은 차수의 다항식을 이용하여 점들을 연결
- 함수 f(x)가 폐구간 [a, b]위에 정의되고, 이 구간에 있는 n개의 점 x1, x2, ..., xn에 대해 알면
- (xi, f(xi)) , (xi+1 , f(x+1)) 을 지나는 직선의 방정식
선형 보간법 사용법
1. 두개의 점이 주어진 경우
- 두점을 지나는 함수 f(x)를 직전의 방정식으로 구함
2. p(x) = a0 + a1x가 직선의 방정식인 경우
- 데이터 점 들 사이 간격이 작을수록 더 좋은 근사값을 얻게 됨
-> 간격이 감소함으로써 연속 함수를 직선으로 근사시키기가 좋기 때문
자연 로그 ln 2를 계산하기
- ln 1 = 0과 ln 6 = 1.7917595 사이에서 다음과 같이 계산
- ln 1 = 0 과 ln 4 = 1.3862944 사이에서(점 사이 간격이 작은 경우) 다음과 같이 계산
- ln 2의 참 값 : 0.69314718
Matlab에서 선형 보간법 사용하기
clc;
clear all;
x = [40 48 56 64 72 80]; % x 데이터 입력
y = [1.33 1.67 2.08 2.36 2.71 3.19]; % y 데이터 입력
plot(x, y, 'o-') % 그래프 그려줌
interp1(x, y, 52) % x값이 52일 때 y에 해당하는 값을 구함
다항식을 찾기 위한 보간 방법
- 미정 계수법, 라그랑주 보간법, 뉴턴 보간법 등
다항식에 의한 보간법
- (n+1) 개의 점을 지나는 다항식은 n차 이하의 유일한 다항식으로 표시 가능
다항식을 찾아내는 방법
- 미정 계수법
- 라그랑주 보간법
- 뉴턴 보간법
미정 계수법
- 다항식을 찾아내는 가장 보편적인 방법
- 아래의 보간 다항식이 주어지면
- 위 식을 아래와 같은 행렬로 표현 가능
-> 가우스 소거법 등으로 계산하여 a0, a1, ... an을 구하면 됨
가우스 소거법
- n 개의 방정식과 n 개의 미지수로 이루어진 일반적인 선형 연립방정식 Ax = b의 해를 구하는 방법
- 그러나 계산시간이 많이 걸리며 오차가 많이 발생
-> 보간 다항식을 다르게 표현하여 계산 과정을 줄여야함
오차를 작게 하는 방법
- 라그랑주 보간법
- 뉴턴 보간법
라그랑주 보간법
- 여러 개의 점들을 지나는 곡선으로 연결하는 방법
1. 여러개의 점들이 주어짐
2. 이 점들을 지나는 다항식 구함
3. 이 다항식으로 주어진 점에 대한 보간 값을 구함
- 서로 다른 두점 (x0, y0), (x1, y1)을 지나는 다항식은 많으나 그 중 1차 다항식(직선) y = ax + b, 하나만 존재
- 세 점 (x0, y0), (x1, y1), (x2, y2)를 지나는 2차 다항식 y = ax^2 + bx + c도 단 하나만 존재
-> n + 1개의 점 (xi, yi)를 지나는 n차 다항식
- 다항식 g(x)에 (n+1)개의 점들을 대입하여 다음 n+1개의 연립 방정식을 구할 수 있음.
연립 방정식을 풀면
- 계수 a0, a1, ..., an을 구할 수 있음
- 다항식 g(x)를 구하여 다른값 x값에 대한 보간 값을 구하는데 사용 가능
=> 라그랑주 보간법은 연립방정식을 풀지 않고 다항식을 결정할 수 있어 정확성을 높일 수 있음
서로 다른 xi, i = 0, 1, ..., n에서 n + 1개의 점 (xi, f(xi))를 지나는 n차 보간 다항식은?
여기서 L_i(x)는 다음과 같음
두 점 (s,1), (t, 0)을 지나는 일차 다항식은 L(x) = (x-t)/(s-t)로 표현 가능
- L_0(x)는 (x0, 1), (x1, 0)을, L_1(x)는 (x0, 0), (x1, 1)을 지나는 1차 다항식은 다음과 같음
두 점 (x0, y0), (x1, y1)을 지나는 1차 다항식
라그랑주 보간 다항식의 일반화
- P_n(x_i) = y_i 를 만족하므로 n + 1개의 점 (x_i, y_i)를 지나는 유일한 n차 다항식
라그랑주 보간법의 문제점
- 차수가 커지면 참값을 기대할 수 없을 정도로 큰 오차가 발생(runge 현상)
-> 차수가 낮은 경우에만 사용
뉴턴 보간법 필요성
- 라그랑주 보간법의 문제를 보완한 보간법
- 하나의 보간을 위해 필요한 계산량이 필요
- 데이터 수 증가시 바로 직전 결과를 사용하지 못함
-> 에러 계산이 용이하지 않은 문제점을 해결함
뉴턴 보간법
- 기존 데이터를 기초로 차분표 구성
- 차분표로 보간 공식을 구함
- 새로운 데이터가 추가되어도 그 차수를 늘리기 쉬움
- 라그랑주 보간 다항식과 형태만 다르나 같은 다항식
-> 한점이 추가되는 경우 : 라그랑주 보간 다항식은 처음부터 다시 구해야함. 뉴턴 보간법은 이전 보간 다항식을 유지하고 마지막 계수만 다시 추가
1차 다항식 y = ax + b의 경우
- y= a_0 + a_1(x-x_0)로 표현
서로 다른 (n+1)개의 점 x_0, ..., x_n에 대해 f(x)와 함수값이 같은 n차 이하 다항식 P_n(x)는 다음과 같음
점 (x_0, y_0), (x_1, y_1), (x_2,y_2)를 지나는 다항식은?
계수 a_0, a_1, a_2를 구하기 위해 P_2(x_0) = y_0, p_2(x_1) = y_1, p_2(x_2) = y_2 이므로 다항식에 대입하면
분할 차분 기호 [ ] 를 이용하여 P_n(x)를 다시 표현하면 ...
보간 다항식의 존재와 유일성 1
- 연속 함수 중 하나가 다항식이고, 이 다항식은 수치해석 거의 모든 분야에서 함수들의 근사값을 구하는데 사용
- 보간법 -> 근사함수로서 다항식을 사용 => 보간 다항식
보간 다항식의 존재와 유일성 2
- x0, x1, x2, ... , x0을 구간 [a,b]안에 있는 (n+1)개의 서로 다른 점이라 할 때,
- f(x)가 [a, b]위에서 정의된 함수이고, 각 점에서 함수 값을 알때,
- 주어진 (n+1)개의 점에서 함수 값과 같게되는 차수가 n보다 크지 않는 보간 다항식을 구할 때,
=> 이 조건들을 만족하는 보간 다항식 p(x)는 단 1개만 존재
다음 데이터가 주어질때 라그랑주 보간다항식을 이용하여 x가 2.5, 3.5일때 y 값을 구하라
function y = Lagrange(xd, yd, x)
nd = length(xd);
y = 0;
for i=1:nd
p=1;
for j=1:nd
if(i~=j)
p=p*(x-xd(j))/(xd(i)-xd(j));
end
end
y = y+p*yd(i);
end
이번 장에서는 연속 폐루프를 이용해서 횡방향과 종방향 오토파일럿을 설계하였습니다. 횡방향 오토파일럿은 내부 루프로 롤 자세 유지 루프를 외부 루프로 방위각 유지 루프로 이루어집니다.
종방향 오토파일럿은 고도에 따라 더 복잡하게 구성되는데 피치 자세 유지 루프는 모든 영역에서 사용됩니다. 이륙 영역에서는 비행체는 풀 스로틀 상태가 되며 이륙 피치각을 고정하도록 제어하게 됩니다. 상승 영역에서는 비행체는 풀 스로틀로, 피치, 대기 속도 유지 오토 파일럿 루프로 대기속도를 제어합니다. 하강 영역에서는 상승 영역과 비슷한데 대신 비행체에는 최소 스로틀을 줍니다. 고도 유지 영역에서 고도는 피치를 이용한 고도 오토파일럿 루프로 제어되고, 대기속도는 스로틀을 이용한 대기속도 오토파일럿 루프로 제어됩니다.
- 피치 각 제한 $e_{\theta}^{max}$, 댐핑 계수 $\zeta_{\theta}$, $\zeta_{h}$, $\zeta_{V}$, $\zeta_{V2}$와 고유 주파수 $\omega_{n_{v}}$, 고도 루프와 피치 이용 대기속도 루프의 분할 주파수 $W_h$, $W_{V_2}$
계산 고유 주파수들
- 식 (6.21)로 피치 루프 $\omega_{n_{\theta}}$ 고유 주파수 계산. $\omega_{n_{h}}$ = $\omega_{n_{\theta}}$ / $W_h$를 사용하여 고도 루프, $\omega_{n_{V2}}$ = $\omega_{n_{\theta}}$ / $W_{V_2}$를 사용하여 피치 이용 대기속도 루프의 고유 주파수 계산.
% compute trim conditions using 'mavsim_chap5_trim.slx'
% nominal airspeed P.Va0 specified above with aircraft parameters
gamma = 0*pi/180; % desired flight path angle (radians)
R = 10000000000; % desired radius (m) - use (+) for right handed orbit,
% (-) for left handed orbit
Va = 25;
% set initial conditions
x0 = [];
% specify which states to hold equal to the initial conditions
ix = [];
% specify initial inputs
u0 = [...
0;... % 1 - delta_e
0;... % 2 - delta_a
0;... % 3 - delta_r
1;... % 4 - delta_t
];
% specify which inputs to hold constant
iu = [];
% define constant outputs
y0 = [...
Va;... % 1 - Va
0;... % 2 - alpha
0;... % 3 - beta
];
% specify which outputs to hold constant
iy = [1,3];
% define constant derivatives
dx0 =
if R~=Inf, dx0(9) = Va*cos(gamma)/R; end % 9 - psidot
% specify which derivaties to hold constant in trim algorithm
idx = [3; 4; 5; 6; 7; 8; 9; 10; 11; 12];
% compute trim conditions
[x_trim,u_trim,y_trim,dx_trim] = trim('mavsim_trim',x0,u0,y0,ix,iu,iy,dx0,idx);
% check to make sure that the linearization worked (should be small)
norm(dx_trim(3:end)-dx0(3:end))
% P.u_trim = u_trim;
% P.x_trim = x_trim;
% set initial conditions to trim conditions
% initial conditions
MAV.pn0 = 0; % initial North position
MAV.pe0 = 0; % initial East position
MAV.pd0 = -200; % initial Down position (negative altitude)
MAV.u0 = x_trim(4); % initial velocity along body x-axis
MAV.v0 = x_trim(5); % initial velocity along body y-axis
MAV.w0 = x_trim(6); % initial velocity along body z-axis
MAV.phi0 = x_trim(7); % initial roll angle
MAV.theta0 = x_trim(8); % initial pitch angle
MAV.psi0 = x_trim(9); % initial yaw angle
MAV.p0 = x_trim(10); % initial body frame roll rate
MAV.q0 = x_trim(11); % initial body frame pitch rate
MAV.r0 = x_trim(12); % initial body frame yaw rate
trim 시뮬링크 모델이랑 트림 계산 파일이 저렇게 주어졌다.
xdot은 다음과 같으므로
값들은 아래와 같이 대입하면 될거같다
구현 하긴했는데
compute_trim에서 자꾸 dx0이랑 시뮬링크 블록상 연속 상태 크기랑 틀렸다고 에러뜬다.
한참 삽질하다보니 mav_dynamics에서 오일러각대신 쿼터니언을 쓰다보니 상태가 13개가 쓰여서 그렇더라
다시 챕터 3의 mav_dynamics를 오일러각으로 바꿧다.
function [sys,x0,str,ts,simStateCompliance] = mav_dynamics(t,x,u,flag,MAV)
switch flag
%%%%%%%%%%%%%%%%%%
% Initialization %
%%%%%%%%%%%%%%%%%%
case 0
[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes(MAV);
%%%%%%%%%%%%%%%
% Derivatives %
%%%%%%%%%%%%%%%
case 1
sys=mdlDerivatives(t,x,u,MAV);
%%%%%%%%%%
% Update %
%%%%%%%%%%
case 2
sys=mdlUpdate(t,x,u);
%%%%%%%%%%%
% Outputs %
%%%%%%%%%%%
case 3
sys=mdlOutputs(t,x);
%%%%%%%%%%%%%%%%%%%%%%%
% GetTimeOfNextVarHit %
%%%%%%%%%%%%%%%%%%%%%%%
case 4
sys=mdlGetTimeOfNextVarHit(t,x,u);
%%%%%%%%%%%%%
% Terminate %
%%%%%%%%%%%%%
case 9
sys=mdlTerminate(t,x,u);
%%%%%%%%%%%%%%%%%%%%
% Unexpected flags %
%%%%%%%%%%%%%%%%%%%%
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
% end sfuntmpl
%
%=============================================================================
% mdlInitializeSizes
% Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
%
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes(MAV)
%
% call simsizes for a sizes structure, fill it in and convert it to a
% sizes array.
%
% Note that in this example, the values are hard coded. This is not a
% recommended practice as the characteristics of the block are typically
% defined by the S-function parameters.
%
sizes = simsizes;
sizes.NumContStates = 12;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 12;
sizes.NumInputs = 6;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1; % at least one sample time is needed
sys = simsizes(sizes);
%
% initialize the initial conditions
%
x0 = [...
MAV.pn0;...
MAV.pe0;...
MAV.pd0;...
MAV.u0;...
MAV.v0;...
MAV.w0;...
MAV.phi0;...
MAV.theta0;...
MAV.psi0;...
MAV.p0;...
MAV.q0;...
MAV.r0;...
];
%
% str is always an empty matrix
%
str = [];
%
% initialize the array of sample times
%
ts = [0 0];
% Specify the block simStateCompliance. The allowed values are:
% 'UnknownSimState', < The default setting; warn and assume DefaultSimState
% 'DefaultSimState', < Same sim state as a built-in block
% 'HasNoSimState', < No sim state
% 'DisallowSimState' < Error out when saving or restoring the model sim state
simStateCompliance = 'UnknownSimState';
% end mdlInitializeSizes
%
%=============================================================================
% mdlDerivatives
% Return the derivatives for the continuous states.
%=============================================================================
%
function sys=mdlDerivatives(t,x,uu, MAV)
pn = x(1);
pe = x(2);
pd = x(3);
u = x(4);
v = x(5);
w = x(6);
phi = x(7);
theta= x(8);
psi = x(9);
p = x(10);
q = x(11);
r = x(12);
fx = uu(1);
fy = uu(2);
fz = uu(3);
ell = uu(4);
m = uu(5);
n = uu(6);
cphi = cos(phi);
ctheta = cos(theta);
cpsi = cos(psi);
sphi = sin(phi);
stheta = sin(theta);
spsi = sin(psi);
pndot = u*ctheta*cpsi -v*(sphi*stheta*cpsi - cphi*spsi) +w*(cphi*stheta*cpsi + sphi*spsi);
pedot = u*ctheta*spsi + v*(sphi*stheta*spsi + cphi*cpsi) + w*(cphi*stheta*spsi - sphi*cpsi);
pddot = -stheta*u + v*sphi*ctheta + w*cphi *ctheta;
udot = r*v - q*w + 1/MAV.mass*fx;
vdot = p*w - r*u + 1/MAV.mass*fy;
wdot = q*u - p*v + 1/MAV.mass*fz;
phidot = p + sphi*tan(theta)*q + r*cphi*tan(theta);
thetadot = q*cphi -sphi*r;
psidot = sphi/ctheta*q + cphi/ctheta*r;
pdot = MAV.Gamma1*p*q-MAV.Gamma2*q*r+MAV.Gamma3*ell+MAV.Gamma4*n;
qdot = MAV.Gamma5*p*r-MAV.Gamma6*(p^2-r^2) +1/MAV.Jy*m;
rdot = MAV.Gamma7*p*q - MAV.Gamma1*q*r + MAV.Gamma4*ell + MAV.Gamma8*n;
sys = [pndot; pedot; pddot; udot; vdot; wdot; phidot; thetadot; psidot; pdot; qdot; rdot];
% end mdlDerivatives
%
%=============================================================================
% mdlUpdate
% Handle discrete state updates, sample time hits, and major time step
% requirements.
%=============================================================================
%
function sys=mdlUpdate(t,x,u)
sys = [];
% end mdlUpdate
%
%=============================================================================
% mdlOutputs
% Return the block outputs.
%=============================================================================
%
function sys=mdlOutputs(t,x)
y = [...
x(1);
x(2);
x(3);
x(4);
x(5);
x(6);
x(7);
x(8);
x(9);
x(10);
x(11);
x(12);
];
sys = y;
% end mdlOutputs
%
%=============================================================================
% mdlGetTimeOfNextVarHit
% Return the time of the next hit for this block. Note that the result is
% absolute time. Note that this function is only used when you specify a
% variable discrete-time sample time [-2 0] in the sample time array in
% mdlInitializeSizes.
%=============================================================================
%
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1; % Example, set the next hit to be one second later.
sys = t + sampleTime;
% end mdlGetTimeOfNextVarHit
%
%=============================================================================
% mdlTerminate
% Perform any end of simulation tasks.
%=============================================================================
%
function sys=mdlTerminate(t,x,u)
sys = [];
% end mdlTerminate
다음 값이 주어질때
트림 값
아래의 트림 시뮬레이션 모델에서
트림 계산 입력이 아래와 같이 주어질때
gamma = 2*pi/180; % desired flight path angle (radians)
R = 5000; % desired radius (m) - use (+) for right handed orbit,
% (-) for left handed orbit
Va = 100;
시뮬링크는 트림 상태를 계산하는 루틴을 제공하는데, help trim 으로 사용방법을 확인할 수 있습니다. 5.3장에서 봤던것 처럼 $V_a^*$, $\gamma^*$, $R^*$가 주어지면, $x^*$, $u^*$를 찾는것이 목표가 됩니다. $\dot{x^*}$ = f($x^*$, $u^*$ 로 여기서 x, u는 식 (5.17)과 (5.18)로 정의 됩니다. $\dot{x^*}$는 식 (5.21)에서 주어지며 f(x, u)는 식 (5.1) - (5.12)로 정의됩니다.
트림 명령의 형식은
[x, u, y, dx] = trim('sys', x0, u0, y0, ix, iu, uy, dx0, idx);
여기서 x는 계산된 트림상태 $x^*$, u는 계산됨 트림 입력 $u^*$, y는 계산된 트림 출력 $y^*$, dx는 계산된 상태의 미분 $\dot{x^*}$, 시뮬링크 모델은 sys.mdl에 명시되는데 모델의 상태들은 서브시스템 내 상태로 되어있고, 입력과 출력은 시뮬링크에서 inports, outports로 정의됩니다.
그림 F.1은 비행체 트림 계산하는 시뮬링크 모델로 입력은 4개의 inports로 서보 명령인 delta_e, delta_a, delta_r, delta_t 가 있습니다. 이 블록의 상태들은 시뮬링크 상태로 우리는 $\zeta$ = ($p_n$, $p_e$, $p_d$, u, u, w, $\phi$, $\theta$, $\psi$, p, q, r)$^T$가 됩니다. 출력은 세개의 outports이며 대기속도 $V_a$, 받음각 $\alpha$, $\beta$이며 이 아웃풋을 트림 명령에다가 전달하여 $V_a$ = $V_a^*$가 유지되도록 하겠습니다.
러더도 사용가능하면 $\beta^*$=0으로 유지시키는 트림 명령을 주어 정상선회 하도록 할수 있씁니다. 러더가 없는 경우 0상태로 만들수 없습니다.
트림 계산에서 문제는 시스템의 비선형 방정식을 풀어야 하는데, 많은 경우 시뮬링크 트림 명령에는 초기화 추정 값으로 상태 x0, 입력 u0, 출력 y0, 상태 미분 dx0이 필요합니다. 우리가 일부 상태나 입력, 출력 또는 미분 상태같은 시작 상태를 알아서 초기 상태를 쓸수 있으면, 사용가능한 값들을 인덱스 벡터 ix, iu, iy, idx로 전달할 수 있습니다.
우리의 상태가 아래와 같다면
이렇게 작성할 수 있습니다.
비슷하게 초기 상태, 입력, 출력들을 다음처럼 정의할수 있습니다.
F.2 트림 수치 계산 Numerical Computation of Trim
시뮬링크 말고 다른환경에서 시뮬레이션이 개발된다면, 트림 루틴을 따로 작성해야합니다. 이번 장에서는 어떻게 하는지 간단히 설명하고 $V_a^*$, $\gamma^*$, $R^*$ 파라미터들로 상승 선회 트림 제어에 대해 살펴보고, 트림 찾기 알고리즘에서 입력으로 사용하겠습니다. 입력 파라미터 $V_a^*$, $\gamma^*$, $R^*$와 $\alpha$, $\beta$, $\phi$로 트림 상태와 입력 구하는 계산과정을 살펴보겠습니다. 주어진 $V_a^*$, $\gamma^*$, $R^*$값으로 트림값 $\alpha^*$, $\beta^*$, $\phi^*$을 찾아낸다면 이제 트림 상태와 입력같을 구할수 있게됩니다.
첫 단계는 상태 변수들을 $V_a^*$, $\gamma^*$, $R^*$로, 입력을 $\alpha^*$, $\beta^*$, $\phi^*$로 나타내는데 $V_a^*$, $\gamma^*$, $R^*$는 사용자 지정 입력이 되어 알고리즘은 최적의 트림 상태를 구할수 있는 $\alpha^*$, $\beta^*$, $\phi^*$ 계산합니다. 이 값으로 트림 상태 $x^*$, $u^*$를 찾는데 사용됩니다.
동체 좌표계 속도 $u^*$, $v^*$, $w^*$
식 (2.7)에서 동체 좌표계상 속도들은 $V_a^*$, $\alpha^*$, $\beta^*$ 를 이용해서 나타낼 수있습니다.
피치각 $\theta^*$
비행경로각의 정의로 다음과 같이 정리할 수있습니다.
각 변화율 p, q, r
각 변화율은 식 (3.2)로 오일러각으로 나타낼수 있습니다.
엘리베이터 $\delta_e$
$p^*$, $q^*$, $r^*$, $\delta_e^*$에 대해서 식 (5.11)을 풀면
에일러론 $\delta_a$과 러더 $\delta_r$
에일러론과 러더 명령은 식 (5.10), 식(5.12)을 풀어서 구할 수 있습니다.
F.2.1 트림 알고리즘
모든 관심변수와 제어입력은 $V_a^*$, $\gamma^*$, $R^*$,$\alpha^*$, $\beta^*$, $\phi^*$입니다. 트림 알고리즘의 입력은 $V^*$, $\gamma^*$, $R^*$이며, $\alpha^*$, $\beta^*$, $\phi^*$값을 찾기위해 다음의 최적화 알고리즘을 사용합니다.
이는 다음장에서 설명할 경사 하강 알고리즘으로 수치적으로 구할 수있습니다. 트림 알고리즘은 알고리즘 13에서 정리하였습니다.