Verfasst am: 17.07.2017, 00:30
Titel: Wie stellt man mehrere Funktionen als Matrix dar?
Hey Leute,
bin neu im Forum grade Regestriert und hoffe jemand von euch könnte mir helfen.
Ich kenne mich nicht stark mit Matlab aus. Wollte klein anfangen und ein kleines Programm versuchen. Das Programm sollte den Flächeninhalt eines Polygons berechnen aus den Punkten den der Nutzer vorgibt.
Danach sollte es die Flächenträgheitsmomente der Fläche berechnen. Dafür wollte ich jeweils immer von Koordinate zu Koordinate Funktionen aufstellen um danach zwischen dennen vergleiche aufstellen zu können und zu integrieren.
Nun taucht ein Problem auf wenn ich die Funktionen in eine Matrix abspeichern will.
Code:
syms x y;
i=1;
F=zeros(p,1); %Funktionen auf x/y bezogen
Ft=zeros(p,1); %Umkehrfunktionen
while i<=p
if k(i)~=0
F(i)=k(i);
Ft(i)=0;
elseif k1(i)~=0
Ft(i)=k1(i);
F(i)=0;
else m(i)=~0;
b=0;
b=P(i,2)-m(i)*P(i,1);
F(i)=m(i)*x+b;
Ft(i)=solve('y=F(i)',x);
end
i=i+1;
end
Die Vektoren k/k1 und m entstehen davor und geben die Steigungen bzw. die Konstanten der Funktionen an.
Wenn ich also das Programm laufen lasse kommt folgender fehler:
Code:
The following error occurred converting from sym to double:
Error using symengine (line59) DOUBLE cannot convert the input expression into a double array.
If the input expression contains a symbolic variable, use VPA.
Er kann also in F(i)=m(i)*x+b; keine Funktion einspeichern weil F schon double array ist und x durch syms x auch double array hat, ist das richtig?
Aber was genau ist dieses double array könnte mir das jemand erklären?
Ich verstehe den Grund dieses fehlers nicht ganz.
Hey Harald,
danke für die schnelle Antwort. Werd das nächste mal den ganzen Code senden, dachte nur wäre dann zu viel.
Ich dachte mit double array wird eine Matrix ab 2x2 bezeichnet und das nächst größere dann Multidimensional array ab 2x2x2.
Konnte dann Matlab davor nicht die Funktionen in die Matrix reinspeichern, weil der schon als 0 definiert war und Matlab konnte die unbestimmte Variable x nicht der 0 zuweisen?
Und was ist eig. der genauer unterschied von vap zu sym, matlab hat mir vorgeschlagen das mit vap zu lösen aber hab ich irgendwie nicht ganz verstanden.
generell ist ein kleines, reproduzierbares Beispiel am hilfreichsten.
Zitat:
Ich dachte mit double array wird eine Matrix ab 2x2 bezeichnet und das nächst größere dann Multidimensional array ab 2x2x2.
Double bezieht sich auf den Datentyp, nicht die Anzahl der Dimensionen.
Zitat:
Konnte dann Matlab davor nicht die Funktionen in die Matrix reinspeichern, weil der schon als 0 definiert war und Matlab konnte die unbestimmte Variable x nicht der 0 zuweisen?
Wie die Meldung besagte: die Datentypen stimmten nicht überein, und eine Umwandlung war nicht möglich.
Zitat:
Und was ist eig. der genauer unterschied von vap zu sym
Du meinst wohl vpa? sym definiert einen symbolischen Ausdruck (z.B. sqrt(2) ), vpa wertet ihn auf eine vorgegebene Stellenanzahl aus (z.B. 1.4142).
Zitat:
matlab hat mir vorgeschlagen das mit vap zu lösen
Solche Meldungen bitte kopieren, am besten mit dem Code, der sie erzeugt hat, und nicht interpretieren.
Bitte auch die Vorschläge ausprobieren und Bescheid geben, was ggf. nicht funktioniert (genaue Fehlermeldung / andere Probleme).
%Eingabe der Punkte => Matrix
p=input('Wie viele Punkte? ');
disp('Bitte die Punkte im Uhrzeigersinn eingeben!');
P=zeros(p+1,2);
i=0;
while i~=p
i=i+1;
P(i,1)=input('x-Achse: ');
P(i,2)=input('y-Achse: ');
end
P(p+1,1)=P(1,1);
P(p+1,2)=P(1,2);
%Berechnung der Steigungen m und Konstanten k
m=zeros(p,1);
k=zeros(p,1); %in -
k1=zeros(p,1); %in | /Später für Iy berechnung
i=0;
while i<p
i=i+1;
if P(i,1)~=P(i+1,1) & P(i,2)~=P(i+1,2); %P auf unterschiedlicher x und y-Achse
if P(i,1)>P(i+1,1);
m(i)=(P(i,2)-P(i+1,2))/(P(i,1)-P(i+1,1));
k(i)=0;
else
m(i)=(P(i+1,2)-P(i,2))/(P(i+1,1)-P(i,1));
k(i)=0;
end elseif P(i,1)~=P(i+1,1) %P auf der gleichen y-Achse
m(i)=0;
k(i)=P(i,2);
else %P auf gleicher x-Achse
m(i)=0;
k(i)=0;
k1(i)=P(i,1);
end end plot(P(:,1),P(:,2));
axis equal;
xlim([min(P(:,1))-1,max(P(:,1))+1]);
ylim([min(P(:,2))-1,max(P(:,2))+1]);
A=polyarea(P(:,1),P(:,2));
disp(['Fläche: ' num2str(A)]);
%Flächenträgheitsmomente
%x=z und y=z
%Iy=integral(z^2*da)=int(z^2*y*dz)
%m steigungen => Funktion bilden => umkehren mit solve('y=2x-2',x) /davor
%syms x und y
syms x y;
i=1;
sym F=zeros(p,1); %Funktionen auf x/y bezogen
sym Ft=zeros(p,1); %Umkehrfunktionen
while i<=p
if k(i)~=0
F(i)=k(i);
Ft(i)=0;
elseif k1(i)~=0
Ft(i)=k1(i);
F(i)=0;
else m(i)=~0;
b=0;
b=P(i,2)-m(i)*P(i,1);
F(i)=m(i)*x+b;
Ft(i)=solve('y=F(i)',x);
end
i=i+1;
end
Die ganzen Kommentare drin sind eher zu orientierung für mich gedacht.
Die Meldung die ich meinte war folgende:
Code:
The following error occurred converting from sym to double:
Error using symengine (line59) DOUBLE cannot convert the input expression into a double array.
If the input expression contains a symbolic variable, use VPA.
Aber die ist nur aufgetreten wenn ich die Matrix F nicht als sym angebe.
Nach deiner Hilfe mit sym funktioniert das jetzt wie gewollt aber in der nächsten Matrix Ft tritt nun direkt ein Fehler auf. Hab mich da noch nicht informiert woran das liegt. Dauert etwas länger bei mir weil ich etwas Probleme mit Englisch habe und wenig Erfahrung mit Matlab (Grundkenntnisse 1 Sem.).
Da wäre meine nächste Frage, welche Literatur würdest du jemanden vorschlagen mit wenig Erfahrung und eher Ingenieurmäßiger orientierung.
Hey Harald,
danke dir aber den Tutorial von mathworks hab ich bereits gemacht. Dachte eher an die Bücher die hier vorgeschlagen werden.
Die Fehlermeldung werd ich erstmal versuchen selber zu lösen aber danke.
Was genau meinst du mit lieber als Funktion und nicht input?
Der benutzer muss doch erst die Koordinaten eingeben von dem System, kenne keine andere möglichkeit das zu lösen ausser input.
Hey Harald,
hätteste vllt die Zeit ein kurzes Beispiel zu machen wie du das genau mit Funktion machen würdest? Kanns mir grad nicht vorstellen wie du das meinst.
Hey Harald,
sry aber ich verstehs immer noch nicht wie man nen input mit Funktionen ersetzen kann.
Bei mir tritt der Fehler auf wenn ich den Befehl mit Funktion eintippe:
Code:
Function definitions are not permitted in this context.
Und wozu ist der Square Kommando? Er wechselt einfach zwischen 1 und -1 wozu dient das den?
Was genau muss man bei der Methode den eingeben wenn ich einen Punkt im Koordinaten System bei P(-2/2) haben möchte?
in meinem Beitrag war oben ein Beispiel mit input, und unten eine Möglichkeit, stattdessen eine Funktion zu verwenden. Einfacher kann ich es nicht darstellen.
Zitat:
Function definitions are not permitted in this context.
bedeutet, dass du die Funktion an der falschen Stelle definierst. Eine Funktion muss im Editor definiert werden, und für den Anfang würde ich jede Funktion in einer eigenen Datei speichern.
Zitat:
Und wozu ist der Square Kommando?
Das ist in diesem Beispiel der Name der Funktion.
Zitat:
Er wechselt einfach zwischen 1 und -1 wozu dient das den?
Als Beispiel.
Zitat:
Was genau muss man bei der Methode den eingeben wenn ich einen Punkt im Koordinaten System bei P(-2/2) haben möchte?
Ein Vektorargument mit zwei Elementen oder zwei getrennte skalare Argumente.
Hey Harald,
ich hab vergessen mit name der Datei= Funktion... deswegen hats nicht geklapt.
Jo die muss ich durchgehen, leider dauerts etwas wegen meinen Englisch kenntnissen.
Aber noch einmal eine letzte Frage die noch zum Thema des Threads passt:
Nachdem ich die erstellten Funktionen mithilfe von sym als 1xn Matrix erstellt habe. Wie kann ich dann im nächsten schritt wenn ich die Funktionen einzelnd rausziehen will mit (f= @(x) F(1)) um damit weiter arbeiten zu können, wie genau kann man das anstellen?
Denn wenn ich das genauso angebe nimmt er einfach nur als ergebnis die 1 Spalte aus der Matrix und rechnet es nicht weiter wenn ich dann z.b. ( f(25)) aufrufe)
Code:
F= [ x + 4, 4 - x/2, x + 1, 1 - x/2];
f1= @(x) F(1);
aufrufe dann gibt er mir x+4 aus egal was ich statt x eingebe. Gibt es extra so ein Kommando damit matlab weis dass ich wirklich nur die Spalte brauche?
Denn wenn ich das einzelnd eintippe als:
Hey Harald,
genau das hab ich gesucht aber wurde nicht fündig. Danke dir für deine Hilfe.
MfG Artjom
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.