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

Schnittpunktberechnung Sinuskurve

 

räubertochter
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 02.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2014, 11:41     Titel: Schnittpunktberechnung Sinuskurve
  Antworten mit Zitat      
Hallo allerseits,

ich möchte in Matlab den Schnittpunkt einer Sinusfunktion mit der x-Achse und mit einer Gerade B=9 berechnen.
Bisher habe ich das mit "solve" realisiert, wobei ich allerdings auf ein paar Probleme gestoßen bin:
1) "solve" scheint keine Variablen verarbeiten zu können, auch dann nicht, wenn ihr Wert im double-Format vorgegeben wird.
Es erscheint dann immer folgende Fehlermeldung:
Code:
x_SP =
 
phase - (50*asin(off/a))/pi
 
Error using mupadmex
Error in MuPAD command: DOUBLE cannot convert the input expression into a double array.
If the input expression contains a symbolic variable, use the VPA function instead.

Error in sym/double (line 514)
        Xstr = mupadmex('symobj::double', S.s, 0);

Error in Schnittpunkte (line 41)
x_SP= double(x_SP) % Ausgabe als double-Wert

2) es werden nicht immer die Schnittpunkte berechnet, die ich benötige (im positiven x-Wertebereich), sondern zum Teil auch im negativen Bereich.

Wisst ihr, wie ich diese Probleme lösen kann bzw. gibt es eine passende Alternative zu "solve"?
Den kompletten Code habe ich unten eingefügt, das m-File befindet sich im Anhang.

Schon einmal vielen Dank für eure Hilfe Smile



Code:
% Sinuskurve und ihre Schnittpunkte %

% --- Parameter --- %

B=9;                         % Gerade für Schnittpunkt
x=[0:1:100];                 % Definition des cycles von 0 bis 100%
max=B+0.1*B;                 % Maximum der Sinuskurve [°]
min=-3;                      % Minimum der Sinuskurve [°]
off=(max+min)/2;             % Offset
a=(max-min)/2;               % Amplitude
phase=asin(off/a)*(50/pi);   % Phase
f=1;                         % Frequenz

% ---- Sinusfunktion ---- %

y_1=a*sin((x*f-phase)*pi/50)+off;    


% ---- Plot ---- %

figure(1)
plot(x,y_1)

title('Sinus 1', 'FontSize',14)
xlabel('cycle[%]','FontSize',12)
ylabel ('[°]','FontSize',12)


% --- Ausgabe der enthaltenen Variablen als double --- %
a=double (a)
phase=double (phase)
off=double (off)
B=double(B)



% ----Berechnung Schnittpunkte mit der x-Achse ---- %

[x,y]=solve('y=a*sin((x*1-phase)*pi/50)+ off','y=0'); %Berechnung der SP
x_SP=x(1)  %Ausgabe x-Wert von SP1 im Command Window
x_SP= double(x_SP) % Ausgabe als double-Wert


% ----Berechnung Schnittpunkte mit y=B (9) ---- %

[x,y]=solve('y=a*sin((x*1-phase)*pi/50)+ off','y=B'); %Berechnung der x-Werte von y=B
x_B_1=x(1)
x_B_1=double(x_B_1)
x_B_2=x(2)
x_B_2=double(x_B_2)

 


Schnittpunkte.m
 Beschreibung:

Download
 Dateiname:  Schnittpunkte.m
 Dateigröße:  1.24 KB
 Heruntergeladen:  268 mal
Private Nachricht senden Benutzer-Profile anzeigen


Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 02.05.2014, 13:37     Titel:
  Antworten mit Zitat      
räubertochter hat Folgendes geschrieben:

1) "solve" scheint keine Variablen verarbeiten zu können, auch dann nicht, wenn ihr Wert im double-Format vorgegeben wird.


Der Fehler hängt nicht am Solve, sondern an der Zeile x_SP= double(x_SP). Denn die Werte liegen symbolisch vor und müssen erst umgewandelt werden.
Code:

Damit kannst du dir x als Zahl darstellen lassen.

räubertochter hat Folgendes geschrieben:

2) es werden nicht immer die Schnittpunkte berechnet, die ich benötige (im positiven x-Wertebereich), sondern zum Teil auch im negativen Bereich.

