Zadanie w Pascalu ; )

Dużo punktów, więc myślę, że warto... ; )
Proszę to potraktować na serio, bo inaczej zgłoszę spam.

Trzeba napisać program podający miejsce zerowe funkcji metodą bisekcji (połowienia odcinka). Chodzi o to, że mamy jakąś fukcję ściśle monotoniczną w przedziale <a;b>, i funkcja ta posiada dokładnie jedno miejsce zerowe w tym przedziale (zakładamy). Metoda połowienia odcinka, polega na tym, iż dzielimy odległość między a i b na pół i sprawdzamy, czy to miejsce jest miejscem zerowym, jeśli tak, to wypisujemy wynik i koniec. Jeśli nie, to miejsce zerowe jest albo po prawej stronie albo po lewej, sprawdzamy po której połówce jest stosując fukcję warunkową if f(a)*f(a+b/2) <0 then... miejsce zerowe jest po lewej stronie, jeśli nie po prawej i od nowa dzielimy odcinek instrukcją "do" rób, albo "repeat", "until".

Proszę o pomoc w napisaniu, zadanie na poniedziałek.

1

Odpowiedzi

Najlepsza Odpowiedź!
2009-12-19T23:02:05+01:00
Proszę...tylko podaj taką funkcję jaką potrzebujesz w miejscu deklaracji funkcji



Program Miejsce zerowe metodą bisekcji;

uses math;

const
EPS0 = 0.0000000001; // dokładność porównania z zerem
EPSX = 0.0000000001; // dokładność wyznaczenia pierwiastka

// Funkcja, której miejsce zerowe obliczamy
// f(x) = x^3*(x+sin(x^2-1)-1)-1
// <-1,0> i <1,2>
//-----------------------------------------

function f(x : real) : real;
begin
Result := x * x * x * (x + sin(x * x - 1) - 1) - 1;
end;

var
a,b,x0,fa,fb,f0 : real;

begin
writeln('Obliczanie pierwiastka funkcji - metoda bisekcji');
writeln('f(x) = x^3*(x+sin(x^2-1)-1)-1');
writeln('------------------------------------------------');
writeln;
writeln('Podaj zakres poszukiwan pierwiastka:');
writeln;
write('a = '); readln(a);
write('b = '); readln(b);
writeln;
writeln('------------------------------------------------');
writeln('WYNIK:');
writeln;
fa := f(a); fb := f(b);
if fa * fb > 0 then writeln('Funkcja nie spelnia zalozen')
else
begin
while abs(a - b) > EPSX do
begin
x0 := (a + b) / 2; f0 := f(x0);
if abs(f0) < EPS0 then break;
if fa * f0 < 0 then b := x0
else
begin
a := x0; fa := f0;
end;
end;
writeln('x0 = ',x0:15:8);
end;
writeln;
writeln('------------------------------------------------');
writeln('Koniec. Nacisnij Enter...');
readln;
end.