I need help with my MATLAB code. I wanted to numerically integrate MRPs. When there was a singularity in MRP, my code would stop it using an event function. Now, I want to switch to the MRP shadow set and run the ode45 again with the updated initial conditions. How do I do that?   clc; clear all; w0 = [0; 0; 0.3]; MRP0 = [0; 0; -0.198912367379658]; tspan = [0, 100]; % Integrate the Euler equations using ode45 with an event function options = odeset('RelTol', 1e-10, 'AbsTol', 1e-10, 'Events', @singularityEvent); [t, y, te, ye, ie] = ode45(@KDE_MRP, tspan, [MRP0; w0], options); % Extract the Euler parameters and angular velocities MRP = y(:, 1:3); w = y(:, 4:6); % plotting MRP vs time plot(t,MRP, '-') xlabel('time (s)') ylabel('MRP') legend('MRP1', 'MRP2', 'MRP3') function [value, isterminal, direction] = singularityEvent(t, MRPw)     % Event function to detect when the norm of MRP approaches 2     value = norm(MRPw(1:3)) - 1;     isterminal = 1;  % Stop the integration when the event is detected     direction = 0;   % Detect events in both directions end function dMRPwdt = KDE_MRP(t, MRPw)     I = [0.3; 0.2; 0.4];     L = [0; 0; 0];     MRP = MRPw(1:3);     w = MRPw(4:6);     dMRPdt = zeros(3, 1);     dwdt = zeros(3, 1);     C11 = 1 - dot(MRP, MRP) + 2 * MRP(1)^2;     C12 = 2 * (MRP(1) * MRP(2) - MRP(3));     C13 = 2 * (MRP(1) * MRP(3) + MRP(2));     C21 = 2 * (MRP(2) * MRP(1) + MRP(3));     C22 = 1 - dot(MRP, MRP) + 2 * MRP(2)^2;     C23 = 2 * (MRP(2) * MRP(3) - MRP(1));     C31 = 2 * (MRP(3) * MRP(1) - MRP(2));     C32 = 2 * (MRP(3) * MRP(2) + MRP(1));     C33 = 1 - dot(MRP, MRP) + 2 * MRP(3)^2;     C = [C11 C12 C13;          C21 C22 C23;          C31 C32 C33];     dMRPdt = 0.25 * C * w;     dwdt(1) = (-(I(3) - I(2)) * w(2) * w(3) + L(1)) / I(1);     dwdt(2) = (-(I(1) - I(3)) * w(3) * w(1) + L(2)) / I(2);     dwdt(3) = (-(I(2) - I(1)) * w(1) * w(2) + L(3)) / I(3);     % Combine the time derivatives into a single vector     dMRPwdt = [dMRPdt; dwdt]; end

Database System Concepts
7th Edition
ISBN:9780078022159
Author:Abraham Silberschatz Professor, Henry F. Korth, S. Sudarshan
Publisher:Abraham Silberschatz Professor, Henry F. Korth, S. Sudarshan
Chapter1: Introduction
Section: Chapter Questions
Problem 1PE
icon
Related questions
Question

I need help with my MATLAB code. I wanted to numerically integrate MRPs. When there was a singularity in MRP, my code would stop it using an event function. Now, I want to switch to the MRP shadow set and run the ode45 again with the updated initial conditions. How do I do that?

 

clc;
clear all;

w0 = [0; 0; 0.3];

MRP0 = [0; 0; -0.198912367379658];
tspan = [0, 100];

% Integrate the Euler equations using ode45 with an event function
options = odeset('RelTol', 1e-10, 'AbsTol', 1e-10, 'Events', @singularityEvent);
[t, y, te, ye, ie] = ode45(@KDE_MRP, tspan, [MRP0; w0], options);

% Extract the Euler parameters and angular velocities
MRP = y(:, 1:3);
w = y(:, 4:6);


% plotting MRP vs time
plot(t,MRP, '-')
xlabel('time (s)')
ylabel('MRP')
legend('MRP1', 'MRP2', 'MRP3')

function [value, isterminal, direction] = singularityEvent(t, MRPw)
    % Event function to detect when the norm of MRP approaches 2
    value = norm(MRPw(1:3)) - 1;
    isterminal = 1;  % Stop the integration when the event is detected
    direction = 0;   % Detect events in both directions
end

function dMRPwdt = KDE_MRP(t, MRPw)
    I = [0.3; 0.2; 0.4];
    L = [0; 0; 0];

    MRP = MRPw(1:3);
    w = MRPw(4:6);

    dMRPdt = zeros(3, 1);
    dwdt = zeros(3, 1);

    C11 = 1 - dot(MRP, MRP) + 2 * MRP(1)^2;
    C12 = 2 * (MRP(1) * MRP(2) - MRP(3));
    C13 = 2 * (MRP(1) * MRP(3) + MRP(2));
    C21 = 2 * (MRP(2) * MRP(1) + MRP(3));
    C22 = 1 - dot(MRP, MRP) + 2 * MRP(2)^2;
    C23 = 2 * (MRP(2) * MRP(3) - MRP(1));
    C31 = 2 * (MRP(3) * MRP(1) - MRP(2));
    C32 = 2 * (MRP(3) * MRP(2) + MRP(1));
    C33 = 1 - dot(MRP, MRP) + 2 * MRP(3)^2;

    C = [C11 C12 C13;
         C21 C22 C23;
         C31 C32 C33];

    dMRPdt = 0.25 * C * w;

    dwdt(1) = (-(I(3) - I(2)) * w(2) * w(3) + L(1)) / I(1);
    dwdt(2) = (-(I(1) - I(3)) * w(3) * w(1) + L(2)) / I(2);
    dwdt(3) = (-(I(2) - I(1)) * w(1) * w(2) + L(3)) / I(3);

    % Combine the time derivatives into a single vector
    dMRPwdt = [dMRPdt; dwdt];
end

Expert Solution
trending now

Trending now

This is a popular solution!

steps

Step by step

Solved in 4 steps

Blurred answer
Knowledge Booster
Longest Common Subsequence
Learn more about
Need a deep-dive on the concept behind this application? Look no further. Learn more about this topic, computer-science and related others by exploring similar questions and additional content below.
Similar questions
  • SEE MORE QUESTIONS
Recommended textbooks for you
Database System Concepts
Database System Concepts
Computer Science
ISBN:
9780078022159
Author:
Abraham Silberschatz Professor, Henry F. Korth, S. Sudarshan
Publisher:
McGraw-Hill Education
Starting Out with Python (4th Edition)
Starting Out with Python (4th Edition)
Computer Science
ISBN:
9780134444321
Author:
Tony Gaddis
Publisher:
PEARSON
Digital Fundamentals (11th Edition)
Digital Fundamentals (11th Edition)
Computer Science
ISBN:
9780132737968
Author:
Thomas L. Floyd
Publisher:
PEARSON
C How to Program (8th Edition)
C How to Program (8th Edition)
Computer Science
ISBN:
9780133976892
Author:
Paul J. Deitel, Harvey Deitel
Publisher:
PEARSON
Database Systems: Design, Implementation, & Manag…
Database Systems: Design, Implementation, & Manag…
Computer Science
ISBN:
9781337627900
Author:
Carlos Coronel, Steven Morris
Publisher:
Cengage Learning
Programmable Logic Controllers
Programmable Logic Controllers
Computer Science
ISBN:
9780073373843
Author:
Frank D. Petruzella
Publisher:
McGraw-Hill Education