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

Nullstellen eines Vektors

 

Traumt@nzer
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.08.2012, 15:51     Titel: Nullstellen eines Vektors
  Antworten mit Zitat      
Hallo Helfer,

ich brauche wieder einmal eure Hilfe. Das Problem ist im Prinzip sehr simpel, aber ich finde nirgendwo eine passende Lösung.

Ich löse ein DGL-System und erhalte einen Beschleunigungs-, Geschwindigkeits- und Auslenkungsvektor mit mehrfachen Nullstellen.
Nun möchte ich mir die reellen Nullstellen ausgeben lassen.
Aber mit "roots" finde ich nur komplexe Nullstellen (außerdem eignet sich roots nur für Polynome) und mit "fzero" erhalte ich immer die Fehlermeldung, dass ich keine gültige Funktion vorgegeben habe.

Vielleicht mache ich auch etwas falsch!?:

Code:

nullstellen=roots(vektor)
nullstellen=fzero(@Dgl-System, Startwert)
 


Habe ich einen Denkfehler? Gibt es eine konkrete Möglichkeit der Nullstellensuche bei Vektoren? Ich habe auch erfolglos versucht den Vektor zu interpolieren und dann die Nullstellensuche durchzuführen.

Vielen Dank für Eure Hilfe/Tipps.

Viele Grüße
Robert
Private Nachricht senden Benutzer-Profile anzeigen


Traumt@nzer
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.08.2012, 20:11     Titel:
  Antworten mit Zitat      
Habe ich das Problem schlecht erläutert, ist die Lösung zu simpel oder hat wirklich niemand eine Idee?!

Viele Grüße
Robert
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

- in einem Dateinamen ist eine schlechte Idee, da das als Rechenoperator "minus" aufgefasst wird. Die "dgl-system.m" also unter neuem Namen ohne Sonderzeichen (nur "_" ist okay) speichern und es nochmal probieren.

Wenn es dadurch nicht klar wird, vielleicht mal eines der Beispiele in
Code:

ansehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Traumt@nzer
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.08.2012, 21:50     Titel:
  Antworten mit Zitat      
Hallo Harald,

der Name "DGL-System" war nur beispielhaft gewählt. Die Function heißt anders und ist natürlich ohne ein Minus geschrieben.

Hier die bekannte Fehlermeldung. Vielleicht wirst du ja aus dieser schlau:

??? Error using ==> fzero at 307
FZERO cannot continue because user supplied
function_handle ==> Einmassenschwinger
failed with the error below.

Input argument "y" is undefined.

Error in ==> Testdatei_Einmassenschwinger at 47
z=fzero(@Einmassenschwinger,0)

Muss ich vielleicht die Nullstellenberechnung in eine andere Funktion/Datei auslagern (input y is undefined)?

VG
Robert
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.08.2012, 23:28     Titel:
  Antworten mit Zitat      
Hallo,

"natürlich" ist hier relativ wenig Wink

Zitat:
Hier die bekannte Fehlermeldung. Vielleicht wirst du ja aus dieser schlau:

Bekannt ist gut... war sie ja bis jetzt nun nicht. Daraus wirklich schlau werden ist schwierig, ohne deinen Code zu haben.

Zitat:
Input argument "y" is undefined.

Heißt: du verwendest y, ohne es vorher (in diesem Workspace) zu definieren.

Wie du das genau beheben kannst, kann ich dir höchstens an deinem Code sagen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Traumt@nzer
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.08.2012, 23:56     Titel:
  Antworten mit Zitat      
Du hast "natürlich" "bekannterweiser" recht. Very Happy
Ich habe einen ganz simplen Einmassenschwinger simuliert um die Nullstellenproblematik anzugehen:

Code:

function Testdatei_Nullstellen

clc
clear all
close all
format long

global c m b
c=0.5;
m=1;
b=0.1;


[t,y]=ode45(@Einmassenschwinger,[0 15],[1.0;0],[]);

% Ergebisse sortieren
s=y(:,1);
v=y(:,2);
a_2=-b/m.*v-c/m.*s;                        

% Nullstellenproblematik

z=fzero(@Einmassenschwinger,0)              % Nullstellen ausgeben

function dydt=Einmassenschwinger(t,y)

global c m b

dydt=[y(2)
      -c/m.*y(1)-b/m.*y(2)];
 


Gesucht sind die Nullstellen der Vektoren s, v und a.

Beim Auflisten fällt mir auf, dass der Input "@Einmassenschwinger" 3 Variablen enthält (t,y(1),y(2)) und wahrscheinlich nicht gelöst werden kann. Wenn ich aber nur einen Vektor vorgebe
Code:

bekomme ich die Fehlermeldung, dass ich eine Funktion verwenden muss.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

du willst vermutlich wissen, wann die Lösung der Differentialgleichung gleich 0 ist, nicht wann die rechte Seite 0 ist.

