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

Definition von Funktionen

 

woosar
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 25.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2013, 00:22     Titel: Definition von Funktionen
  Antworten mit Zitat      
Hallo, ich habe ein Problem bei der Definition von Funktionen

Ich möchte eine Funktion mit der Hilfe von Vektoren definieren.

Beispielsweise will ich den Abstand eines Ellipsenrands zum Ursprung in Abhängigkeit des Winkels berechnen.

Dazu würde ich das gerne so machen:
Code:

function d=funktion(phi)
a=1;
b=2;
r=[a*cos(phi);b*sin(phi)];

d=r'*r;
 

Allerdings bekomme ich so nicht das Ergebnis raus, was ich möchte, und die Funktionen, um die es mir Eigentlich geht, lassen sich nicht so einfach direkt als "a²cos²+b²sin²" schreiben. Warum kann ich innerhalb der Funktion keine Vektoren, so wie sie sonst benutzt werden, einsetzen?

Vielen dank
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

du kannst in Funktionen genauso Vektoren einsetzen wie sonst auch. Um dir weiterhelfen zu können, müssten wir noch wissen:
- wie rufst du die Funktion auf?
- inwiefern weichen die Ergebnisse von den erwarteten ab?

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 25.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2013, 10:47     Titel:
  Antworten mit Zitat      
Hallo,

Bei der Funktion
Code:

function d=myfun(k)
d=sin(k).*sin(k)+cos(k)*cos(k);
 

(als myfun.m speichern)
rufe ich die Funktion zur Überprüfung mit
Code:

x=linspace(-pi,pi,100);
y=myfun(x);
 

auf und es kommt richtigerweise ein Vekor der Länge 100 mit 1 in jedem Eintrag heraus, wobei mich das ".*" schon stört, aber es ja anders nicht geht, da MATLAB einen Vektor einsetzt.

Ich würde nun den Abstand innerhalb der Funktion gerne in der Form

<br />
r=\begin{bmatrix}\cos\left(k\right)\\ \sin\left(k\right)\end{bmatrix}\rightarrow d=r^Tr
<br />
definieren, allerdings scheint MATLAB den Term nicht zuerst symbolisch auswerten zu können, bevor der Vektor eingesetzt wird, weshalb ich auch schon erfolglos versucht habe, symbolische Variablen zu benutzen.

Code:

function d=myfun(k)

r=[cos(k);sin(k)];

d=r*r';
 


liefert beim Aufrufen mit einem Vektor x eine 2\times 2-Matrix und

Code:

function d=myfun(k)

r=[cos(k);sin(k)];

d=r'*r;
 

eine quadratische Matrix in der Größe der Länge des Vektors x.
Ich möchte nachher Abstände von Kurven und dann Oberflächen bezüglich ihrer Parameter minimieren (also immer die Parameter der Kurven (Oberflächen), welche zusammen den geringsten Abstand bilden berechnen)und für den Abstand eines Kreises, dessen Rand in einem sich drehenden Koordinatensystem gegeben ist, wird die Formel für den Abstand des Randes zum Ursprung schon zu


<br />
d=r_0^Tr_0+r_^Tr+2r_0^TA_{KI}r
<br />

wobei die Matrix A_{KI} die Drehung ins Inertialsystem beschreibt. Dort die skalaren Funktionen per Hand auszurechnen, ist mir zu doof, weshalb ich hoffe, dass sie irgendwie durch Vektorschreibweise definiert werden können.

Vielen Dank,

PS: Ich weiß natürlich, dass ich die ganze Zeit mit dem quadrat des Abstands rechne, aber das spielt ja keine Rolle.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.10.2013, 11:10     Titel:
  Antworten mit Zitat      
Hallo,

dann nimm statt r'*r doch r(1)^2 + r(2)^2 ? Das kannst du dann auch auf Vektoren übertragen:

Code:
function d=myfun(phi)
a=1;
b=2;
r=[a*cos(phi);b*sin(phi)];

d=r(1,:).^2 + r(2,:).^2;


Der Aufruf
Code:
x = linspace(-pi, pi, 100);
myfun(x)

sollte dann das gewünschte liefern.

Alternativ könntest du intern mit einer Schleife arbeiten, aber warum kompliziert, wenns auch einfach geht?

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

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 25.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2013, 12:07     Titel:
  Antworten mit Zitat      
Code:

function d=myfun(k)

%Parameter der Ellipse
a=2;
b=3;

%Drehwinkel
phi=pi/6;

%Drehmatrix
c=cos(phi);
s=sin(phi);
A=[c -s; s c];

%Verschiebung des Ursprungs
r0=[5;2];

%Ellipsenrand
r=[a*cos(k);b*sin(k)];

%Drehung der Ellipse
r=A*r;

%Verschiebung des Mittelpunkts

for i=1:length(k)
    r(:,i)=r0+r(:,i);
end

%d=r(1,:).*r(1,:)+r(2,:).*r(2,:);
d=r;
 


So funktioniert es erstmal. Vielen Dank! Für die Absolutverschiebung muss ich halt mit einer Schleife Arbeiten und ich glaube, sobald ich mehr als eine Variable benutze, bekomme ich nochmal Probleme, denn wenn ich den Abstand zweier Kurven, welche durch

<br />
c_i=r_{0i}+A_{KiI}r_i\left(k_i\right)
<br />
gegeben sind, muss ich

<br />
d^2=\left(c_1-c_2\right)^T\left(c_1-c_2\right)
<br />
bezüglich k_1 und k_2 minimieren.

export_fig_out.png
 Beschreibung:

Download
 Dateiname:  export_fig_out.png
 Dateigröße:  22.82 KB
 Heruntergeladen:  336 mal
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 - 2025 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.