Guten Morgen Andreas,
Fit oder Regress reichen nicht, da die Funktion, die ich anpassen möchte
die Lösung einer Differentialgleichung ist.
Okay, Sie wollen die Lösung des Differentialgleichungssystems an
experimentelle Daten anpassen um die Koeffizienten p1, p2, ..., p6
herauszufinden, die nötig sind, damit eine derartige Lösung die
experimentellen Daten imitiert. Wenn Sie diese Aufgabe direkt angehen
In[67]:= Needs["NonlinearRegression`"]
In[74]:= NonlinearRegress[With[{a = 0.77, b = 1.},
Table[{j, {Sin[a + b j^2] + RandomReal[{-Abs[a]/4, Abs[b]/5}],
Cos[a + b j^2] + RandomReal[{-Abs[a]/5, Abs[b]/4}]}}, {j, 0, 18,
3}]
], {Sin[a + b*x^2], Cos[a + b x^2]}, {a, b}, x]
sagt Mma
NonlinearRegress::bddata: <snip>
The data format {{x11, x12, ..., {y11, ..., y1m}}, {x21, x22, ...,
{y21, ..., y2m}}, ..., {{xn1, xn2, ..., {yn1, ..., ynm}}} is reserved
for multiple response data, which will be supported in the future.
FindFit[] sagt etwas Ähnliches. Ergo: NonlinearRegress[] pro Datensatz
aufrufen und auf der Gesamtzielfunktion model[] nach einem Minimum suchen,
beispielsweise
In[87]:= Clear[d1];
d1 = With[{a = 0.77, b = 1.},
Table[{j, Sin[a + b j^2] + RandomReal[{-Abs[a]/4, Abs[b]/5}]}, {j,
0, 18, 3}]
];
NonlinearRegress[d1, Sin[a + b*x^2], {a, b}, x,
RegressionReport -> BestFitParameters]
Out[89]= {BestFitParameters -> {a -> 0.81039, b -> 1.00014}}
In[90]:= Clear[d2]
d2 = With[{a = 0.67, b = 1.2},
Table[{j, Cos[a + b j^2] + RandomReal[{-Abs[a]/5, Abs[b]/4}]}, {j,
0, 18, 3}]
];
NonlinearRegress[d2, Cos[a + b x^2], {a, b}, x,
RegressionReport -> BestFitParameters]
Out[92]= {BestFitParameters -> {a -> 1.9616, b -> 1.00249}}
In[104]:= Clear[model]
model[a_, b_] := (Plus @@ (((#[[2]] - Sin[a + b #[[1]]^2])^2) & /@ d1))
+ (Plus @@ (((#[[2]] - Cos[a + b #[[1]]^2])^2) & /@ d2))
In[109]:= FindMinimum[model[x, y], {x, 0.67}, {y, 1.}]
Out[109]= {7.10256, {x -> 1.47427, y -> 1.00178}}
In[113]:= FindMinimum[model[x, y], {x, 0.1}, {y, .1}]
Out[113]= {7.90688, {x -> 1.94098, y -> 0.0901565}}
In[114]:= FindMinimum[model[x, y], {x, 0.1}, {y, -1.}]
Out[114]= {8.39079, {x -> 2.23149, y -> -0.996674}}
In[115]:= FindMinimum[{model[x, y], x > 0.67,
y > 1.}, {x, .1}, {y, .1}]
Out[115]= {7.10256, {x -> 1.47427, y -> 1.00178}}
Es kann sinnvoll sein, das Minimum nur in dem Bereich zu suchen, der durch
die Einzelergebnisse der NonlinearRegress[]-Läufe abgesteckt wird -
insbesondere bei einem sechsdimensionalen Parameterraum. Allenfalls
durchsuchen Sie zur Sicherheit das web nach einer Implementation für
multiple response data.
Schönes Wochenende
Udo.