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

Verschiedene Werte trotz gleicher Formel

 

Starter92
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 08.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2018, 12:44     Titel: Verschiedene Werte trotz gleicher Formel
  Antworten mit Zitat      
Hallo!

Ich habe seit Tagen folgendes Problem: Es existiert der Vektor Q = [q0,q1,...qN] bei dem sich qk+1 immer aus qk und uk+1 berechnet, wobei q0 und u gegeben sind. U wird gesucht, um die Bedingungen von fmincon zu erfüllen. Ich habe den Gradienten aufgestellt (JQ zu Q (jacobian)) aber Matlab sagt, der Gradient sei falsch. Also habe ich symbolische Werte aufgestellt, damit die jacobian berechnet (dauert ewig...) und verglichen. Nun meine Frage:
Am Anfang stimmt das Ergebnis bis auf eine Abweichung von etwa 10e-14 überein. Im nächsten Schritt der optimal control wird der Unterschied aber größer. Erst habe ich gedacht, es liegt am Gradienten, aber dann habe ich die Funktion Fd (für die Berechnung von qk+1) mit symbolischen und numerischen Werten verglichen und das Ergebnis weicht wieder ab.. kann doch nicht sein, wenn die Funktion genau die selbe ist!?

Wäre super wenn mir wer helfen könnte!

Danke und liebe Grüße :)


Code:

q0 = par.Q0;
Nu = par.Nu;
N = par.N;

syms_q0 = sym('q0',[36 1],'real');
syms_u = sym('u',[N*Nu 1],'real');
syms_qk = sym('q0',[36 1],'real');

Q = zeros(12*Nu,par.N+1);  
%Calculating Q = [q0,q1,...,qN] where q0 and vector U are given
Q(:,1) = q0;
arg_q0 = num2cell(q0);
arg_u = num2cell(U);

for k = 1:N
    Q(:,k+1) = Fd(Q(:,k),U((k-1)*Nu+1:k*Nu),par);
end

lq = length(q0);
JQ = zeros((N+1)*lq,N*Nu);
JQ(1:lq,:) = zeros(lq,N*Nu);
for k = 1:N
    j = 1;
    qkm1 = Q(:,k);
    uj = U((j-1)*Nu+1:j*Nu);
    D1FD = D1Fd(qkm1,uj,par); %derivative d/dq

    %--------------------------------------------------------------------
    %symbolic part
    syms_uj = syms_u((k-1)*Nu+1:k*Nu);
    syms_qk = Fd(syms_qk,syms_uj,par);

    F_Test1 = matlabFunction(syms_qk,'Vars',[syms_q0.' syms_u.']);
    F_Test_erg = F_Test1(arg_q0{:},arg_u{:});
                   %Different to Q....although I used Fd both times?!

    Test2 = jacobian(syms_qk,syms_u);
    F_Test2 = matlabFunction(Test2,'Vars',[syms_q0.' syms_u.']);
    F_Test_erg2 = F_Test2(arg_q0{:},arg_u{:});   %Difference to JQ

    %--------------------------------------------------------------------
    %non-symbolic part
    while j < k    
        JQkm1 = JQ(((k-1)*lq)+1:((k-1)*lq)+lq,(j-1)*Nu+1:j*Nu);
        JQ(k*lq+1:(k*lq)+lq,(j-1)*Nu+1:j*Nu) = D1FD * JQkm1;
        j = j + 1;
    end
    if k == j
        JQ(k*lq+1:(k*lq)+lq,(j-1)*Nu+1:j*Nu) = D2Fd(qkm1,uj,par);
    end
end

 
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

in der Form kann zumindest ich nichts damit anfangen.
Hilfreich ist immer ein möglichst kleines, reproduzierbares Beispiel. Dein Beispiel ist dafür, dass es "nur" um unterschiedliche Ergebnisse zweier Berechnungen geht, recht lang und dennoch nicht reproduzierbar.

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

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 08.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2018, 15:55     Titel: Neuer Versuch
  Antworten mit Zitat      
