WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

fmincon & "Warning:Matrix is singular, close to sin

 

Waldemar
Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 21.01.2013, 23:11     Titel: fmincon & "Warning:Matrix is singular, close to sin
  Antworten mit Zitat      
Hallo,

ich versuche gerade die Eingangsgrößen (Wichtungsmatrizen eines optimalen Reglers) in mein Simulink-MOdell so zu optimieren, dass die Ausgangsgröße (Soll-Regel und Stellgrößenänderungen) minimal wird!

Dafür nutze ich:
Code:

A=[-1 0 0 0 0 0;0 -1 0 0 0 0;0 0 -1 0 0 0;0 0 0 -1 0 0;0 0 0 0 -1 0;0 0 0 0 0 -1];
b=[0;0;0;0;0;0];
optopt= optimset('Display','iter');
[x, fval, exitflag]=fmincon(@Regelung,[1;1;1;1;1;1],A,b,[],[],[],[],[],optopt);
 


Code:
function y = Regelung(x)

% Unterordner einbinden
path(genpath(pwd),path);
path(genpath('..\MODELLBILDUNG'),path);

% Simulationsschrittweite
stepSize = 0.03;

% Simulationsdauer vordefinieren
simTime = 9;

% PT1-Zeitkonstante
T_PT1    = 2; % für AGRstat --> AGRdyn

% Laden der MAT-Files für die Streckenmodelle und Ableitungsmodelle
load('modLOLIMOT_3In_CA50');
load('modLOLIMOT_3In_IMEP');
load('modLOLIMOT_3In_DPMAX');
load('modLOLIMOT_3In_HC');
load('modLOLIMOT_3In_NOX');


simOut=sim('OPT2','SrcWorkspace','current','SaveOutput','on','OutputSaveName','youtNew');
pause(60)
simOutVars = simOut.who;
yout = simOut.get('youtNew');
length_yout=length(yout);
y=yout(length_yout)
 
.

(Die Nebenbedingungen sind die Nicht-Negativbedingungen für die Wichtungsmatrizen.)

Das Simulink-Modell ist ein Regelkreis eines Verbrennungsmotors.

Allerdings kommt folgende Warnung:
Code:
Warning: Matrix is singular, close to singular or badly scaled. Results may be
inaccurate. RCOND =            NaN.


Da ich am Regelkreis nichts verändern kann (gehe zumindest momentan davon aus), gibt es vielleicht andere Möglichkeiten, wie ich das Problem lösen kann?

Wäre super, wenn jemand eine Tipp für mich hätte.

MfG, Waldemar

PS: Bin recht neu im Thema Optimierung.
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.01.2013, 04:52     Titel:
  Antworten mit Zitat      
Hallo,

und in welcher Zeile tritt die Warnung auf?

Die Nebenbedingung könntest du viel einfacher als Schrankenbedingung (lb) umsetzen.

Macht dein Modell für [1;1;1;1;1;1] etwas sinnvolles?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 23.01.2013, 15:31     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine Antwort und entschuldige meine späte Antwort...musste mich ein wenig mehr in die Materie einlesen.

Jedenfalls habe ich deinen Ratschlag ausprobiert, die Nicht-Negativbedingungen als "untere Grenze" zu deklarieren. In Kombination mit neuen Startwerten,

Code:
lb=[0;0;0;0;0;0];
optopt= optimset('Display','iter','MaxIter',15);
[x, fval, exitflag]=fmincon(@Regelung,[6.5;6.5;11;4;10;8],[],[],[],[],lb,[],[],optopt);
 


