DMUG-Archiv 2008

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: Fitten mehrerer Kurven mit den gleichen Parametern

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.


Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html