Dziwny Error!

0

Koledzy z większym doświadczeniem spójrzcie na poniższą funkcję. Na tej pętli zawiesza mi się program i ja (jak zwykle) nie wiem co jest grane? :-)

function Dsf(C1,C2,t : extended) : extended; { g/dm3 }
{ C1 - stęż. molowe NaOH, C2 - stęż. molowe NaCl, t - temperatura C }
var
a1,a2,ds,dsn : extended;
begin
dsn := 1000.0;
repeat
ds := dsn;
a1 := C1*(MM[7] + MM[8])/dsn1E2;
a2 := C2
(MM[2] + MM[8])/dsn*1E2;
dsn := 1001.2386 + (-5.37261367E-2 + (-4.6335699E-3 + 8.857597E-6 *t)*t)*t
+ (11.2833252 + (-2.41371198E-2 + (1.41043129E-4 + 2.0989602E-7 *t)*t)*t)*a1
+ (1.051118323E-2 + (3.94583735E-4 + (-1.87891056E-6 - 1.70985638E-8 *t)*t)*t)a1a1
+ (-4.08529663E-4 + (-4.15156259E-6 + (2.54325626E-8 + 1.71624583E-10 *t)*t)t)a1a1a1
+ (7.62089837 + (-3.32329644E-2 + (3.67454487E-4 - 1.24774079E-6 *t)*t)*t)*a2
+ (1.91719517E-3 + (7.0065584E-4 + (-8.89125435E-6 + 3.29417464E-8 *t)*t)*t)a2a2
+ (4.46468282E-4 + (-7.18621328E-6 + (9.73902756E-8 - 4.066746E-10 *t)*t)t)a2a2a2;

until abs(dsn - ds) &lt 1E-2;
Dsf := dsn
end; { Dsf }

Dzięki za pomoc!

0

W oczach mi sie mieni i nie mam sily analizowac.

Ale odpowiedz jest najprawdopodobniej taka:
warunek: abs(dsn - ds) &lt 1E-2;

nie jest nigdy spelniony.--Pawel

Delphi6

0

Jest możliwość sprawdzenia?

0

Wiec po pierwsze: trudno poeksperymentowac z Twoim kodem bo nie podales co to jest MM. Sesnoswne zakresy warosci C1 C2 i t mozna zgadnac, ale MM nie.

Proponuję Ci następujący eksperyment (zakładam, że piszesz w Delphi)

Daj na formie Memo1 (nie zapomnij o scrollbarach: ustav ScrollBars na ssBoth) i zmodyfikuj kod w następujący sposób

function Dsf(C1,C2,t : extended) : extended; { g/dm3 }
{ C1 - stęż. molowe NaOH, C2 - stęż. molowe NaCl, t - temperatura C }
var
a1,a2,ds,dsn : extended;
i, maxi, k : integer;
begin
dsn := 1000.0;
i:=0;
maxi:=1000;
k:=20;
repeat
inc(i);
{tu Twoje obliczenia}

if (i mod k)=0 then
Form1.Memo1.Lines.Add(IntToStr(i)+' '+FloatToStr(abs(dsn-ds)));
until (abs(dsn - ds) &lt 1E-2) or (i&gt=maxi);
Dsf := dsn
end; { Dsf }

teraz funkcja skonczy i da wynik jesli abs(dsn-ds)&lt0.01 lub jesli liczba iteracji osiagnie wartosc maxi. Dodatkowo, dla co k-tej iteracji zostana wpisane do Memo: numer iteracji i aktualna wartosc abs(dsn-ds)

Bedziesz mogl zobaczyc czy w trakcie kolejnych 'obrotow' petli repeat abs(dsn-ds) w ogole sie zmniejsza, czy tez dąży w inna strone.
Ja wstawiłem max liczbę iteracji 1000 i wyświetlanie co 50 iteracji: ale przyjmij takie wartości jakie Tobie odpowiadają.
Jeśli piszesz w pascalu, zamiast Form1.Memo1.Lines.Add daj polecenie wypisania na ekranie (writeln czy jak mu tam), zapisu do pliku, czy co wolisz.

Przypuszczam, ze zrobiles blad gdzies w tym duzym wzorze. Ja nie umiem wpisac znacznie krotszego wzoru nie mylac sie gdzies w nawiasach, minusach itp. Jesli wklepales wzor dobrze, sprawdz jego zrodlo: jesli sam wyprowadziles, sprawdz wyprowadzenie. jesli przepisales z ksaizki, zajrzyj do innej ksiazki (w najelpszych bywaja bledy). Jak zwykle w chemicznych obliczeniach sprawdz, czy nie mylisz g z kG, ml z dm3 itd :). Rozbij wzor na czesci skladowe, wsadz do osobnych zmiennych i przesledz jak sie zmieniaja. W koncu na pewno znajdziesz blad...

A uwaga generalna: obliczeniom iteracyjnym zawsze nalezy dawac limit iteracji - na wypadek gdyby warunek nie zostal osiagniety.

Jeszcze jedno, puscilem kilka razy Twoja funkcje, wstawiajac dane (C1, C2, t, MM[2], MM[7] i MM[8]) zupelnie od paly. I zauwazylem ze wynik przestaje byc zbiezny w kolejnych iteracjach jesli wartosci MM[x] ORAZ C1 i C2 sa duze. Czyli dla duzych wartosci a1 i a2. A dla malych OK. To moze oznaczac niepoprawne wartosci wejsciowe. Sprawdz jednostki!!!

Pozdrawiam, Pawel--Pawel

Delphi6

0

Dzięki Pawel {browar}

Znalazłem błąd dotyczył wartości C1 i C2 które były liczone w innej funkcji(tam był błąd) i miały za duże wartości dlatego też pętla się nie spełaniała.

marko

0

Ciesze sie {brawo} --Pawel

Delphi6

0

Paweł jakis ty inteligentny chyba musze sie z toba kiedy na priv zgadac kiedy tam :)---= pozdrawiam Oskar =- (delphi 6 GG:2792614)

0

no bez takich kąplemętów, pls {wstyd} ;)

--Pawel

Delphi6

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