| Autor |
Wiadomość |
Ciamciaj ~user
Dołączył: 05 Mar 2009 Posty: 9
|
|
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 |
|
|
steficzek ~user

Dołączył: 25 Cze 2008 Posty: 105
Pomógł: 13
|
|
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 |
|
|
Ciamciaj ~user
Dołączył: 05 Mar 2009 Posty: 9
|
|
Dzieki, jestem nowy, poprawie sie 
|
|
| Powrót do góry |
|
|
steficzek ~user

Dołączył: 25 Cze 2008 Posty: 105
Pomógł: 13
|
|
Wiem, thx za point
|
|
| Powrót do góry |
|
|
Ciamciaj ~user
Dołączył: 05 Mar 2009 Posty: 9
|
|
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 |
|
|
|
|
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
|
MapaPowered by phpBB © 2001, 2005 phpBB Group
|
|