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

Funktions-/Performanceverbesserung Fahrwerksberechnungsskrip

 

sprinter8919
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 13.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2017, 09:29     Titel: Funktions-/Performanceverbesserung Fahrwerksberechnungsskrip
  Antworten mit Zitat      
Hallo liebe Helferlein Wink

ich schreibe momentan eine Projektarbeit zur Fahrwerksberechnung und schreibe dazu ein Berechnungsprogramm mit Matlab.

Nun möchte ich die Veränderung von Fahrwerksparametern beim Einfedern eines Doppel-Querlenker-Fahrwerks berechnen. Dazu lasse ich einen Querlenker "einfedern", über die länge der Verbindung (Radträgerlänge) zum unteren Querlenker sowie über die Rotationsachse des unteren Querlenkers möchte ich nun die Position des äußeren Punktes bestimmen.

Meinen Programmcode findet ihr weiter unten. Er läuft auch und zeigt am Ende den Plot aber es dauert eben sehr lange, obwohl die Berechnung momentan nur einmal durchgeführt wird. Später soll die Berechnung des Punktes in kleinen Schritten über einen großen "Federweg" in einer Schleife berechnet werden, dazu möchte ich gerne die Laufzeit verringern.

Hat jmd eine Idee oder (allgemeine) Verbesserungsvorschläge zu der Berechnung?
Ich habe bereits 2 Varianten ausprobiert, diese sind im Code gekennzeichnet.

Code:


% Intersection of Sphere and Circle
%   12.12.17

clear; clc;
% ------------------------- Data -------------------------
SphereCenterP = [-10;700;500];                  % Upper Wishbone connection to Upright
SphereRadius = [-10;700;500]-[10;725;150];      % Steering Axis length
CircleAxisP1 = [250;350;175];                   % Mounting point lower Wishbone front (Rotation axis P1)
CircleAxisP2 = [-250;350;150];                  % Mounting point lower Wishbone rear (Rotation axis P2)
RotatingPoint = [10;725;100];                   % Lower Wishbone connection to Upright (Find new position when bumped!)


% -------------------- Definition of Circle --------------------
P_lWf = CircleAxisP1;    % Point of Wishbone Rotationaxis front
P_lWr = CircleAxisP2;    % Point of Wishbone Rotationaxis rear
P_lWo = RotatingPoint;   % Point of Upright to Wishbone
    %Wishbone Rotation-Axis
RA_lW = P_lWf-P_lWr;     % Wishbone otation Axis
    % Wishbone radius
Wi_length = sqrt((P_lWf(1)-P_lWr(1))^2+(P_lWf(2)-P_lWr(2))^2+(P_lWf(3)-P_lWr(3))^2);
Wf_length = sqrt((P_lWo(1)-P_lWf(1))^2+(P_lWo(2)-P_lWf(2))^2+(P_lWo(3)-P_lWf(3))^2);
Wr_length = sqrt((P_lWo(1)-P_lWr(1))^2+(P_lWo(2)-P_lWr(2))^2+(P_lWo(3)-P_lWr(3))^2);
Wir_angle = acos((Wf_length^2-Wr_length^2-Wi_length^2)/(-2*Wr_length*Wi_length));
W_radius = Wr_length*sin(Wir_angle);                % Circle Radius
    % Wishbone Center of Rotation
W_factor = (Wr_length*cos(Wir_angle))/Wi_length;
P_W_CoR = [P_lWr(1);P_lWr(2);P_lWr(3)]+W_factor*[P_lWf(1)-P_lWr(1);P_lWf(2)-P_lWr(2);P_lWf(3)-P_lWr(3)]; % Center of Rotation

    % Create new Coordinatesystem for Circle in 3D
u_vec = RA_lW;
u_vec = u_vec/norm(u_vec);
v_vec = P_lWo-P_W_CoR;
v_vec = v_vec/norm(v_vec);
w_vec = cross(u_vec,v_vec);
w_vec = w_vec/norm(w_vec);
CSys = [u_vec,v_vec,w_vec];


