LabVIEWForum.de - extrem hohe Rechenzeit in Matlab-Skriptknoten

LabVIEWForum.de

Normale Version: extrem hohe Rechenzeit in Matlab-Skriptknoten
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3 4
Hier ist das zugehörige Matlab-Programm. (Matlab R2009b) Ich hab den unteren Teil auskommentiert. (Dort hab ich nur mit Beispielen umhergerechnet)
Die Teile von meinem Betreuer (Drehmatrizen ect.) gehen bis Zeile 35. Danach hab ich halt noch die nötigen Schritte dazu geschrieben um letztendlich die Jacobimatrix auszurechnen.

@GerdW Hab das irgendwann mal in einem anderen VI so gesehen und für mich als "übersichtlichste" Methode übernommen.Wink

edit:"Hochladen fehlgeschlagen. Dir ist es nicht gestattet, eine Datei dieses Dateitypes hochzuladen"

keine .m-files?

Dann halt in Textform:

clear all
close all
clc

syms d1 d23 s1 s4 s6 sB1 cB1 sB2 cB2 sB3 cB3 sB4 cB4 sB5 cB5 sB6 cB6

T11_=[cB1 -sB1 0; sB1 cB1 0; 0 0 1];
T22_=[cB2 -sB2 0; sB2 cB2 0; 0 0 1];
T33_=[cB3 -sB3 0; sB3 cB3 0; 0 0 1];
T44_=[cB4 -sB4 0; sB4 cB4 0; 0 0 1];
T55_=[cB5 -sB5 0; sB5 cB5 0; 0 0 1];
T66_=[cB6 -sB6 0; sB6 cB6 0; 0 0 1];

T1_2=[1 0 0; 0 0 1; 0 -1 0];
T2_3=eye(3);
T3_4=[1 0 0; 0 0 -1; 0 1 0];
T4_5=T1_2;
T5_6=T3_4;
T6_7=eye(3);

T17=T11_*T1_2*T22_*T2_3*T33_*T3_4*T44_*T4_5*T55_*T5_6*T66_*T6_7;

r12in1_=[d1; 0; s1];
r23in2_=[d23; 0; 0];
r34in3_=[0; 0; 0];
r45in4_=[0; 0; s4];
r56in5_=r34in3_;
r67in6_=[0; 0; s6];

r12=T11_*r12in1_;
r23=T11_*T1_2*T22_*r23in2_;
r34=T11_*T1_2*T22_*T2_3*T33_*r34in3_;
r45=T11_*T1_2*T22_*T2_3*T33_*T3_4*T44_*r45in4_;
r56=T11_*T1_2*T22_*T2_3*T33_*T3_4*T44_*T4_5*T55_*r56in5_;
r67=T11_*T1_2*T22_*T2_3*T33_*T3_4*T44_*T4_5*T55_*T5_6*T66_*r67in6_;
r17=r12+r23+r34+r45+r56+r67; %Ortsvektor x,y,z
r27=r23+r34+r45+r56+r67;
r37=r34+r45+r56+r67;
r47=r45+r56+r67;
r57=r56+r67;

u1in1=[0 ;0; 1];
u2in2=[0 ;0; 1];
u3in3=[0 ;0; 1];
u4in4=[0 ;0; 1];
u5in5=[0 ;0; 1];
u6in6=[0 ;0; 1];
u2in1=T11_*T1_2*u2in2;
T1_3=T11_*T1_2*T22_*T2_3;
u3in1=T1_3*u3in3;
T1_4=T11_*T1_2*T22_*T2_3*T33_*T3_4;
u4in1=T1_4*u4in4;
T1_5=T11_*T1_2*T22_*T2_3*T33_*T3_4*T44_*T4_5;
u5in1=T1_5*u5in5;
T1_6=T11_*T1_2*T22_*T2_3*T33_*T3_4*T44_*T4_5*T55_*T5_6;
u6in1=T1_6*u6in6;

J_hilf1=cross(u1in1,r17);
J_hilf2=cross(u2in1,r27);
J_hilf3=cross(u3in1,r37);
J_hilf4=cross(u4in1,r47);
J_hilf5=cross(u5in1,r57);
J_hilf6=cross(u6in1,r67);

Jacobi=[ u1in1(1) u2in1(1) u3in1(1) u4in1(1) u5in1(1) u6in1(1);
u1in1(2) u2in1(2) u3in1(2) u4in1(2) u5in1(2) u6in1(2);
u1in1(3) u2in1(3) u3in1(3) u4in1(3) u5in1(3) u6in1(3);
J_hilf1(1) J_hilf2(1) J_hilf3(1) J_hilf4(1) J_hilf5(1) J_hilf6(1);
J_hilf1(2) J_hilf2(2) J_hilf3(2) J_hilf4(2) J_hilf5(2) J_hilf6(2);
J_hilf1(3) J_hilf2(3) J_hilf3(3) J_hilf4(3) J_hilf5(3) J_hilf6(3)];
Ich kann verstehen, dass dir das kein Spaß machen wird:Daber da ist bis auf eye (erzeugt eine n*n Matrix mit 1ern in der Hauptdiagonalen) keine andere MATLAB Funktion.

