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

Schnittpunkt zw. zwei abschnittsweise definierten Funktionen

 

FlowD

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.03.2014, 19:10     Titel: Schnittpunkt zw. zwei abschnittsweise definierten Funktionen
  Antworten mit Zitat      
Hallo,
ich habe das Problem, dass ich zwei Funktionen habe deren Schnittpunkt ich berechnen möchte, aber nicht weiß wie. Das besondere an diesen Funktionen ist, dass diese zusammengesetzt sind (aus einer Geradengleichung und einer Kreisgleichung)

Hier beide Funktionen, die ich in einem m.file gespeichert habe:

Code:

function [z_0] = z_0_function(x, delta0, re, f, ap, x_m, x_p0)

z_0(x>=x_p0&x<=ap) = f-sqrt(re^2 - (x(x>=x_p0&x<=ap)-x_m)^2);
z_0(x<x_p0)   = tan(delta0)*x(x<x_p0) - re/(sqrt(tan(delta0)^2 +1))+ f - tan(delta0)*(x_p0);
     
end
 


und

Code:

function [z_1] = z_1_function(x, delta1, re, ap, x_m, x_p1)

z_1(x>=x_p1&x<=ap) = -sqrt(re^2 - (x(x>=x_p1&x<=ap)-x_m)^2);
z_1(x<x_p1)   = tan(delta1)*x(x<x_p1) - re/(sqrt(tan(delta1)^2 +1)) - tan(delta1)*(x_p1);

end
 


Alle Eingangsvariablen bis auf x sind parametrisiert und konstant. x ist meine Laufkoordinate. Ich Suche wie gesagt das x, an dem sich beide Funktionen schneiden. Befehle wie "fzero" oder "solve" habe ich bereits probiert funktionieren aber nicht (oder ich habe sie falsch angewand). Weiß einer Rat?! Danke im Voraus!


Harald
Forum-Meister

Forum-Meister


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

Zitat:
Befehle wie "fzero" oder "solve" habe ich bereits probiert funktionieren aber nicht (oder ich habe sie falsch angewand).

Und wie hast du sie angewendet?

Soll x skalar sein?

Ich würde es so versuchen:
Code:
% Definition sämtlicher Parameter
f = @(x) z_0_function(x, delta0, re, f, ap, x_m, x_p0)  - z_1_function(x, delta1, re, ap, x_m, x_p1)
xbest = fzero(f, startwert)


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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.03.2014, 09:32     Titel:
  Antworten mit Zitat      
Hallo Harald,
danke für die schnelle Antwort! Ja ich möchte x gerne als skalaren Wert haben. Wenn ich deinen Code verwende bekomme ich folgenden Fehler:

Code:

>> % Definition sämtlicher Parameter
f = @(x) z_0_function(x, delta0, re, f, ap, x_m, x_p0)  - z_1_function(x, delta1, re, ap, x_m, x_p1)
xbest = fzero(f, 0)

f = @(x)z_0_function(x,delta0,re,f,ap,x_m,x_p0) - z_1_function(x,delta1,re,ap,x_m,x_p1)

Error using fzero (line 289)
FZERO cannot continue because user supplied function_handle ==>
@(x)z_0_function(x,delta0,re,f,ap,x_m,x_p0)-z_1_function(x,delta1,re,ap,x_m,x_p1)
 failed with the error below.

 Undefined function 'z_0_function' for input arguments of type 'function_handle'.
 


Was kann ich tun? :/
 
Harald
Forum-Meister

Forum-Meister


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

das legt nahe, dass z_0_function entweder nicht unter diesem Namen oder in diesem Verzeichnis abgespeichert ist.
Mach sicherheitshalber auch mal
Code:


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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.03.2014, 10:48     Titel:
  Antworten mit Zitat      
Hallo Harald,
tatsächlich war der Ordner nicht aktiv. Dummer Fehler meinerseits, sorry.

Dennoch erhalte ich weiter eine Fehlermedlung:

Code:


>> f = @(x) z_0_function(x, delta0, re, f, ap, x_m, x_p0)  - z_1_function(x, delta1, re, ap, x_m, x_p1)
xbest = fzero(f, 0)

f = @(x)z_0_function(x,delta0,re,f,ap,x_m,x_p0)-z_1_function(x,delta1,re,ap,x_m,x_p1)

