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

alle Nullstellen in einem bestimmten Intervall berechnen

 

Janine
Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 07.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.07.2012, 21:30     Titel: alle Nullstellen in einem bestimmten Intervall berechnen
  Antworten mit Zitat      
Hallo,

ich habe mal wieder ein Problemchen. Eingetlich sollte es nicht so schrecklich kompliziert sein, aber ich komme irgendwie auf keinen grünen Zweig.
Nun zu meinem Problem:
Ich löse ein Nullstellenproblem mit fsolve und übergebe hier natürlich einen Startwert. Jetzt möchte ich meine Funktion aber gerne so implementieren, dass ich dieser ein Intervall z.B. in Form eines 2-dim. Vektors übergebe mit unterer und oberer Grenze. Da ich mir aufgrund des Rechenaufwands allerdings nicht leisten möchte z.B. in 0.1-Startwertschritten mein Intervall abzulaufen, dachte ich an eine Art Intervallhalbierungsmethode. Ich nehme mir die beiden Grenzen als Stratwerte und berechne die resultierenden Nullstellen. Sobald 2 Ergebnisse dann gleich sind, kann ich die Suche in diese Richtung abbrechen. Aber genau in der Ümsetzung liegt mein Problem.
1. Ist es überhaupt sinnvoll, das Ganze auf diese Weise zu lösen? Oder gibt es in Matlab vielleicht sogar schon einen Befehö für so etwas (den ich nur nicht gefunden habe)?
2. Wenn es sinnvoll ist, wie implementiere ich das dann? Hab da gerade irgendwie nen Knoten im Hirn, den ich selber nicht auf bekomme Razz

Vielleicht trotzdem schon mal mein Stand der Dinge:
Ich habe eine Funktion mitte(x1,x2) geschrieben, die mir die Nullstelle zum in der Mitte liegenden Startwert m=(x1+x2)/2 berechnet und 1 zurückgibt falls NS(x1)=NS(m),
2 zurückgibt falls NS(x2)=NS(m)
und 0 falls der Wert verschieden ist.
Code:
function b = mitte(x1,x2)
m = 0.5*abs(x2-x1);
fm = fsolve(myfun,m);

if x1==fm
    bl=[1,m,fm];
elseif x2==fm
    bl=[2,m,fm];
else
    bl=[0,m,fm];
end
end
 


Ich dachte die sei vielleicht hilfreich... Aber eine Schleife, die iterativ prüft bekomme ich irgendwie nicht zu Stande.

Wäre toll, wenn mir jemand einen Tipp geben könnte, oder das Brett vor meinem Kopf wegnehmen!

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


Janine
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 20
Anmeldedatum: 07.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2012, 09:05     Titel:
  Antworten mit Zitat      
Ok, ich habe das jetzt gestern mal noch so ausgebaut, dass es funktionieren könnte und bekomme nun die Fehlermeldung, dass die Funktion nach 500 Iterationen abgebrochen wurde. Klar könnte ich diese Zahl erhöhen, aber eigentlich möchte ich ja eine effektive Art finden, um alle Nullstellen auf dem Intervall zu suchen. Vielleicht habe ich auch irgendetwas falsch gemacht.

Auf jeden Fall dachte heute Morgen noch an einen weiteren Ansatz:
1. Ich werte z.B. 10 Stellen aus dem Intervall mit fsolve aus und speichere sie in einer Matrix (immer Wertepaare aus Nullstelle und Startwert)
2. Ich prüfe, ob ob 2 nebeneinanderliegende Einträge eines Vektors identisch sind.
3. Falls nein, wähle ich einen Startwert der zwischen den beiden Startwerten liegt, die auf diese Werte geführt haben und füge das neue Wertepaar zwischen diesen beiden ein.
4. Ich springe solange wieder zu Schritt 2, bis jede Nullstelle mind. 2x in meiner Matrix steht.
5. Lösche mit unique gleiche Werte.

Nun rechnet Matlab allerdings schon einige Minuten munter vor sich hin... Und es scheint nicht so, als würde sich demnächst ein Ende finden. Effektiv nenne ich also was anderes Confused
Hat dazu jemand vielleicht spontan ne Idee? Falls gewünscht, kann ich auch mal meinen Code posten...
Private Nachricht senden Benutzer-Profile anzeigen
 
Thomas84
Forum-Meister

Forum-Meister


Beiträge: 546
Anmeldedatum: 10.02.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2012, 09:35     Titel:
  Antworten mit Zitat      
ich vermute mal das es nicht so einfach ist alle Nullstellen einer beliebigen Funktion zu finden. Was ist z.B. mit f(x) = sin(1/x). Man weiß eigentlich nie ob man auch alle Nullstellen hat.
Wenn man ein bisschen mehr über die Funktion weiß, kann man sicherlich was machen.
Im übrigen hilft dir vielleicht fzero weiter. Wenn man für x0 ein Intervall angibt wird ein Bisektionsverfahren angewandt um eine Nullstelle zu bestimmen.

viele Grüße
Thomas
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.