Du solltest dich in die Mathematik davon einarbeiten, das kann man bestimmt gut mit LV Mitteln lösen.
Tja, bei der Diskussion, was nun tatsächlich schneller ist, wird man sich wohl ewig im Kreis drehen...WackoFight

Es wird aber in diesem Fall wohl das beste sein, den MATLAB-Code komplett in LV zu übertragen. Es werden ja keine Toolboxen verwendet, die rechtfertigen, warum man weiterhin MATLAB nutzen sollte.
Also: Alles in LV übertragen, wobei ich mir parallel noch die mathematischen Aufzeichnungen besorgen würde, um das m-Skript besser verstehen zu können.Tippen
Im Moment ist ja die Herangehensweise so, dass die Jacobimatrix ein mal symbolisch berechnet wird und anschließend spaltenweise die 6 Gelenkwinkel beta eingesetzt werden.

Ich glaube ich wüsste ungefähr, wie ich das Ganze in LV in der Art und Weise umsetze, dass ich für jede Spalte den kompletten Berechnungsgang gehe, aber das wird ja von vorneherein viel mehr Rechenaufwand sein, als das einmalige ausrechnen der Jacobimatrix und die anschließende spaltenweise Substitution der Gelenkwinkel und Berechnung der zugehörigen Spalte in beta_d.

Wie könnte man das Ganze denn in LV so umsetzen, dass eben auch erst 1 mal symbolisch gerechnet und anschließend n mal eingesetzt wird?
Denn wenn ich LV die ganze Berechnung n mal machen lass, kann ich mir die Mühe sparen, da der Rechenaufwand, wie gesagt, sehr viel größer sein dürfte, als mit dem jetzigen Skriptknoten.

(Ich habe übrigens mittlerweile eine Ersatzlösung gefunden, die die Rechenzeit zumindest auf 1/10 der bisherigen Rechenzeit beschränkt: ich berechne nur jede zehnte Spalte von beta_d. Da von beta_d im Nachhinein nur das Max. und Min. interessieren und die Abstände zwischen den einzelnen Spalten sehr klein sind, ist das Ergebnis dennoch ziemlich genau gewesen beim testen. Aber die Lösung ist natürlich trotzdem irgendwie "schwammig".)
Hallo Fiinrod,

"Wie könnte man das Ganze denn in LV so umsetzen, dass eben auch erst 1 mal symbolisch gerechnet und anschließend n mal eingesetzt wird?"
Alle deine Hilfsvariablen oben im m-Skript sind in LV nur Drähte und Konstanten. Da wird auch nur einmal berechnet und dann zur Jacobi-Matrix zusammengesetzt...
Mache doch einfach mal, unter Verwendung des geposteten SubVI, ein lauffähiges Proramm mit Beispieldaten, poste das und schreibe dazu, wie lange es bei Dir braucht. Dann könnten andere es mit LV2009 laufen lassen und die Zeit vergleichen. Ich prophezeie eine positive Überraschung.
' schrieb:Mache doch einfach mal, unter Verwendung des geposteten SubVI, ein lauffähiges Proramm mit Beispieldaten, poste das und schreibe dazu, wie lange es bei Dir braucht. Dann könnten andere es mit LV2009 laufen lassen und die Zeit vergleichen. Ich prophezeie eine positive Überraschung.
Man braucht aber eine MATLAB Lizenz für den Script-KnotenMellow
' schrieb:Man braucht aber eine MATLAB Lizenz für den Script-KnotenMellow
Ja klar, deshalb war mein Formulierung ja auch "Dann könnten Andere es mit LV2009 laufen lassen" - also nicht ich armer Hund, der ich nur die prof. Version ohne Zusatztools habe. Gestern ist übrigesn LV2010 (deutsch) mit der Post gekommen.
' schrieb:Ja klar, deshalb war mein Formulierung ja auch "Dann könnten Andere es mit LV2009 laufen lassen" - also nicht ich armer Hund, der ich nur die prof. Version ohne Zusatztools habe.
MATLAB ist doch kein Zusatztool:huh:Das weißt du doch aber auch.

Andererseits interessanter Blickwinkel. Das müsste denen von mathworks mal einer sagen, dass die nur eine Toolbox für LabVIEW herstellenRofl
@Dimitri
Ja klar weiß ich das.
Ich würde auch den Code in LV übertragen und würde mit der Anfangsvermutung an die Sache herangehen, daß, wenn diese Jacobi-Matrix außerhalb akademischer Kreise eine praktische Bedeutung >0 hat, eine entprechende oder sehr ähnliche Funktion, vielleicht auch unter anderem Namen, in der LV-Palette mit enthalten ist.
Seiten: 1 2 3 4
Referenz-URLs