Das sollte eigentlich durch die Festlegung des Wertebereichs in X vermieden werden.
Allerdings überschreibst du dir mit der 1. solve-Lösung x und y! Somit gehst du mit einem falschen x ins zweite Solve - daher könnte der Fehler kommen.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2014, 11:04     Titel:
  Antworten mit Zitat      
Hallo räubertochter,

im Allgemeinen ist es keine clevere Idee, Variablen oder eigene Funktionen so zu nennen, wie bereits existierende Matlab-Funktionen (hier: max, min), das kann schnell zu sehr verwirrenden Fehlern führen...

Bist Du Dir bewusst, dass der obere Teil Deines Programms mit dem unteren Teil nichts zu tun hat? Du plottest Deinen Sinusverlauf mit den Stützstellen 1:1:100 und den angegebenen Parametern. Der solve-Befehl weiter unten arbeitet aber mit symbolischen Variablen. Der rechnet also völlig unabhängig von dem, was Du oben machst. Der Code ab "% ----Berechnung Schnittpunkte mit der x-Achse ---- %" tut ohne die Zeilen darüber genau das gleiche, was er jetzt auch tut.

Für Dein Problem hast Du nun zwei Möglichkeiten. Entweder Du benutzt subs (siehe oben) oder Du löst das ganze numerisch mit den Werten, die Du in den ersten Zeilen berechnet hast. Letzteres ist ein bisschen ungenau, weil Du den genauen Schnittpunkt ja möglicherweise gar nicht definiert hast. Das heißt, Du bekommst nur raus, zwischen welchen zwei Stützstellen der Schnittpunkt liegt. Der Code dafür sieht dann z.B. so aus:

Code:

x(diff(sign(y_1 - B))) ~= 0)
 


Das müsste Dir die x-Werte ausgeben, die links von den Schnittpunkten liegen.

Markus
Private Nachricht senden Benutzer-Profile anzeigen
 
räubertochter
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 02.05.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.05.2014, 08:18     Titel: Schnittpunktberechnung Sinuskurve - meine bisherige Lösung
  Antworten mit Zitat      
Hallo zusammen,

bitte entschuldigt erst einmal meine super späte antwort Embarassed

Vielen lieben Dank für eure tollen Tipps, ich habe das Programm jetzt zumindest zum Laufen gebracht, sodass die x-Werte der Schnittpunkte als numerische Werte ausgegeben werden.
Danke auch noch für den Hinweis bezüglich der Benennung, ist nur manchmal echt schwierig geeignete Namen zu finden. Deine Lösungsmöglichkeit werde ich dann auch noch ausprobieren, Markus.

Anbei der jetzt funktionierende Code Smile , als m-File im Anhang

Code:


% Sinuskurve und ihre Schnittpunkte %

% --- Parameter --- %

B=9;                         % Gerade für Schnittpunkt
x=[0:1:100];                 % Definition des cycles von 0 bis 100%
P=B+0.1*B;                 % Maximum der Sinuskurve [°]
N=-3;                      % Minimum der Sinuskurve [°]
off=(P+N)/2             % Offset
a=(P-N)/2               % Amplitude
phase=asin(off/a)*(50/pi)   % Phase
f=1;                         % Frequenz

% ---- Sinusfunktion ---- %

y_1=a*sin((x*f-phase)*pi/50)+off;    


% ---- Plot ---- %

figure(1)
plot(x,y_1)

title('Sinus 1', 'FontSize',14)
xlabel('cycle[%]','FontSize',12)
ylabel ('[°]','FontSize',12)


% ----Berechnung Schnittpunkte mit der x-Achse ---- %

[x,y]=solve('y=a*sin((x*f-phase)*pi/50)+ off','y=0'); %Berechnung der SP
x_SP=subs(x)  %Ausgabe x-Wert von SP1 im Command Window
x_SP= eval(x_SP) % Zahlenwert ausgeben


% ----Berechnung Schnittpunkte mit y=B (9) ---- %

[x,y]=solve('y=a*sin((x*f-phase)*pi/50)+ off','y=B'); %Berechnung der x-Werte von y=B
x_B_1=subs(x(1)) % Wert 1
x_B_1=eval(x_B_1)
x_B_2=subs(x(2)) % Wert 2
x_B_2=eval(x_B_2)

 


Viele Grüße,
räubertochter

Schnittpunkte_neu.m
 Beschreibung:

Download
 Dateiname:  Schnittpunkte_neu.m
 Dateigröße:  1.13 KB
 Heruntergeladen:  248 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.