Code:
z=fzero(@Einmassenschwinger,0)  
ist also nicht sinnvoll.

Ich sehe zwei Möglichkeiten:
a) ungefähre, schnelle Variante:
in s, v, a nach Vorzeichenwechseln suchen, z.B.
Code:

b) genaue, etwas aufwändigere Variante:
Über Events sagen, dass die Nullstellen beim Lösen der DGL mit aufgelöst werden soll. Dazu:
Code:
doc ode23
doc odeset % Abschnitt "Event Location Property"


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.08.2012, 11:42     Titel:
  Antworten mit Zitat      
Hallo Traumt@nzer,

Ich möchte mal wieder darauf hinweisen, dass "clear all" zu Beginn einer Funktion vollkommen nutzlos ist, da der lokale Workspace sowieso noch keine Variablen enthält. Als Nebeneffekt werden aber alle bereits geladenen Funktionen aus dem Speicher gelöscht und das Nachladen und Parsen verschwendet eine Menge Zeit. "clear all" ist dann sinnvoll, wenn Du alle(!) M-Files während des Programmablaufs geändert hast und die neuen Versionen benutzt werden sollen - ein eher unegwöhnlicher Vorgang.
Demgegenüber sind "clc" und "close all" nur unpraktisch, wenn man mehrere Probleme gleichzeitig bearbeitet. Trotzdem empfehle ich die Unsitte des brutalen Säuberns nicht weiter zu verfolgen.

ODE45 kann übrigens Nullstellen finden, indem man Event-Funktionen benutzt, siehe "doc odeset" und "doc ode45".

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Traumt@nzer
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2012, 15:02     Titel:
  Antworten mit Zitat      
Danke euch beiden.

@Harald:
a) Genau so eine schnelle Variante habe ich zunächst gesucht. Könntest du mir noch sagen, wozu das Zeichen "~" notwendig ist!?
b) Diese Möglichkeit war mir bekannt. Da in meinem komplexen Programm schon viel Events enthalten sind, hoffte ich auf eine schnellere Variante.

@Jan:
Das war mir bisher unbekannt. Vielen Dank für den Hinweis!

Nochmals Danke
VG Robert
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

~= bedeutet \ne

Achtung: die Variante a) hat zwar geringeren Aufwand, aber du bekommst immer den aufgenommenen Zeitpunkt vor dem eigentlichen Vorzeichenwechsel. Je nachdem wie grob deine Rasterung ist, kann das ziemlich weit weg sein.

Die elegantere und, wenn du ohnehin schon mit Events vertraut bist, auch nicht sooo schwer umzusetzende Variante ist definitiv b).

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Traumt@nzer
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2012, 09:08     Titel:
  Antworten mit Zitat      
Hallo Harald,

die schnelle Variante funktioniert leider nur bei dem Einmassenschwinger. Deshalb wollte ich kurz die Bedeutung des Cdes nachfragen.
Code:

t(diff(sign(s)) ~= 0)
 

Das bedeutet: Gebe den Zeitwert an, bei dem die Differenz von Signum an der Stelle des Vektors ungleich null ist; d.h. ein Vorzeichenwechsel vorhanden ist. Richtig!?

Grüße
Robert
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

richtig. Was funktioniert denn bei anderen Fällen nicht?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Traumt@nzer
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2012, 10:01     Titel:
  Antworten mit Zitat      
Hallo,

ich schalte durch eine Event-Funktion den Dämpfer des Einmassenschwingers zu (b sehr groß), sodass die Bewegung schlagartig fast völlig zum Stillstand kommt (v->0). Als Nullstelle gibt Matlab mir nun genau den Zeitpunkt des Events aus, obwohl an dieser Stelle s>0 ist und s auch niemals eine Nullstelle hat. Die Nullstellen der Geschwindigkeit und der Beschleunigung sind [], obwohl zum Eventzeitpunkt ein Vorzeichenwechsel vorhanden ist (Abbruch der Bewegung). Ich habe die Vektoren überprüft. Man kann eindeutig zum Event-Zeitpunkt keinen Vorzeichenwechsel bei s, dafür aber bei v und a erkennen. Leider gibt mir die Funktion diese aber nicht aus.

Ich denke ich werde wohl auf die Nullstellensuche per Event umsteigen.

Grüße
Robert
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich bitte um ein Beispiel für Vektoren t und s, wo ein Vorzeichenwechsel mit dem Befehl nicht korrekt erkannt wird.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Traumt@nzer
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 04.07.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2012, 14:21     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich kann dir leider kein Beispiel für Vektoren t und s geben, wo ein Vorzeichenwechsel mit dem Befehl nicht korrekt erkannt wird. Es gibt nämlich keins Wink Habe mein simplen Fehler gefunden (falsche Variablenbezeichnung). Da MATLAB immer das macht, was man ihm sagt, konnte der Fehler ja nur bei mir liegen...

Danke Dir.

Grüße,
Robert
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.