Bisektionsverfahren < Differenzialrechnung < Analysis < Oberstufe < Schule < Mathe < Vorhilfe
|
ich versuche Krampfhaft das bisektionsverfahren in Matlab zu programieren mittels einer vorschleife, jedoch ohne erfolg.
Da ich auf dem Gebiet noch kine erfahrung habe benötige ich hilfe oder hat vielleicht jemanhd schon ein fertig geschriebens programm in matlab dafür?
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:33 Mo 13.05.2013 | Autor: | leduart |
Hallo
Zeig doch mal deine Versuche,oder wenigstens ein Flussdiagramm!
Gruß leduart
|
|
|
|
|
Also mal die schritte:
F(a)F(b)<0
dann c= a+b/2
f(c) < 10^-8
ende sonst nchmal die schleife
hab kein plan wie das zu programieren ist.
|
|
|
|
|
> Also mal die schritte:
>
> F(a)F(b)<0
> dann c= a+b/2
du meinst vermutlich c = [mm] \frac{a+b}{2}
[/mm]
damit dies richtig rüberkommt, musst du aber eben
den Bruchstrich verwenden oder richtig Klammern setzen
> f(c) < 10^-8
>
> ende sonst nchmal die schleife
>
> hab kein plan wie das zu programieren ist.
Hallo Peter,
um sowas wirklich programmieren zu können,
muss man sich den ganzen Vorgang schon genauer
überlegen und eben seine einzelnen Schritte planen.
Vermutlich soll eine Funktion f vorausgesetzt sein,
welche über einem Intervall [a...b] mit a<b definiert
und stetig ist und die Voraussetzung f(a)*f(b)<0 erfüllt.
Die Werte von a und b und die Formel zur Berechnung
von Funktionswerten f(x) aus gegebenen x-Werten
müssen dem Programm als Eingabewerte vorliegen.
Nun müsste folgender Prozess mehrmals wiederholt
werden (bis ein gewisses Abbruchkriterium erfüllt
ist):
1.) Berechne den Mittelwert c von a und b.
2.) Berechne den Funktionswert f(c).
3.) Wird (zufällig) exakt f(c)=0, dann ist c eine
Nullstelle, und wir sind am Ziel und könnten
ev. die Schleife (in Matlab mittels "break")
abbrechen.
Andernfalls:
4.) Setze [mm] b_{neu}:=c [/mm] , falls f(a)*f(c)<0 oder aber
[mm] a_{neu}:=c [/mm] , falls f(c)*f(b)<0
Anstatt einer FOR - Schleife würde ich aber eher eine
WHILE - Schleife empfehlen, da die Anzahl der
notwendigen Schritte nicht im Voraus bekannt ist.
Als While-Bedingung kannst du dann etwa nehmen:
While [mm] ABS(f(c))>10^{-8} [/mm] ..... Dazu müsste man aber
dem c gleich schon von Anfang an einen Wert zuordnen;
man könnte z.B. am Start des Programms c:=a setzen.
(wie die Syntax in Matlab genau aussieht, weiß ich
nicht, da ich nicht mit Matlab arbeite).
LG , Al-Chw.
|
|
|
|
|
ok. ich habe dein ausführung verstanden nur bin ich nicht in der Lage eine solche schleife zu programieren:(
|
|
|
|
|
Naja, allzu schwierig wäre es natürlich nicht, dazu
im Netz mögliche Wege zu finden.
Google halt mal z.B.
Matlab Bisektionsmethode
Matlab Intervallhalbierung
oder so ...
Besser fände ich es allerdings noch, wenn du dann
konkrete Fragen wieder hier vorbringen würdest.
LG ,
Al-Chw.
|
|
|
|
|
Ich habe mal ein wenig gegraben nach einem eigenen
Progrämmchen zu diesem Thema. Allerdings ist es
in Pascal geschrieben. Das Wesentliche daraus:
PROGRAM Bisektion;
const epsilon = 1E-12;
var a, b, c, fa, fb, fc: real;
function f(x:real):real;
begin
f:={Funktionsterm}
end;
{------------------------------------}
BEGIN
a:=1;b:=5; {vorgegebene Intervallgrenzen}
c:=a;
while abs(f(c)) > epsilon do
begin
fa:=f(a);
fb:=f(b);
fc:=f(c);
if fc*fa < 0 then b:=c else a:=c;
c:=(a+b)/2;
end;
writeln(c,f(c))
END.
LG , Al-Chw.
|
|
|
|
|
> ich versuche Krampfhaft das bisektionsverfahren in Matlab
> zu programieren mittels einer vorschleife, jedoch ohne
> erfolg.
vorschleife ???
du meinst wohl eine FOR - Schleife !
|
|
|
|
|
ich habs mit biegen und brechen doch irgendwie hinbekommen :) jetzt wüsste ich gerne wie ich den absolouten Fehler berechnen kann?
Auch ganz allgmein
|
|
|
|
|
Hallo!
Die Schleife läuft so lange durch, bis die Länge des Intervalls einen gewissen Wert nicht unterschreitet. Diesen Wert findest du bei Al-Chwarizmi's Beitrag z.B. unter dem Variablennamen "epsilon". Das ist also die maximale Diffenz zwischen dem ermittelten und dem realen Wert. Damit kann der Fehler nicht bestimmt werden, sondern er wird vorgegeben!
|
|
|
|