|
reiko |
Forum-Newbie
|
|
Beiträge: 5
|
|
|
|
Anmeldedatum: 04.02.23
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 04.02.2023, 22:12
Titel: Bisektionsverfahren
|
|
|
|
|
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.
LG Reiko
|
|
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 05.02.2023, 17:08
Titel:
|
|
|
|
|
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:
Ich würde hier mit
error
selbst eine Fehlermeldung generieren mit ähnlichem Text wie bei fzero:
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 ;)
|
|
|
reiko |
Themenstarter
Forum-Newbie
|
|
Beiträge: 5
|
|
|
|
Anmeldedatum: 04.02.23
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 07.02.2023, 21:19
Titel:
|
|
|
|
|
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:
Ich würde hier mit
error
selbst eine Fehlermeldung generieren mit ähnlichem Text wie bei fzero:
Grüße,
Harald |
Hallo Harald,
danke für die Antwort
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
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.492
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 07.02.2023, 22:03
Titel:
|
|
|
|
|
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 ;)
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|