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

Bisektionsverfahren

 

reiko
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 04.02.23
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.02.2023, 23:12     Titel: Bisektionsverfahren
  Antworten mit Zitat      
Hallo, ich versuche gerade ein Bisektionsverfahren zu programmieren, welches als Ausgabe die Nullstelle und ein Fehlerintervall hat.
Der Eingabeparameter soll wie folgt sein: Eine beliebige anonyme Funktion, ein Start-Intervall, und ein Wert
für eine minimal zu erreichende Genauigkeit der Nullstellenbestimmung

So sieht das ganze erstmal aus:

function [NST]=Nullstelle(f,i,g)
y1=f(min(i));
y3=f(max(i));
m=(max(i)+min(i))/2;
diff=max(i)-min(i);
if sign(y1) ~= sign (y3)
while diff>g
y2=f(m);
if sign(y1) ~= sign(y2)
i(1,2) = m;
else
i(1,1) = m;
end
y1=f(min(i));
m=(max(i)+min(i))/2;
diff=max(i)-min(i);
NST=i;
end
end
end

Command Window Eingabe: Nullstelle(@(x) x^2-2, [-5 0],0.001)

Folgendes Problem habe ich:
Das Verfahren funktioniert nur, wenn die Nullstelle auf der linken Seite des Intervalls liegt.
Ich bin mir auch nicht sicher was passiert, wenn die Nullstelle auf der Intervallkante liegt oder die Vorzeichen auf beiden Seiten des Intervalls gleich sind?

Ich brauche dringend Hilfe. Ich freue mich über Tipps. Smile

LG Reiko
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.02.2023, 18:08     Titel:
  Antworten mit Zitat      
Hallo,

der Beispielaufruf funktioniert bei mir und liefert -1.4148 -1.4142, was sinnvoll aussieht.

Zitat:
Das Verfahren funktioniert nur, wenn die Nullstelle auf der linken Seite des Intervalls liegt.

Falls du "nur in der linken Hälfte" meinst: in dem Beispiel liegt die Nullstelle ja in der rechten Hälfte, und es scheint zu funktionieren.

Zitat:
Ich bin mir auch nicht sicher was passiert, wenn die Nullstelle auf der Intervallkante liegt oder die Vorzeichen auf beiden Seiten des Intervalls gleich sind?

Im Zweifelsfall ausprobieren und im Debugging-Modus durchgehen.
Wenn die Vorzeichen der Funktionswerte gleich sind, ist if sign(y1) ~= sign (y3) unzutreffend und somit wird nichts weiter gemacht. Falls du versuchst, das Ergebnis einer Variable zuzuweisen, wirst du eine Fehlermeldung bekommen:
Code:
NST = Nullstelle(@(x) x^2-2, [5 10],0.001)
Output argument "NST" (and possibly others) not assigned a value in the execution with
"Nullstelle" function.

Ich würde hier mit error selbst eine Fehlermeldung generieren mit ähnlichem Text wie bei fzero:
Code:
NST = fzero(@(x) x^2-2, [5 10])
Error using fzero
Function values at the interval endpoints must differ in sign.


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
reiko
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 04.02.23
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.02.2023, 22:19     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

der Beispielaufruf funktioniert bei mir und liefert -1.4148 -1.4142, was sinnvoll aussieht.

Zitat:
Das Verfahren funktioniert nur, wenn die Nullstelle auf der linken Seite des Intervalls liegt.

Falls du "nur in der linken Hälfte" meinst: in dem Beispiel liegt die Nullstelle ja in der rechten Hälfte, und es scheint zu funktionieren.

Zitat:
Ich bin mir auch nicht sicher was passiert, wenn die Nullstelle auf der Intervallkante liegt oder die Vorzeichen auf beiden Seiten des Intervalls gleich sind?

Im Zweifelsfall ausprobieren und im Debugging-Modus durchgehen.
Wenn die Vorzeichen der Funktionswerte gleich sind, ist if sign(y1) ~= sign (y3) unzutreffend und somit wird nichts weiter gemacht. Falls du versuchst, das Ergebnis einer Variable zuzuweisen, wirst du eine Fehlermeldung bekommen:
Code:
NST = Nullstelle(@(x) x^2-2, [5 10],0.001)
Output argument "NST" (and possibly others) not assigned a value in the execution with
"Nullstelle" function.

Ich würde hier mit error selbst eine Fehlermeldung generieren mit ähnlichem Text wie bei fzero:
Code:
NST = fzero(@(x) x^2-2, [5 10])
Error using fzero
Function values at the interval endpoints must differ in sign.


Grüße,
Harald


Hallo Harald,

danke für die Antwort Smile
laut meiner Matheprofessorin liegt die Nullstelle auf der linken Seite...
Ich verstehe leider nicht viel von Matlab. Das Bisektionsverfahren habe ich mit meinen Kommilitonen zusammen geschustert.

Wie wende ich den Debugging Modus an?
Wenn ich Nullstelle = fzero (@(x) x^2-2, [5 10]) eingebe, kommt eine Fehlermeldung. Was habe ich dann davon?
Wie schreibe ich die Funktion um damit sie auch mit zwei positiven Funktionswerten funktioniert?

LG Reiko
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Ich verstehe leider nicht viel von Matlab.

Kann man ja lernen, z.B. mit dem MATLAB Onramp.

Zitat:
Wie wende ich den Debugging Modus an?

https://www.mathworks.com/help/matl.....process-and-features.html

Zitat:
Wenn ich Nullstelle = fzero (@(x) x^2-2, [5 10]) eingebe, kommt eine Fehlermeldung.

Welche Fehlermeldung? Hast du mal die Dokumentation von fzero angesehen?

Zitat:
Was habe ich dann davon?

Es ging mir darum zu zeigen, dass du eine ähnliche Fehlermeldung erzeugen kannst.

Zitat:
Wie schreibe ich die Funktion um damit sie auch mit zwei positiven Funktionswerten funktioniert?

Du meinst an den Intervallendpunkten? Meines Wissens ist es eine mathematische Voraussetzung für das Bisektionsverfahren, dass die Vorzeichen der Funktionswerte an den Intervallendpunkten unterschiedlich sind.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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 - 2024 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.