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) < 1E-2) or (i>=maxi);
Dsf := dsn
end; { Dsf }
teraz funkcja skonczy i da wynik jesli abs(dsn-ds)<0.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