okay, dann versuche ich es nochmal.. sorry.
Die Version müsste man jetzt laufen lassen können.
Liebe Grüße

Code:
clear all

N = 5;         % steps
dt = 0.1;      % step size

q0 = [0 -2.5 0 1 0 0 0 1 0 0 0 1 0 -7.5 0 1 0 0 0 1 0 0 0 1 0 -11 0 1 0 0 0 1 0 0 0 1]';
Nu = 3;
U =  [pi/10 0 0 pi/10 0 0 pi/10 0 0 pi/10 0 0 pi/10 0 0]';

% Allokieren des Speicherplatzes (original)
Q = zeros(12*Nu,N+1);

% Erster Wert
Q(:,1) = q0;

%Testwerte
F_Test_erg(:,1) = q0;
arg_q0 = num2cell(q0);
arg_u = num2cell(U);
syms_q0 = sym('q0',[36 1],'real');
syms_u = sym('u',[N*Nu 1],'real');
syms_qk = sym('q0',[36 1],'real');

for k = 1:N
% (original)
    Q(:,k+1) = Fd_test(Q(:,k),U((k-1)*Nu+1:k*Nu));
   
% (test)
    syms_uj = syms_u((k-1)*Nu+1:k*Nu);
    syms_qk = Fd_test(syms_qk,syms_uj);
    F_Test1 = matlabFunction(syms_qk,'Vars',[syms_q0.' syms_u.']);
    F_Test_erg(:,k+1) = F_Test1(arg_q0{:},arg_u{:});
end


mit

Code:
function res = Fd_test(qk,ukp1)

rep1 = [cos(ukp1(1)),-sin(ukp1(1)),0;...
                sin(ukp1(1)),cos(ukp1(1)),0;...
                0,0,1];
           
rep2 = [cos(ukp1(2)),-sin(ukp1(2)),0;...
                sin(ukp1(2)),cos(ukp1(2)),0;...
                0,0,1];
           
rep3 = [cos(ukp1(3)),-sin(ukp1(3)),0;...
                sin(ukp1(3)),cos(ukp1(3)),0;...
                0,0,1];
           

phi_1 = qk(1:3);                % actual position value thigh
d1_1 = qk(4:6);                 % directors thigh
d2_1 = qk(7:9);
d3_1 = qk(10:12);

d1_2 = qk(16:18);                % directors shank
d2_2 = qk(19:21);
d3_2 = qk(22:24);

d1_3 = qk(28:30);                % directors foot
d2_3 = qk(31:33);
d3_3 = qk(34:36);

%calculating rho
rho_12 = -2.5*d2_1;
rho_22 = 2.5*d2_2;
rho_23 = -2.5*d2_2;
rho_33 = d2_3;

exp_u_1 = rep1;
exp_u_2 = rep2;
exp_u_3 = rep3;

% Reparamization
FD1 = [exp_u_1 * phi_1;...
      exp_u_1 * d1_1;...
      exp_u_1 * d2_1;...
      exp_u_1 * d3_1];
   
FD2 = [FD1(1) + exp_u_1 * (rho_12 - exp_u_2 * rho_22);...
      exp_u_1 * exp_u_2 * d1_2;...
      exp_u_1 * exp_u_2 * d2_2;...
      exp_u_1 * exp_u_2 * d3_2];
 
FD3 = [FD2(1) + exp_u_1 * exp_u_2 * (rho_23 - exp_u_3 * rho_33);...
      exp_u_1 * exp_u_2 * exp_u_3 * d1_3;...
      exp_u_1 * exp_u_2 * exp_u_3 * d2_3;...
      exp_u_1 * exp_u_2 * exp_u_3 * d3_3];

res = [FD1;FD2;FD3];

end
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.02.2018, 17:00     Titel:
  Antworten mit Zitat      
Hallo,

in dem Beispiel sind die Abweichungen im Bereich 1e-16. Das ist eine m.E. erwartbare Konsequenz davon, dass man mit einer endlichen Anzahl Stellen arbeitet. Sogar
Code:
sin(pi)
ans =
   1.2246e-16


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



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 - 2024 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.