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:
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.
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
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
% --- 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)
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))
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:
bitte entschuldigt erst einmal meine super späte antwort
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 , 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
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.