einer maximalen Iterationsanzahl - notwendig, weil Matlab, aufgrund der Tatsache, dass ein Gradient nicht berechenbar ist, dass ableitungsfreie Verfahren 'active-set' nutzt, welches durch eine sehr langsame Kovergenz gekennzeichnet ist (stimmt's?) - und der Funktion:

Code:
function
y = Regelung(x)

% Unterordner einbinden
path(genpath(pwd),path);
path(genpath('..\MODELLBILDUNG'),path);

% Simulationsschrittweite
stepSize = 0.03; % 10 ms % Anstelle von 0.06!

% Simulationsdauer vordefinieren
simTime = 12;

% PT1-Zeitkonstante
T_PT1    = 2; % für AGRstat --> AGRdyn

% Laden der MAT-Files für die Streckenmodelle und Ableitungsmodelle
load('modLOLIMOT_3In_CA50');
load('modLOLIMOT_3In_IMEP');
load('modLOLIMOT_3In_DPMAX');
load('modLOLIMOT_3In_HC');
load('modLOLIMOT_3In_NOX');

simOut=sim('OPT2','SrcWorkspace','current','SaveOutput','on','OutputSaveName','youtNew');

% pause(15) % Doch nicht notwendig!? Wovon abhängig, ob Matlab auf Ergebnisse aus Simulink wartet oder nicht? (Klären!)

simOutVars = simOut.who;
yout = simOut.get('youtNew');
length_yout=length(yout);
y=yout(length_yout);
 


bekomme ich für manche Arbeitspunkte Ergebnisse (Optimierung wird beendet, allerdings bin ich mir nicht sicher, ob es sicher hierbei um globale Minima handelt)....für andere kommt wieder die Warnung/ derFehler:
Code:
Matrix is singular, close to singular....

Dabei taucht die Meldung, bei unterschiedlichen Arbeitspunkten bei unterschiedlichen Iterationsschritten auf (also nicht immer am Anfang!)!

Welche Möglichkeiten/Eingriffsmöglichkeiten bleiben mir?

Analyse: Zielfunktion:
Bei meinem Simulationsmodell - meiner Zielfunktion - handelt es sich um einen Regelkreis, der für den Motor ein linearisiertes Modell des Verbrennungsmotors nutzt, dessen Ausgangsgrößen die Regelgrößen (CA50, IMEP, NOx) sind. Die von außen zugeführten Sollwerte (Arbeitspunkt: CA50, IMEP, NOx) werden mit einem modellbasierten Regler (iterativ--> prädiktiver Regler) und einem Kalmanfilter eingeregelt (Genutzt wird ebenfalls das linearisierte Modell, allerdings diesmal in der Zustandsraumdarstellung).

Warum ich das erwähne?...Frage mich die ganze Zeit, ob es sich bei mir um eine lineare oder um eine nichtlineare Optimierung handelt?
(Nebenbedingungen sind ja linearer Natur, nicht wahr?)
Allerdings ist für die Austellung der Optimierung in Matlab mit fmincon egal, ob es sich um eine lineare oder nichtlineare Optimierung handelt, da fmincon sowohl für die lineare als auch für die nichtlineare Optimierung gilt, nicht wahr?
Welcher Algorithmus bietet sich eigentlich für welchen Fall am ehesten an?

Was muss ich noch beachten, was ich kann noch anpassen?
Oder geht da nix mehr?

Wäre über Tipps dankbar.


MfG, Waldemar
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.01.2013, 22:01     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
einer maximalen Iterationsanzahl - notwendig, weil Matlab, aufgrund der Tatsache, dass ein Gradient nicht berechenbar ist, dass ableitungsfreie Verfahren 'active-set' nutzt, welches durch eine sehr langsame Kovergenz gekennzeichnet ist (stimmt's?)

Grundsätzlich würde ich die max. Iterationszahl nur beschränken, wenn es sonst zu extrem langen Rechenzeiten kommt. 15 erscheint mir extrem niedrig.
Es ist zu unterscheiden zwischen "Gradient angegeben" und "Gradient nicht angegeben, aber sinnvoll annäherbar" und "Gradient nicht sinnvoll annäherbar". Ich würde sagen, dass du dich auf das zweite beziehst.
Was ist denn der Wert von exitflag?

Zitat:
Matrix is singular, close to singular....

Wo genau kommt diese Warnung her? Bitte die komplette Fehlermeldung inkl. Bezug auf Codezeile kopieren, und auch MATLAB-Release angeben.

Zitat:
Welche Möglichkeiten/Eingriffsmöglichkeiten bleiben mir?

Ich vermute, dass dann Parameter für das Simulink-Modell verwendet werden, die nicht sinnvoll sind. So etwas kann man durch Nebenbedingungen vermeiden. Welche Nebenbedingungen sinnvoll sind, musst du aus der konkreten Anwendung heraus entscheiden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 28.01.2013, 19:37     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke schon mal für deine Gedankenanstöße...

...welche ich folgendermaßen umgesetzt habe (ohne maxIter plus obere Grenze):

Code:
lb=[0;0;0;0;0;0];
ub=[20;20;20;20;20;20];
optopt= optimset('Display','iter');
[x, fval, exitflag]=fmincon(@Regelung,[0.1;0.1;0.5;1;3;1],[],[],[],[],lb,ub,[],optopt);


&

Code:
function y = Regelung(x)

% Unterordner einbinden
path(genpath(pwd),path);
path(genpath('..\MODELLBILDUNG'),path);

% Simulationsschrittweite
stepSize = 0.03;

% Simulationsdauer vordefinieren
simTime = 12;

% PT1-Zeitkonstante
T_PT1    = 2;

% Laden der MAT-Files für die Streckenmodelle und Ableitungsmodelle
load('modLOLIMOT_3In_CA50');
load('modLOLIMOT_3In_IMEP');
load('modLOLIMOT_3In_DPMAX');
load('modLOLIMOT_3In_HC');
load('modLOLIMOT_3In_NOX');

simOut=sim('OPT2','SrcWorkspace','current','SaveOutput','on','OutputSaveName','youtNew');

simOutVars = simOut.who;
yout = simOut.get('youtNew');
length_yout=length(yout);
y=yout(length_yout);
 


Dabei entstehen unzählige Warnungen im Command Window folgender Art:
(Command Window):
Code:
Optimale_Wichtung_mit_fmincon
Warning: To use the default trust-region-reflective algorithm you must
supply the gradient in the objective function and set the GradObj option
to 'on'. FMINCON will use the active-set algorithm instead. For
information on applicable algorithms, see Choosing the Algorithm in the
documentation.
> In fmincon at 491
  In Optimale_Wichtung_mit_fmincon at 95

                                Max     Line search  Directional  First-order
 Iter F-count        f(x)   constraint   steplength   derivative   optimality Procedure
    0      7      3242.56         -0.1                                        
Warning: Matrix is singular to working precision.
> In Regelung at 44
  In nlconst at 743
  In fmincon at 794
  In Optimale_Wichtung_mit_fmincon at 95
Warning: Matrix is singular, close to singular or badly scaled. Results
may be inaccurate. RCOND =            NaN.
> In Regelung at 44
  In nlconst at 743
  In fmincon at 794
  In Optimale_Wichtung_mit_fmincon at 95
Warning: Matrix is singular, close to singular or badly scaled. Results
may be inaccurate. RCOND =            NaN.
> In Regelung at 44
  In nlconst at 743
  In fmincon at 794
  In Optimale_Wichtung_mit_fmincon at 95
.
.
.
 
(Zeile 44 ist: simOut=sim.....)

exitflag wird nicht angegeben, da ich die Berechnung nach unendlich vielen dieser Warnungen abbreche!

Was ist mit Matlab-Release gemeint? Die Warnungen im Command Window (wie oben) oder doch was anderes (wie komme ich da ran?)?

Wäre super, wenn du mir nochmals paar Hinweise gegeben könntest, da ich selber nicht weiter komme...

MfG, Waldemar
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.01.2013, 20:55     Titel:
  Antworten mit Zitat      
Hallo,

Kann es sein, dass innerhalb deines Modells, beispielsweise innerhalb eines MATLAB-Function - Blocks, ein lineares Gleichungssystem gelöst oder eine Inverse berechnet werden soll?

Eine Idee: die Simulationsgenauigkeit im Modell sollte hoch (z.B. 1e-9) sein, um Simulationsfehler klein zu halten.
Hintergrund: fmincon ist gradientenbasiert. Die Gradienten werden über Differenzenquotienten gebildet, und die können bei fehlerbehafteten Funktionsauswertungen unsinnig werden.


Alternativ: fminsearch oder patternsearch verwenden; diese beiden Algorithmen sind ableitungsfrei.

Grüße,
Harald

P.S.: Die Anzahl der Iterationen ist begrenzt. Auch wenn es so scheinen mag, wirst du also sicher nicht unendlich viele dieser Warnungen bekommen ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 28.01.2013, 21:39     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für deine Tipps!

Denke, dass du möglicherweise ins Schwarze getroffen hast, da im MP-Regler, zur Berechnung der optimalen Stellgrößen, eine Inverse berechnet wird.

Werde es morgen mal mit deinen vorgeschlagenen Funktionen probieren.

Wenn ich dich um noch einen Ratschlag bitten dürfte,...
...wenn du dir mein Simulink-Modell anschauen würdest (Anhang), welche Funktion wäre deiner Meinung am ehesten geeignet!
(Mir fehlt da einfach der Überblick!)

(Bei der Regelstrecke handelt es sich um LOLIMOT-(LOcal LInear Modell Tree)-Modelle (linearsierte Darstellung des Motors im jeweiligen Arbeitspunkt) (Funktionsname: Jacobi) des echten Motors.

Vielen lieben Dank für deine bisherige Hilfe.

MfG, Waldemar

PS: Dann haben mir die vielen Warnungen einfach nur Angst gemacht...und wenn es emotional wird, hört der Verstand bei mir auf.
...oder so ähnlich!Wink

OPT2.mdl
 Beschreibung:

Download
 Dateiname:  OPT2.mdl
 Dateigröße:  154.86 KB
 Heruntergeladen:  387 mal

_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 28.01.2013, 23:13     Titel:
  Antworten mit Zitat      
Hallo,

warum verwendest du einen fixed-step-Solver? Damit handelst du dir Simulationsungenauigkeiten beispielsweise bei Nulldurchgängen ein, während du diskrete Systeme mit variable-step exakt simulieren kannst - abgesehen natürlich davon, was in den MATLAB Functions passiert, und das ist bei dir leider ein sehr großer und vor allem unübersichtlicher Teil, z.B. was MPC_OPT2 angeht.

Meine Kenntnisse bzgl. Regelungstechnik halten sich in Grenzen. Ich würde jedoch vermuten, dass eine Linearisierung problematisch ist, wenn man sich zu weit vom Arbeitspunkt entfernt. Und es würde mich nicht überraschen, wenn das auch für die zu bestimmenden Parameter gilt.

Du kannst ja in deinem Code an die vermutete Stelle mal cond(matrix) schreiben, dann siehst du ja ob es daran liegt. Und wenn es daran liegt, solltest du dir überlegen, ob du im Falle singulärer Matrizen sinnvolle Ergebnisse bekommst oder auch, was eine singuläre Matrix hier für deine Anwendung bedeutet.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 29.01.2013, 14:39     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine unermüdliche Hilfe.

ich denke, dass ich langwierigste Variante versuche, und einfach mal:
- patternsearch
- fminsearch
- fmincon (interior-point)
- fmincon (sqp)
ausprobiere und schaue was die Ergebnisse sind!

Hättest du einen Tipp, wie ich die Nicht-Negativ-Nebenbedingungen bei fminsearch einbinden kann?

Hab die ganze Zeit gegoogelt, allerdings keinen Referenzfall gefunden!

Vielen Dank.

MfG, Waldemar
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.01.2013, 15:01     Titel:
  Antworten mit Zitat      
Hallo,

über Strafterme, z.B. folgendes zur Zielfunktion addieren
Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 29.01.2013, 15:52     Titel:
  Antworten mit Zitat      
Hallo Harald,

Zitat:
z.B. folgendes zur Zielfunktion addieren
100*sum(x<0)


Wie soll ich das denn zu meiner Zielfunktion (Simulink-Modell) addieren?
Etwa in die in das Simulink-Modell eingebetteten Matlabfunktionen if-Abfragen einbauen?

Code:
if x(1) <0
x(1)=0
end
if x(2) <0
x(2)=0
end
...


Zitat:
100*sum(x<0)


Wofür steht eigentlich die 100 und sum?

Komme damit gerade nicht zu recht?

Könntest du mir auf die Sprünge helfen?

MfG, Waldemar
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.01.2013, 16:26     Titel:
  Antworten mit Zitat      
Hallo,

meine Idee war so. Du hast am Ende deiner Zielfunktion:
Code:
y=yout(length_yout);

Du ersetzt das durch:
Code:
y=yout(length_yout) + 100*sum(x<0);


sum steht für Summe. Damit werden die Elemente in x, die kleiner als 0 sind, gezählt. Die 100 ist ein Gewichtungsfaktor. Für jedes x, das < 0 ist, gibt es also 100 "Strafpunkte".

Je nachdem wie groß yout typischerweise ist, muss man das größer wählen.

Als Alternative ganz oben folgendes einfügen:
Code:

Dann ersparst du dir die Simulation in diesen Fällen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 29.01.2013, 16:30     Titel:
  Antworten mit Zitat      
Hallo Harald,


schöne Idee.

Werde es ausprobieren und Bericht halten.


Vielen Dank im Voraus.

MfG, Waldemar
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Waldemar
Themenstarter

Forum-Century

Forum-Century


Beiträge: 100
Anmeldedatum: 14.10.11
Wohnort: Neuss
Version: R2011b
     Beitrag Verfasst am: 29.01.2013, 19:00     Titel:
  Antworten mit Zitat      
Hallo Harald,

also mein aktueller Zwischenstand:

Alle Optimierungsfunktionen geben einen Minimalpunkt in der Nähe der Startwerte aus!

Dabei verhält sich fmincon ('interior-point') gegenüber fminsearch noch besser, zum einen weil die Zielfunktion ein wenig geringer ist und zum anderen weil der Minimalpunkt ein wenig weiter von den Startwerten entfernt liegt!

Kann man gegen diese - ich nenne es mal - 'Startwertabhängigkeit' unter Verwendung dieser Solver etwas unternehmen? Gibt es da noch ein paar Schrauben, an denen man drehen kann, damit man einen größeren Bereich abdeckt?


Wäre über eine Antwort sehr dankbar.

MfG, Waldemar


PS: patternsearch dauert schon länger, wobei ein besseres Ergebnis - zumindest gilt diese Aussage für die bisher untersuchten Arbeitspunkte - nicht garantiert wird!

PPS: Da ich für ungefähr 30 Arbeitspunkte die optimalen Wichtungen suche, spielt der Zeitfaktor schon eine erhebliche Rolle.
_________________

Im "ich brauch Hilfe"-Status
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.01.2013, 19:44     Titel:
  Antworten mit Zitat      
Hallo,

die Solver in der Optimization Toolbox suchen nach einem lokalen Minimum in der Nähe des Startwerts. Wenn es viele lokale Minima gibt und man das globale sucht, sollte man Solver aus der Global Optimization Toolbox verwenden (patternsearch, ga, MultiStart, ...) oder über mehrere Startpunkte iterieren. Dafür muss man allerdings auch Zeit mitbringen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.