% VARIANTE 1
% -------------------- Definition of Circle --------------------
syms t
Circle = CSys*(W_radius*[0*t;cos(t);sin(t)])+P_W_CoR;
% -------------------- Definition of Sphere --------------------
syms x y z
S_radius = sqrt(SphereRadius(1)^2+SphereRadius(2)^2+SphereRadius(3)^2);     % Sphere Radius
Sphere = ((x-SphereCenterP(1))^2+(y-SphereCenterP(2))^2+(z-SphereCenterP(3))^2)-S_radius^2;
Sphere = subs(subs(subs(Sphere,x,Circle(1)),y,Circle(2)),z,Circle(3));
% -------------------- Define Intersection-Point --------------------
intersection = solve(Sphere,'Real',true);
CirclePoint_1 = vpa(subs(Circle,t,intersection(1)))
CirclePoint_2 = vpa(subs(Circle,t,intersection(2)))


% VARIANTE 2
% -------------------- Definition of Circle --------------------
%syms t
%Circle = CSys*(W_radius*[0*t;cos(t);sin(t)])+P_W_CoR
% -------------------- Definition of Sphere --------------------
%syms uv w
%S_radius = sqrt(SphereRadius(1)^2+SphereRadius(2)^2+SphereRadius(3)^2);     % Sphere Radius
%Sphere = SphereCenterP+(S_radius.*[cos(w)*cos(uv);cos(w)*sin(uv);sin(w)]);
% ---------- Define Intersection-Point ----------
%uvwt = solve(Sphere==Circle)%,'Real',true) %'IgnoreAnalyticConstraints',true
%intersection = vpa(subs(subs(subs(Sphere,uv,uvwt.uv),w,uvwt.w),t,uvwt.t))



% ---------- Plot ----------
    % Sphere
syms uv w
Sphere = SphereCenterP+(S_radius.*[cos(w)*cos(uv);cos(w)*sin(uv);sin(w)]);
uv2 = linspace(0,2*pi,20);    % Radiant des Kreises (0 bis 2Pi)
w2 = linspace(-pi,pi,20);       % Radiant des Kreises (0 bis Pi)
Sphere = subs(subs(Sphere,uv,uv2),w,w2);
plot3(Sphere(1,:), Sphere(2,:), Sphere(3,:),'Color',[0.75 0.75 0.75]);
axis equal; axis vis3d; axis('auto');
xlabel('x'); ylabel('y'); zlabel('z');
grid on; hold on;
    % Circle
t2 = linspace(0,2*pi,720);
Circle = subs(Circle,t,t2);
plot3(Circle(1,:),Circle(2,:),Circle(3,:),'b');
    % Coordinate System
quiver3(P_W_CoR(1),P_W_CoR(2),P_W_CoR(3),CSys(1,1),CSys(2,1),CSys(3,1),'b');
quiver3(P_W_CoR(1),P_W_CoR(2),P_W_CoR(3),CSys(1,2),CSys(2,2),CSys(3,2),'r');
quiver3(P_W_CoR(1),P_W_CoR(2),P_W_CoR(3),CSys(1,3),CSys(2,3),CSys(3,3),'g');
    % Lower Wishbone
plot3([P_lWf(1),P_lWo(1),P_lWr(1)], [P_lWf(2),P_lWo(2),P_lWr(2)], [P_lWf(3),P_lWo(3),P_lWr(3)],'r');
    % Upper Wishbone
P_uWo = SphereCenterP;
P_uWf = [P_lWf(1);P_lWf(2);P_uWo(3)];
P_uWr = [P_lWr(1);P_lWr(2);P_uWo(3)];
plot3([P_uWf(1),P_uWo(1),P_uWr(1)], [P_uWf(2),P_uWo(2),P_uWr(2)], [P_uWf(3),P_uWo(3),P_uWr(3)],'g');
    % Steering Axis
plot3([P_uWo(1),P_lWo(1)], [P_uWo(2),P_lWo(2)], [P_uWo(3),P_lWo(3)],'k');


 


Vielen Dank und Grüße
sprinter8919
Private Nachricht senden Benutzer-Profile anzeigen


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 14.12.2017, 10:16     Titel:
  Antworten mit Zitat      
In meiner Installation benötigt der Code 2,1 Sekunden. Wenn ich mir das im Profiler anschaue (bitte auch selber mal versuchen), dann wird 90% der Zeit durch die Initialisierung der symbolischen Mathematik sowie für die Grafik verbraucht. Dies dürfte aber in der echten Applikation kein Problem sein, weil es ein einmaliger Aufwand ist, oder?

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
sprinter8919
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 13.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2017, 10:42     Titel:
  Antworten mit Zitat      
