function dxdt = AeropendulumDynamics(x,m,c,g,l,K,u)
dxdt = [x(2);(-c*x(2) - m*g*l*sin(x(1)) + K*u) / (m*l^2)];
function x_next = AeroPendStateXsnFunc(x,m,c,g,l,K,u,dt)
x_next = x + AeropendulumDynamics(x,m,c,g,l,K,u) * dt;
function yk = AeroPendMeasurementNonAdditiveNoiseFunc(xk,vk)
stateFcn = @(x) AeroPendStateXsnFunc(x, m, c, g, l, K, u, t_step);
measFcn = @(x,v) AeroPendMeasurementNonAdditiveNoiseFunc(x, v);
ukf = unscentedKalmanFilter(...
'HasAdditiveMeasurementNoise', false);
ukf.MeasurementNoise = R;
ukf.ProcessNoise = diag([0.2 0.3]);
[tTrue, xTrue] = ode45(@(t,x)AeropendulumDynamics(x,m,c,g,l,K,u), t_span, x_initial);
yMeas = yTrue .* (1+sqrt(R)*randn(size(yTrue)));
xCorrectedUKF = zeros(Nsteps,2);
PCorrected = zeros(Nsteps,2,2);
e(k) = yMeas(k) - AeroPendMeasurementNonAdditiveNoiseFunc(ukf.State, 0);
[xCorrectedUKF(k,:), PCorrected(k,:,:)] = correct(ukf,yMeas(k));
plot(tTrue,rad2deg(xTrue(:,1)))
plot(tTrue,rad2deg(yMeas))
plot(tTrue,rad2deg(xCorrectedUKF(:,1)))