I have a model function $f:\mathbb{R}^2\rightarrow\mathbb{R}^2$, and a bunch of data points for which I'd like Mathematica to fit for me. Unfortunately FindFit
seems to only deal with functions $\mathbb{R}^n\rightarrow\mathbb{R}$. I guess I could make my own square difference from the data to the model and use NMinimize
on that, but I wondering if there was an easier way?
Edit - toy example with answers
$g\left(x,y\right)=\left<abx+(2c+d)y,(2a+b)x+cdy\right>$
g[{x_, y_}, {a_, b_, c_, d_}] := {a b x + (2 c + d) y, (2 a + b) x + c d y};
points = Flatten[Table[{{x, y}, g[{x, y}, {1, 2, 3, 4}]},
{x, -1, 1, 0.5}, {y, -1, 1, 0.5}], 1];
Finding a fit for each component separately doesn't work:
data1 = points /. {{x_, y_}, {u_, v_}} -> {x, y, u};
data2 = points /. {{x_, y_}, {u_, v_}} -> {x, y, v};
FindFit[data1, g[{x, y}, {a, b, c, d}][[1]], {a, b, c, d}, {x, y}]
FindFit[data2, g[{x, y}, {a, b, c, d}][[2]], {a, b, c, d}, {x, y}]
{a -> 0.729723, b -> 2.74077, c -> 3.35659, d -> 3.28681}
{a -> 1.48555, b -> 1.02891, c -> 2.81936, d -> 4.25629}
Jens suggestion works well:
data3 = points /. {{x_, y_}, {u_, v_}} -> Sequence[{x, y, 0, u}, {x, y, 1, v}];
FindFit[data3, g[{x, y}, {a, b, c, d}].{1 - s, s}, {a, b, c, d}, {x, y, s}]
{a -> 1., b -> 2., c -> 3., d -> 4.}
My original suggestion (which is similar to user840's links)
error = Plus @@ (points /.
{{x_, y_}, {u_, v_}} -> Norm[g[{x, y}, {a, b, c, d}] - {u, v}]^2);
NMinimize[error, {a, b, c, d}]
Gives a different, but still correct, solution (or at least a close approximation thereof)
{1.41754*10^-13, {a -> 1.00004, b -> 1.99993, c -> 2., d -> 6.}}
NonlinearModelFit
doesn't seem to support this. $\endgroup$NonlinearModelFit
, but without example data, I do not want to spend more time on this problem. $\endgroup$