Hallo Andreas,

danke für deine schnelle Antwort.

Ja, der Plot braucht sehr lange und ich brauche ihn später nicht, das stimmt. Den hab ich eher zum Verständnis aufgebaut weil ich lange Probleme hatte, die richtigen Punkte zu finden.
Die symbolische Mathe brauche ich jedoch zum auflösen. Oder gibt es eine elegantere Variante?

Sonst ist die Performance leider stark von den gewählten Punkten abhängig. Mit folgenden Punkten braucht die Berechnung wesentlich länger.

Code:

SphereCenterP = [0;7;7];
SphereRadius = [0;5;0];
CircleAxisP1 = [5;0;1];
CircleAxisP2 = [-5;0;2];
RotatingPoint = [0;7;2];
 


Hast du noch einen weiteren Tipp?

Danke und Gruß
sprinter8919
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 14.12.2017, 12:33     Titel:
  Antworten mit Zitat      
Gut, kann ich auch bestätigen. Der Code an sich ist fein und nicht "beschleunigbar". Die implementierte Mathematik ist hat sehr aufwändig. Wenn man mal anschaut was da bei "intersection" für ein Term rauskommt...

Die Frage ist eher mathematisch zu stellen. Muss man das wirklich symbolisch lösen?

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
sprinter8919
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 13.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2017, 13:23     Titel:
  Antworten mit Zitat      
Danke für die Einschätzung. Schade, dass es nicht schneller geht.

Was wäre denn dein Vorschlag zu einer anderen Lösungsmethode? Kenne bisher nur diese in Matlab.
Habe auch schon versuche eine mathematische Funktion aufzustellen aber bin leider nicht sehr weit gekommen.

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 14.12.2017, 16:20     Titel:
  Antworten mit Zitat      
Ich glaube es ist einfacher rein numerisch. Hier z.B. finden sich fertige Codes für "Intersection of Plane and Sphere":

https://www.mathworks.com/matlabcen.....=8549167&tab=function

und anderen, die man vielleicht anpassen kann.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
sprinter8919
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 13.12.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.12.2017, 17:17     Titel:
  Antworten mit Zitat      
Danke, das schaue ich mir mal an Smile

Habe den vorhandenen Code noch nochmal geändert aber es ist weiterhin symbolisch gerechnet.

Code:

% get new Point of Wishbone
%   14.12.2017

clear; clc;
% --------------------------------- Data ----------------------------------
    % Test Suspension (K0-Lage)
P_uWo = [0;10;10];              % Point upper Wishbone outer
P_lWo = [0;10;0];               % Point lower Wishbone outer
P_lWf = [1;0;0.1];              % Point lower Wishbone mounting front
P_lWr = [0;0;0];                % Point lower Wishbone mounting rear

% -------------------------------- Circle ---------------------------------
    % Steering Axis length
A_St_length = norm(P_uWo-P_lWo);
    %Wishbone Rotation-Axis
A_lWR = P_lWf-P_lWr;
    % Wishbone radius
Wi_length = norm(P_lWf-P_lWr);
Wf_length = norm(P_lWo-P_lWf);
Wr_length = norm(P_lWo-P_lWr);
Wir_angle = acos((Wf_length^2-Wr_length^2-Wi_length^2)/(-2*Wr_length*Wi_length));
W_radius = Wr_length*sin(Wir_angle)         % Circle Radius
    % Wishbone Center of Rotation
W_factor = (Wr_length*cos(Wir_angle))/Wi_length;
P_lW_CoR = P_lWr+W_factor*(P_lWf-P_lWr)     % Center of Rotation

    % Create new Coordinatesystem for Circle in 3D
u_vec = A_lWR;
u_vec = u_vec/norm(u_vec);
v_vec = P_lWo-P_lW_CoR;
v_vec = v_vec/norm(v_vec);
w_vec = cross(u_vec,v_vec);
w_vec = w_vec/norm(w_vec);
CSys = [u_vec,v_vec,w_vec]

    % Circle-Function
syms t
Circle = CSys*(W_radius*[0*t;cos(t);sin(t)])+P_lW_CoR

    % Intersection
intersection = norm(P_uWo-Circle)-A_St_length
t = solve(intersection)
point = vpa(subs(Circle,t))
 


Wenn ich eine endgültige Funktion hab schicke ich sie nochmal.

Gruß sprinter8919
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.