Rozwiązanie równania Pascal

0

Program musi być w pascalu.
"Napisać program znajdujący z dokładnością 0,00000001 rozwiązanie równania:
7,8x = x38 + 3,67,7 " Gdzie znak oznacza potęge. Poniżej moje wypociny... i nie wiem dalej niestety jak to zrobic!

Poniżej najprostszy kod bez wyłapywania różnych różności w równaniu:

function F(x: Real): Real;
begin
Result := twoja_funkcja_dla_ktorej_masz_znalec_rozwiazanie;
//przekształcona do postaci coś = 0;
end;

function Bisekcja(Lewy, Prawy: Real; Eps: Real): Real;
var
Srodek: Real;
begin
if F(Lewy) * F(Prawy) > 0 then
begin
Srodek := (Prawy + Lewy) / 2;
while F(Srodek) >= Eps do
begin
if F(Lewy) * F(Srodek) < 0 then
Prawy := Srodek
else
Lewy := Srodek;
end;
Result := Srodek;
end
else
Result := 0;
end;

Później napisałem coś takiego ale nie działa :

const e=0.00000001;
const f=-0.00000001;
var i,a,b,c,y1a,y1c,y2a,y2c,x:real;
begin
writeln('podaj lewa granice przedzialu');
readln(a);
writeln('podaj prawa granice przedzialu');
readln(b);
repeat
c:=(a+b)/2;
begin
y1a:=exp(aln(4.8));
y2a:=exp(35
ln(a)) + exp(3.7ln(6.5));
y1c:=exp(c
ln(4.8));
y2c:=exp(35ln(c)) + exp(3.7ln(6.5));
end;
if
y1a+y2a> y1c+y2c
then a:=c
else b:=c;
until
y1a+y2a<=e;

writeln;
writeln('rozwiazaniem jest:');
write(a)
end.

A kumpel poradził mi jeszcze cos takiego:

Ale spróbuj tak:
zapis
7,8x = x38 + 3,6^7,7
można zamienić na
7,8x - x38 - 3,6^7,7 = 0
i jest to dokładnie to samo, a to można zapisac w pascalu jako (trzeba dodać math do usesów):
Pow(7.8, x) - Pow(x, 38) - Pow(3.6, 7.7) = 0
zamykasz to w funkcję

function F(x: Real): Real;
begin
F := Pow(7.8, x) - Pow(x, 38) - Pow(3.6, 7.7);
end;

i odpadają Ci te linijki z logarytmami -
ya := F(a);
yc := F(c);

teraz

repeat
c := (a + b) / 2;
if ya * yc < 0 then
b := c
else
a := c;
until F(c) < e;

musisz jeszcze na samym początku (po wczytaniu a i b) sprawdzić, czy F(a)*F(b) < 0 - jak jest to oznacza, że ta funkcja ma w tym przedziale przynajmniej jedno miejsce zerowe (jak będzie > 0, to albo <ort>NIE MA</ort> wcale, albo ma parzystą ilość rozwiązań w tym przedziale)

Jeśli ktoś mogłby mi pomoc to prosilbym. Bo ja już nie mam cierpliwości do tego programu. Siedziałem już tyle dni i ciagle sie krece w kółko. Z góry dzieki chociaż za checie. Pzdr.

0
function power(x,y: extended):extended;
begin
    power:=exp(y*ln(x))
end;

function f(x:extended):extended;
begin
    f:=power(7.8, x)- power(x, 38)-power(3.6, 7.7)
end;

{ta funkcja w zerze jest okropnie stroma, bardzo gwałtownie z wartości ?1e4 przeskakuje do 7e55 i dla tego warunek f( c ) < e nie zatrzymuje pętli. Wynika to z ograniczonej dokładności liczb rzeczywistych, lepiej byłoby sprawdzać abs( f(c) ) < e, ale to też nic nie da}

const
    e=1e-17;
var
    a, b,c, ay, by, cy: extended;
begin
    a:=81; b:=82;
    ay:=f(a); by:=f(b);
    repeat
        c:=(a+b)/2;    cy:=f(c);
        if ay*cy<0 then begin
            by:= cy; b:= c;
        end else begin
            ay:=cy; a:=c;
        end;
    until abs(a-b)<e; {zatrzymuje się jeszcze dla 1e-17, dla 1e-18 już nie, dla real będzie odpowiednio mniej}
    writeln(a, ay);    
    writeln(b, by);
    if abs(ay)<abs(by) then c:=a else c:=b; {mamy dwa przybliżenia, wybierzmy lepsze}
    writeln(c, f( c )) 
end.
0

f( 81.381470006930774060373129746656862090766779513489970640015910662260617586867464722158039849183243808183646499114210294672398611275029443498979634709652009860478944383417279170403305988435256464631821980133633384745956751307230712707712489879227202604651253728189793305006707155304095971186045036823030263612915990973919648330971982020492472872200815243243753140224014608710708492973113628119209413103552705715843539854516566076175143938650637207811274921880659549396422325351352355937706306576728815
) =
0.0000000000000000000000000000000000000000000000000000000000000000000000000000000027893336430412415940410744003369897189395786040199596620867378275813253788168027561345339639753528844454411424952716357253327658674551262575574543893360313119169772132889971229210357034464266151904539197673744462240054160052378528166596140691583563622346678826797727699813439058922667557514793352625239188804961958212389865340764411441731576232623

chyba dość dobre przybliżenie ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1