2016-06-24 22 views
0

EDIT: Ich habe den Profiler wie vorgeschlagen verwendet, und es sieht aus wie Matlab verbrachte eine erhebliche Menge an Zeit mit Symbolen und die Lösung des Systems von Gleichungen. Also werde ich meine Frage etwas ändern: Gibt es einen schnelleren Weg, dieses System von Gleichungen zu implementieren, vielleicht eines, das keine Deklaration von Symbolen beinhaltet?MATLAB-Skript läuft langsam: System der Gleichungen lösen

function [As_rad, Ae_rad] = pos_to_angle(x_pos, y_pos) 
    % Converts given x and y coordinates into angles (using link lengths) 

    Ls = 0.4064; % in meters 
    Le = 0.51435; % in meters 
    x_offset = 0.0; 
    y_offset = -0.65; % from computer running the robot 

    syms angle_s angle_e 

    x = x_pos + x_offset;  % Account for offset of origins 
    y = y_pos + y_offset;  % between motor and workspace 

    eqn1 = x == Ls*cos(angle_s) + Le*cos(angle_e); % Actual conversion 
    eqn2 = y == Ls*sin(angle_s) + Le*sin(angle_e); 
    sol1 = solve([eqn1, eqn2], [angle_s, angle_e]); 
    As_rad_mat = sol1.angle_s; 
    Ae_rad_mat = sol1.angle_e; 

    if As_rad_mat(1) > Ae_rad_mat(1); 
     As_rad = As_rad_mat(1); 
     Ae_rad = Ae_rad_mat(1); 
    else 
     As_rad = As_rad_mat(2); 
     Ae_rad = Ae_rad_mat(2); 
    end 
end 

Um genauer zu sein, es sah aus wie eine Funktion mupadmex (was ich glaube, mit Symbolen zugeordnet ist) etwa 80% der Rechenzeit aufnahm. Das Obige ist nur ein Beispiel dafür, wie ich das Gleichungssystem im ganzen Skript gelöst habe.

+4

[Profil Ihren Code] (http://www.mathworks.com/help/matlab/matlab_prog/profiling-for-improving-performance.html) – excaza

+2

Die wichtigsten Funktionen in Ihrer 'for'-Schleife haben wir keinen Zugriff Daher können wir auf keinen Fall herausfinden, warum es bei jeder Iteration Ihres Codes immer langsamer wird. Das Problem ist offensichtlich etwas, das in den Funktionen selbst enthalten ist. Entweder zeigen Sie uns den Code für jede Funktion, oder als was excaza erwähnt ... profile deinen Code. – rayryeng

+0

Was Sie lösen, ist ein nichtlineares System von Gleichungen, da die zu lösenden Variablen Argumente in nichtlineare Funktionen sind. 'Solve' ist so ziemlich die einzige Möglichkeit, hierher zu kommen. – rayryeng

Antwort

0

Vielen Dank für die Antworten! Ich benutzte Profiler und fand heraus, dass die Rechenzeit von der Lösung des Gleichungssystems kam, jedes Mal wenn das Programm die Schleife durchlief. Also habe ich ein separates Skript verwendet, um die Gleichung symbolisch zu lösen, also muss das Skript nur Algebra machen. Es läuft jetzt VIEL schneller.