Verfasst am: 26.02.2014, 11:53
Titel: 3D Plot aus Symbolic Math Toolbox
Hallo, in dem unteren Programm habe ich t als die Nenner einer Übertragungsfunktion und ich versuche ein 3d Grafik aus den Variablen c12 und c23 zu machen, aber die beiden Variablen hängen voneinander und von der Frequenz f ab, für die Frequenzen gilt für c12: 1 Hz<f<2,5 Hz und für c23 gilt 1,5 Hz<f<3 Hz, in der Grafik sollten in der x-Achse c12, in der y-Achse c23 und z-Achse die beiden Frequenzen stehen. Ich habe die Frequenzen in den Funktionen eingesetzt und in zwei Matrizen gespeichert, und jetzt hängt c12 von c23 ab und umgekehrt, ist es möglich eine Grafik daraus zu plotten? Ich bekomme eine Fehlermeldung wenn ich z.B. surf(X,Y,t1) ausführe.
Code:
%--------------------------------------------------------------------------
% Parametern
%--------------------------------------------------------------------------
s=tf('s');
nnenn=17/60; % Umdrehungen pro minute
n=72; % Übertragungsrate
Vnenn=11.5; % Normierte Windgeschwindigkeit
p=1.229; % Luftdichte
R=60; % Radius der Rotorblatt
cp_nenn=0.469; % rated power coefficient
Mnenn=p*R^2*Vnenn^3*cp_nenn/(4*nnenn); % Normierte Drehmoment
Mgnenn=Mnenn/n; % normierte Drehmoment der Generator
ngnenn=n*nnenn; % Normierte Drehzahl der Generator
Tstr=0.005; % Zeitkonstante des Stromregelkreis
Jges=3.1*10^7; % Gesamte Trägheitsmoment: Jges=Jm+Jnr/(n^2)+Jrb/(n^2)
J1=Jges*0.07; % Trägheitsmoment der Generator
J2=Jges*0.48; % Trägheitsmoment zwischen Nabe und der oberen Teil des Blatts
J3=Jges*0.45; % Trägheitsmoment der oberen Teil des Blatts
% Parameter des elektrisch-mechanischen Triebstrangssystems
v1=J1/J2;
v2=J2/J3;
%--------------------------------------------------------------------------
% Symbolic Math Toolbox
%--------------------------------------------------------------------------
syms c12 c23 f
T12=Mnenn/(c12*2*pi*nnenn*n^2); % Zeitkonstante T1,2
T23=Mnenn/(c23*2*pi*nnenn*n^2); % Zeitkonstante T2,3
Tm=(2*pi*nnenn*n^2*J1)/Mnenn; % Hochlaufzeit des Motors Tm
agn4=(Tm^2*T12*T23)/(v1*(v1*v2+v2+1)); % Koeffizient von omega^4
agn2=Tm/(v1*v2+v2+1)*(T12*(v2+1) + T23*(v1+1)/v1); % Koeffizient von omega^2
t=agn4*(1i*2*pi*f)^4+agn2*(1i*2*pi*f)^2+1; % Nenner der Übertragungsfunktion. omega=j*2*pi*f
% c12(c23,f) und C23(c12,f)
c12_f=solve(t,c12);
c23_f=solve(t,c23);
% Wertebereiche der Frequenzen
t1=linspace(1,2.5);
t2=linspace(1.5,3);
% Achsen. Frequenzen in den Funktionen c12 und c23 einsetzen
X=subs(c12_f,f,t1);
Y=subs(c23_f,f,t2);
X und Y enthalten ja noch c12 und c23. Wie soll das denn geplottet werden?
Zudem brauchst du für surf als drittes Argument eine Matrix.
Grüße,
Harald
fcosta
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 28.02.2014, 21:40
Titel:
Vielen Dank für die Hilfe!
Ich habe was anderes gedacht, z.B. die Funktion c12 hängt von der Frequenz und c23 ab, so: c12=c12(c23,f) und c23 hängt von c12 und der Frequenz ab, c23=c23(c12,f) dann wollte ich um c12 zu berechnen, die Frequenz von c12 "festhalten", z.B. bei 1Hz (Anfangswert) und die Funktion c23 in c12 einsetzen und die Frequenz von c23 variieren lassen, von 1,5Hz bis 3Hz, und alle berechneten Werte in einer Matrix speichern. Muss man dafür ein for-Schleife benutzen, oder gibt es ein andere Befehl dafür?
Ich glaube für jede berechnete Wert kommt zwei Werte für c12 heraus.
Wie könnte man die Werte in einer Matrix speichern? Ich habe die Code geschrieben:
Code:
for j=1:0.1:1.5 for k=1.5:0.1:3
hilf=subs(c12_f,f,j); % von c23 abhängig
hilf2=subs(c23_f,f,k); % von c12 abhängig
a=subs(hilf,c23,hilf2); % c12(c12) [SteifigkeitC12]=solve(c12==a); % die Lösung von c12(c12) in einer Matrix speichern end end
man kann zwar for-Schleifen über Nicht-Integer-Werte laufen lassen, aber da macht man sich teilweise selbst das Leben schwer. Einfacher hier etwa so:
Code:
allj = 1:0.1:1.5;
allk = 1.5:0.1:3;
SteifigkeitC12 = zeros(numel(j), numel(k));
for idx1 = 1:numel(allj) for idx2 =1:numel(allk)
hilf=subs(c12_f,f,allj(idx1)); % von c23 abhängig
hilf2=subs(c23_f,f,allk(idx2)); % von c12 abhängig
a=subs(hilf,c23,hilf2); % c12(c12)
SteifigkeitC12(idx1, idx2) =solve(c12==a); % die Lösung von c12(c12) in einer Matrix speichern end end
Das setzt natürlich voraus, dass es immer eine eindeutige Lösung gibt.
Grüße,
Harald
fcosta
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 02.03.2014, 13:20
Titel:
Hallo, ich habe eine kleine Änderung gemacht, ich speichere die Steifigkeiten C12 und C23 in Abhängigkeit von C12 in zwei Matrizen, später in einer anderen Schleife fange ich mit C23 und dann berechne ich die Steifigkeit C12 in Abhängigkeit von C23, aber in dieser unteren Code sehen alle Zeilen gleich wie die erste aus, ich habe den Fehler nicht gefunden, die Schleifen sind aber richtig, oder?
for idx1 = 1:numel(allj) for idx2 =1:numel(allk)
a=subs(c12_f,f,idx1);
b=subs(c23_f,f,idx2);
[SteifigkeitenC12(idx1,idx2),SteifigkeitenC23_C12(idx2,idx1)]=solve(a,b,c12,c23);
end end
ich glaube die Variabel idx1 der äußere Schleife läuft nicht, er bleibt bei idx1=1 stehen.
Kleine Änderung:
Code:
for idx1 = 1:numel(allj) for idx2 =1:numel(allk)
a=subs(c12_f,f,allj(idx1));
b=subs(c23_f,f,allk(idx2));
[SteifigkeitenC12(idx1,idx2),SteifigkeitenC23_C12(idx2,idx1)]=solve(b,a,c12,c23);
end end
Zudem ist mir nicht klar, warum du einmal idx1 und idx2 vertauscht.
Was genau soll folgendes heißen?
Zitat:
aber in dieser unteren Code sehen alle Zeilen gleich wie die erste aus
Zitat:
ich habe den Fehler nicht gefunden
Woraus schließt du, dass es einen Fehler gibt?
Grüße,
Harald
fcosta
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 02.03.2014, 19:32
Titel:
Hi, ich hatte die Reihenfolge vertauscht weil die Matrix SteifigkeitenC23_C12 die innere Schleife benutzt, und danach die äußere Schleife.
Kann man bei Matlab ein 3d Grafik plotten aus zwei Funktionen, in der Fall, C12(C23,f) und C23(C12,f), wo f in C12 zwischen 1Hz und 1,5Hz liegt und f für C23 zwischen 1,5Hz und 3Hz? Die Funktion C23 kann man in C12 einsetzen, wenn man vorher die f's durch f1 und f2 tauscht, dann wird es ein bisschen einfacher vieleicht.
Die Aufgabe ist zu kompliziert geworden, weil wenn man solve(c12==a) benutzt, kommt zwei Ergebnisse heraus, das kann man nicht mehr danach plotten, glaube ich.
ich hatte die Reihenfolge vertauscht weil die Matrix SteifigkeitenC23_C12 die innere Schleife benutzt, und danach die äußere Schleife
Der Logik kann ich nicht folgen.
Zitat:
Kann man bei Matlab ein 3d Grafik plotten aus zwei Funktionen, in der Fall, C12(C23,f) und C23(C12,f), wo f in C12 zwischen 1Hz und 1,5Hz liegt und f für C23 zwischen 1,5Hz und 3Hz? Die Funktion C23 kann man in C12 einsetzen, wenn man vorher die f's durch f1 und f2 tauscht, dann wird es ein bisschen einfacher vieleicht.
Auch dem kann ich leider nicht folgen. Insofern sage ich einfach mal, was du machen kannst: eine (abhängige) Größe plotten, die von zwei (unabhängigen) Größen abhängig ist - also z = f(x, y).
Zitat:
Die Aufgabe ist zu kompliziert geworden, weil wenn man solve(c12==a) benutzt, kommt zwei Ergebnisse heraus, das kann man nicht mehr danach plotten, glaube ich.
Das könnte man so interpretieren, dass es zwei Lösungszweige gibt. Auch das ließe sich dann plotten.
Grüße,
Harald
fcosta
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 02.03.2014, 21:09
Titel:
Zitat:
ich hatte die Reihenfolge vertauscht weil die Matrix SteifigkeitenC23_C12 die innere Schleife benutzt, und danach die äußere Schleife
Bei der Matrix SteifigkeitenC12(idx1,idx2) werden die Werte von c12 in der Matrix SteifigkeitC12 gespeichert, z.B. in der ersten Zeile werden die Werte von c12 für die Frequenz der ersten Funktion a gleich 1Hz und die Frequenz der Funktion b wird von 1,5Hz bis 3Hz variiert, für SteifigkeitenC23_C12 habe ich die Reihenfolge vertausch damit in jeder Zeile die Frequenz der zweiten Funktion b festgehalten wird, und die Frequenz der Funktion a von 1Hz bis 1,5 Hz variiert, hier kann man die Matrix SteifigkeitenC23_C12 besser sehen:
Zitat:
Kann man bei Matlab ein 3d Grafik plotten aus zwei Funktionen, in der Fall, C12(C23,f) und C23(C12,f), wo f in C12 zwischen 1Hz und 1,5Hz liegt und f für C23 zwischen 1,5Hz und 3Hz? Die Funktion C23 kann man in C12 einsetzen, wenn man vorher die f's durch f1 und f2 tauscht, dann wird es ein bisschen einfacher vieleicht.
Ich wollte bei der Funktion C12(C23,f), in Matlab sie ist die Funktion "a", die Variabel f durch f1 vertauschen und bei der Funktion C23(C12,f), in Matlab das ist die Funktion b, die Frequenz f durch f2 vertauschen, weil die Intervalle der Frequenz nicht gleich sind. Danach wollte ich die "neue" Funktion C23(C12,f2) in C12(C23,f1) einsetzen, dann bekommt man eine neue Funktion C12(C12,f1,f2), danach könnte man die bekannten Frequenzen f1 und f2 in dieser Funktion einsezen.
Code:
Die Aufgabe ist zu kompliziert geworden, weil wenn man solve(c12==a) benutzt, kommt zwei Ergebnisse heraus, das kann man nicht mehr danach plotten, glaube ich.
Ich dachte das Plotten von zwei Ergebnisse wäre nicht möglich.
fcosta
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 03.03.2014, 11:50
Titel:
Beitrag löschen Beitrag melden Antworten mit Zitat Beitrag bearbeiten oder löschen
Ich hatte ein Teil des Programms geändert, ist vieleicht so besser, ich habe die Funktionen C12 und C23 geändert, so dass sie nur von der Frequenzen f1 und f2 abhängig sind:
Code:
%--------------------------------------------------------------------------
% Symbolic Math Toolbox
%--------------------------------------------------------------------------
syms c12 c23 f f1 f2
T12=Mnenn/(c12*2*pi*nnenn*n^2); % Zeitkonstante T1,2
T23=Mnenn/(c23*2*pi*nnenn*n^2); % Zeitkonstante T2,3
Tm=(2*pi*nnenn*n^2*J1)/Mnenn; % Hochlaufzeit des Motors Tm
agn4=(Tm^2*T12*T23)/(v1*(v1*v2+v2+1)); % Koeffizient von omega^4
agn2=Tm/(v1*v2+v2+1)*(T12*(v2+1) + T23*(v1+1)/v1); % Koeffizient von omega^2
t=agn4*(1i*2*pi*f)^4+agn2*(1i*2*pi*f)^2+1; % Nenner der Übertragungsfunktion. omega=j*2*pi*f
% c12(c23,f) und c23(c12,f)
c12_f=subs(solve(t,c12),f,f1); % solve(t,c12): t nach c12 lösen, dann Frequenz f durch f1 ersetzen
c23_f=subs(solve(t,c23),f,f2); % solve(t,c23): t nach c23 lösen, dann Frequenz f durch f2 ersetzen
c12_new=solve(subs(c12_f,c23,c23_f)==c12,c12);
% c12_new ist c12(f1,f2), Steifigkeit c12 in Abhängigkeit von f1 und f2 % subs(c12_f,c23,c23_f): c23_f bei c12_f einsetzen und durch die Variabel % c23 ersetzen % solve(subs(c12_f,c23,c23_f)==c12,c12): die Gleichung nach c12 lösen
c23_new=solve(subs(c23_f,c12,c12_f)==c23,c23);
% c23_new ist c23(f1,f2), Steifigkeit c23 in Abhängigkeit von f1 und f2 % subs(c23_f,c12,c12_f): c23_f bei c12_f einsetzen und durch die Variabel % c23 ersetzen % solve(subs(c12_f,c23,c23_f)==c12,c12): die Gleichung nach c12 lösen
So könnte man f1 und f2 z.B. in der Funktion c12_new einsetzen, dann c23 durch die Funktion c23_new berechnen, danach könnte man die Werte in ein Grafik plotten, ich wollte in der X und Y-Achse die Variabeln f1 und f2 plotten, und in der Z-Achse die Steifigkeit c12 plotten, mit welche Befehl wäre das möglich?
bitte mach dir die Mühe, bei Problemen zu einem Befehl zunächst in die Dokumentation zu schauen.
ezplot ist ein Befehl, der direkt mit symbolischen Ausdrücken arbeitet. Das 'double' musst du also weglassen.
Grüße,
Harald
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.