Error using fzero (line 289)
FZERO cannot continue because user supplied function_handle ==>
@(x)z_0_function(x,delta0,re,f,ap,x_m,x_p0)-z_1_function(x,delta1,re,ap,x_m,x_p1)
 failed with the error below.

 Undefined function 'minus' for input arguments of type 'function_handle'.
 
 
Harald
Forum-Meister

Forum-Meister


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

stelle bitte mal die anderen Parameter (delta0, re etc.) zur Verfügung.

Hast du mal getestet, ob sich die Funktionen z_0_function und z_1_function für sich genommen fehlerfrei ausführen lassen? Der Fehlermeldung zufolge scheint das nämlich nicht der Fall zu sein.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.03.2014, 14:49     Titel:
  Antworten mit Zitat      
also einen Fehler habe ich gefunden:
das function handle bezeichnest du als "f". "f" ist aber schon vergeben und ist ein Eingangsparameter. Dennoch gibt es wieder ein Fehler. Im Folgenden mal alle Parameter und Formeln im Detail (Ich habe für die Parameter direkt skalare Werte eingesetzt soweit möglich):

Code:

%Eingangsparameter
re = 0.4;
eps = 55*pi()/180;
ap = 1;
f = 0.1;
lamda1 = 10*pi()/180;
lamda2 = 10*pi()/180;
z_m=f;
x_m=ap-re;
delta0=eps/2+lamda1;
delta1=eps/2+lamda2;
delta2=-eps/2+lamda2;
x_p0=0.843504571603488;
x_p1=0.843504571603488;
x_p2=0.720282319801709;
 


Die beiden Funktionen die sich schneiden lauten:
ACHTUNG ICH HABE LETZTERE FUNKTION AUSGETAUSCHT!

Code:

function [z_0] = z_0_function(x, delta0, re, f, ap, x_m, x_p0)

z_0(x>=x_p0&x<=ap) = f-sqrt(re.^2 - (x(x>=x_p0&x<=ap)-x_m).^2);
z_0(x<x_p0)   = tan(delta0)*x(x<x_p0) - re/(sqrt(tan(delta0).^2 +1))+ f - tan(delta0)*(x_p0);
end
 


Code:

function [z_2] = z_2_function(x, delta2, re, ap, x_m, x_p2)

z_2(x>=x_p2&x<=ap) = sqrt(re.^2 - (x(x>=x_p2&x<=ap)-x_m).^2);
z_2(x<x_p2)   = tan(delta2)*x(x<x_p2) + re/(sqrt(tan(delta2).^2 +1)) - tan(delta2)*(x_p2);
end
 


Beide Funktionen schneiden sich auch, habe beide geplottet (siehe angehängte Bilddatei).

wenn ich nun folgenden Code anwende bekomme ich folgenden Fehler:

Code:

fun = @(x) z_0_function(x, delta0, re, f, ap, x_m, x_p0)  - z_2_function(x, delta2, re, ap, x_m, x_p2)
xbest = fzero(fun, 0)

Operands to the || and && operators must be convertible to logical scalar values.

Error in fzero (line 378)
        if ~isfinite(fb) || ~isreal(fb) || ~isfinite(b)
 


screen1.JPG
 Beschreibung:

Download
 Dateiname:  screen1.JPG
 Dateigröße:  22.67 KB
 Heruntergeladen:  283 mal
 
FlowD

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.03.2014, 16:38     Titel:
  Antworten mit Zitat      
Weiß keiner Rat?!
 
Harald
Forum-Meister

Forum-Meister


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

deine Funktion gibt für x > ap keine Werte, sondern [] zurück.

Was hast du denn da geplottet? Die Funktionen können es nicht sein, weil diese für x > ap ja von dir nicht definiert werden.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2014, 16:56     Titel:
  Antworten mit Zitat      
x ist nur veränderlich zwischen 0 und ap. Den Fall das x>ap ist gibt es nicht (mit den Funktionen simuliere ich die 2-dimensionale geometrische Durchdringung einer Werkzeugschneide durch einen Körper). Innerhalb dieses Bereiches schneiden sich die Funktionen aber. Und den Schnittpunkt brauche ich.
 
Harald
Forum-Meister

Forum-Meister


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

bitte auf Rückfragen eingehen.

Du könntest es z.B. alternativ mit fminbnd versuchen, und abs(f1-f2) auf dem zulässigen Intervall minimieren.

Alternativ die Funktionen so definieren, dass sie außerhalb des Intervalls auch etwas zurückgeben, z.B. einen sehr hohen oder sehr niedrigen Wert.

Grüße,
Harald
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.