Miejsce zerowe funkcji metoda bisekcji

 
Napisz nowy tematOdpowiedz do tematu    Forum programistyczne Programmers Zone Strona Główna -> Pascal/Delphi
Autor Wiadomość
Ciamciaj
~user




Dołączył: 05 Mar 2009
Posty: 9


PostWysłany: 07-02-10 13:54 Zacytuj zaznaczone Odpowiedz z cytatem

Witam. Dostalem takie o to zadanie metoda polowienia (bisekcji).
Algorytm krokowy:
Dane: Funkcja f(x) ciagla w przedziale domknietym [a,b] i spelniajaca warunek f(a)*f(b)<0
Wynik: Przyblizenie miejsca zerowego funkcji x0 z dokladnoscia mniejsza Eps lub Eps1 spelniajacego kryterium 1 lub 3
Krok1: Odczytaj: a,b wyznacz fa:=f(a); fb(f(b); Niech i:=0;
Krok2: Wyznaczamy srodek odcinka ab s:=(a=b)/2; fs:=f(s);
Krok3: Jesli bi-ai< eps lyb abs(fs)<Eps1 to x0:=s STOP
Krok 4 W przeciwnym razie i:=i+1; jesli fa*fs<0 to ai:=a; oraz bi:=s; a jesli nie to ai:=s; bi:=bi-1; i fa:=fs WROC DO KROKU 2


Doszedlem do czegos takiego:

Cytat:
program Bisekcja;
var
a,b,s : real;
eps, eps1 : real;
fa, fb, fs :real;
i: real;
function f(x:real):real;
begin
f :=x-4;
end;
begin
writeln('Program znajduje miejsce zerowe funkcji');
writeln('w przedziale [a,b]');
writeln('Podaj wartosc a: ');
readln(a);
writeln('Podaj wartosc b: ');
readln(b);
writeln('Podaj dokladnosc: ');
readln(eps);
writeln('podaj druga dokladnosc: ');
readln(eps1);
fa:=f(a);
fb:=f(b);
if fa*fb<0 then


begin
i:=0;
repeat
s:=(a+b)/2;
fs:=f(s);
i:=i+1;
if (f(a)*f(s))<0 then
b:=s
else
a:=s;
writeln(s);
until (b-a<eps) or (abs(fs)<eps1);
writeln('Miejsce zerowe: ',s:12:3) ;
readln;
end;
else
write('brak miejsc zerowych');
end.

W tym co napisalem nie dziala ostatni else (nie wiem gdzie jest blad, jesli ktos by mogl sprawdzic).

Chodzi mi o to zeby ktos mi pokazal jak mozna to poprawic zeby wygladalo jak ten algorytm krokowy.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
steficzek
~user




Dołączył: 25 Cze 2008
Posty: 105

Pomógł: 13

PostWysłany: 07-02-10 19:15 Zacytuj zaznaczone Odpowiedz z cytatem

Usuń średnik.

I teraz do Ciebie i innych - Nauczcie się do chole.y formatować tekst (chociaż wcięcia). Dobre formatowanie kodu 100-krotnie przyspiesza wyszukiwanie błędów i nigdy nie jest to stracony czas na wbicie paru spacji czy tabulatora.

Pascal:
Program Bisekcja;

Var a,b,s,eps,eps1,fa,fb,fs,i : Real;

  function f(x : Real) : Real;
  begin
    f:=x-4
  end;

Begin
  writeln('Program znajduje miejsce zerowe funkcji');
  writeln('w przedziale [a,b]');
  writeln('Podaj wartosc a: ');
  readln(a);
  writeln('Podaj wartosc b: ');
  readln(b);
  writeln('Podaj dokladnosc: ');
  readln(eps);
  writeln('podaj druga dokladnosc: ');
  readln(eps1);
  fa:=f(a);
  fb:=f(b);
  if fa*fb<0 then
    begin
      i:=0;
      repeat
        s:=(a+b)/2;
        fs:=f(s);
        i:=i+1;
        if (f(a)*f(s))<0 then b:=s
                         else a:=s;
        writeln(s);
      until (b-a<eps) or (abs(fs)<eps1);
      writeln('Miejsce zerowe: ',s:12:3) ;
      readln;
    end
  else write('brak miejsc zerowych');
End.


I co? od razu widać gdzie dałeś ciała? Zadanie fajne i ciekawe a zabawę popsuła pierdoła jaką jest średnik.


Użytkownik otrzymał punkt pomocy za ten post.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Ciamciaj
~user




Dołączył: 05 Mar 2009
Posty: 9


PostWysłany: 07-02-10 21:18 Zacytuj zaznaczone Odpowiedz z cytatem

Dzieki, jestem nowy, poprawie sie Smile
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
steficzek
~user




Dołączył: 25 Cze 2008
Posty: 105

Pomógł: 13

PostWysłany: 07-02-10 22:37 Zacytuj zaznaczone Odpowiedz z cytatem

Very Happy Wiem, thx za point
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Ciamciaj
~user




Dołączył: 05 Mar 2009
Posty: 9


PostWysłany: 08-02-10 20:20 Zacytuj zaznaczone Odpowiedz z cytatem

Program ulepszony o mozliwosc dodawania dowolnej funkcji liniowej

Pascal:
Program Bisekcja2;
 uses Crt;
Var a,b,s,eps,fa,fb,fs,i : Real;
    x,y : real;
  function f(x : Real) : Real;
  begin

    f:=x+y
  end;

Begin
clrscr;

  writeln('Program znajduje miejsce zerowe funkcji');
  writeln('w przedziale [a,b]');
  Write('Podaj wspolczynnik kierunkowy: ');readln(x);
  Write('Podaj wyraz wolny: ');readln(y);
  write('Podaj wartosc a: ');
  readln(a);
  write('Podaj wartosc b: ');
  readln(b);
  write('Podaj dokladnosc: ');
  readln(eps);
  fa:=f(a);
  fb:=f(b);
  if fa*fb<0 then
    begin
      i:=0;
      repeat
        s:=(a+b)/2;
        fs:=f(s);
        i:=i+1;
        if (f(a)*f(s))<0 then b:=s
                         else a:=s;
        writeln(s);
      until (b-a<eps) or (abs(fs)<eps) or (i>50);
      textcolor(5);
      writeln('Miejsce zerowe: ',s:12:3) ;
      readln;
    end
  else

  write('Funkcja nie posiada miejsc zerowych');readln;
End.

Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Napisz nowy tematOdpowiedz do tematu    Forum programistyczne Programmers Zone Strona Główna -> Pascal/Delphi Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Mapa
Powered by phpBB © 2001, 2005 phpBB Group

 Polecane strony