W zastosowaniach czesto pojawia sie potrzeba znalezienia parametrow najlepszego dopasowania pewnego modelu zadanego nie w postaci wyrazenia algebraicznego ale bardziej ,,egzotycznej'' formie np. rownania rozniczkowego lub calki oznaczonej zaleznej od parametrow. MATHEMATICA potrafi skutecznie dokonywac tego typu fitow, ale skladnia do tego potrzebna jest nieoczywista. Dzialajacy przyklad jest podany w DocumentationCenter, sekcja FindFit/Applications/DifferentialEquations, ale skladnia odnosi sie do innych modeli np. w postaci calek oznaczonych, szeregow itp.

Sprobojemy dofitowac do pobranych danych numerycznych model w postaci rozwiazania rownania rozniczkowego zwyczajnego. Jeden z parametrow, "a", stanowi warunek poczatkowy. Drugi, "b", jest zawarty w samym rownaniu.

Funkcje ponizej (fit1, fit2) oferuja identyczna funkcjonalnosc, ale funkcja fit1 dziala 100x szybciej dzieki mechanizmowi pamietania (tutorial "FunctionsThatRememberValuesTheyHaveFound"). W prostych zadaniach mozna uzyc skladni fit2; jedyne co tracimy to szybkosc dzialania. Funkcja pamietajaca "pozera" za to ogromne ilosci pamieci.

fit1[a_?NumberQ,b_?NumberQ]:=(fit1[a,b]=
y/.NDSolve[{y''[x]+Sin[ y[x]]^b==x^2,y[0]==0,y'[0]==a},y,{x,-1,1}][[1]])

fit2[a_?NumberQ,b_?NumberQ]:=
y/.NDSolve[{y''[x]+Sin[ y[x]]^b==x^2,y[0]==0,y'[0]==a},y,{x,-1,1}][[1]]

Kluczowe elementy NIEZBEDNE aby funkcja FindFit zadzialala to:
a) _?NumberQ po kazdym parametrze
b) parametrami funkcji musza byc tylko i wylacznie parametry fitowane, w tym wypadku a i b
c) funkcja musi zwracac funkcje (interpolujaca)
d) bardzo czesto pomocne jest dodanie Re (czesc rzeczywista), gdyz ,,egzotyczne'' modele przy niezbyt dobrych parametrach startowych latwo produkuja wartosci zespolone

fit2[1,1] (* Funkcja fit2 zwraca funkcje interpolujaca *)

fit1[1,1][0.2] (* wartosc liczbowa uzyskujemy wiec w ten sposob *)

Plot[fit2[-1/12,2][t],{t,-1,1}] (* wykres przykladowy *)

dataX=RandomReal[{-1,1},20];
dataY=fit1[-1/12,2][dataX];
data={dataX,dataY}//Transpose;
 (* generujemy przykladowa tabele losowych wartosci funkcji *)

Prosze zwrocic uwage na skladnie ponizej. Parametry podane sa jako pierwsze, a zmienna niezalezna dopiero jako parametr zwracanej funkcji interpolujacej.

FindFit[data,Re[fit1[A,B][X]],{{A,-1.1},{B,1.4}},X]//Timing

FindFit[data,Re[fit2[A,B][X]],{{A,-1.1},{B,1.4}},X]//Timing

Czas fitowania przy pomocy funkcji ,,pamietajacej'' fit1 jest kilkanasacie razy mniejszy niz przy uzyciu funkcji fit2. W powyzszym przypadku ma to niewielkie znaczenie, gdyz wynik uzyskujemy w obu przypadkach ponizej 1 sekundy.