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

Wie stellt man mehrere Funktionen als Matrix dar?

 

Artjom
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 16.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2017, 00:30     Titel: Wie stellt man mehrere Funktionen als Matrix dar?
  Antworten mit Zitat      
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 (line 59)
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.

MfG Artjom
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.07.2017, 09:18     Titel:
  Antworten mit Zitat      
Hallo,

double ist der Default-Datentyp für numerische Daten, also Gleitkommazahlen.
Wenn du die Vorbelegung weglässt oder
Code:
sym('F', [10,1])
als Vorbelegung wählst, sollte es gehen.

Bitte möglichst komplett reproduzierbare Beispiele zur Verfügung stellen, dann kann man die Vorschläge auch gleich ausprobieren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Artjom
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 16.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2017, 11:17     Titel:
  Antworten mit Zitat      
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.

MfG Artjom
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.07.2017, 13:08     Titel:
  Antworten mit Zitat      
Hallo,

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).

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Artjom
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 16.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2017, 14:16     Titel:
  Antworten mit Zitat      
Kann man sagen vpa ist dann das gegenteil von sym? Also sozusagen die umkehrung?

Der ganze code sieht bei mir so aus:

Code:

clc;
clear;
close all;

%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);

clc;

%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

laufv=min(P(:,2)):0.001:max(P(:,2));
a=find(P(:,2)<=min(P(:,2)));


%fun= @(x)
%Iy=integral(fun1,min(P(:,2)),max(P(:,2)),'ArrayValued',1)
 


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 (line 59)
DOUBLE cannot convert the input expression into a double array.
If the input expression contains a symbolic variable, use VPA.

Error in Test (line 71)
        F(i)=m(i)*x+b;
 


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.

MfG Artjom
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.07.2017, 14:48     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
aber in der nächsten Matrix Ft tritt nun direkt ein Fehler auf

Wenn wir dir bei der Behebung helfen sollen, bitte den Code und die Fehlermeldung angeben.

Statt input-Befehlen würde ich übrigens Funktionen verwenden. Das erleichtert wiederholte oder automatisierte Funktionsaufrufe.

Als erste Einführung würde ich das kostenlose MATLAB Onramp empfehlen
https://matlabacademy.mathworks.com/

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Artjom
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 16.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.07.2017, 23:25     Titel:
  Antworten mit Zitat      
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.

MfG Artjom
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.07.2017, 20:21     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Der benutzer muss doch erst die Koordinaten eingeben von dem System,

Und genau das kann er tun, indem er eine Funktion mit den Koordinaten aufruft.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Artjom
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 16.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.07.2017, 22:18     Titel:
  Antworten mit Zitat      
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.

MfG Artjom
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.07.2017, 22:27     Titel:
  Antworten mit Zitat      
Hallo,

mit input:
Code:
x = input('Zu quadrierend: ');
y = x^2

Ausführen, Eingabe von 3

Alternative mit Funktion:
Code:
function y = square(x)
y = x^2;


Aufruf mit
Code:
y = square(3)


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Artjom
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 16.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.07.2017, 19:28     Titel:
  Antworten mit Zitat      
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?

MfG Artjom
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.07.2017, 20:09     Titel:
  Antworten mit Zitat      
Hallo,

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.

Geh doch mal die Doku zu Funktionen durch:
https://www.mathworks.com/help/matlab/function-basics.html
insbesondere "Examples and How to".

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Artjom
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 16.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2017, 11:30     Titel:
  Antworten mit Zitat      
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);
 


Und wenn ich das dann mit
Code:

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:
Code:

f2= @(x) x+4;
 

dann rechnet er das richtig aus und gibt bei x=5
Code:

f2(5)
ans = 9
 

raus.

MfG Artjom
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.07.2017, 16:56     Titel:
  Antworten mit Zitat      
Hallo,

Code:

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Artjom
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 16.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2017, 19:46     Titel:
  Antworten mit Zitat      
Hey Harald,
genau das hab ich gesucht aber wurde nicht fündig. Danke dir für deine Hilfe.

MfG Artjom
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.