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))
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?
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.
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?
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.
Wenn ich eine endgültige Funktion hab schicke ich sie nochmal.
Gruß sprinter8919
Einstellungen und Berechtigungen
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
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.