I have a function cxyz[s1, e1, s2, e2]
, and I want to find at least one set of {s1, e1, s2, e2}
for which the function's output is {2, 2, 2}
. Both NSolve and Solve give me that there are no solutions, but by manually adjusting the variables I can get close to {2, 2, 2}
.
The definition of the function is:
ChromaticityPlot["RGB"];
{cx, cy, cz} =
Interpolation[#, Method -> "Spline", InterpolationOrder -> 1] & /@
Map[Function[u,
Map[{#1[[1]],
Total[Select[u, Function[t, t[[1]] <= #1[[1]]]]][[2]]} &, u]],
Thread[{Image`ColorOperationsDump`$wavelengths, #}] & /@
Transpose[Image`ColorOperationsDump`tris]];
cxyz[s1_, e1_, s2_, e2_] := {cx[e1], cy[e1], cz[e1]} - {cx[s1], cy[s1],
cz[s1]} + {cx[e2], cy[e2], cz[e2]} - {cx[s2], cy[s2], cz[s2]}
Answer
You have an underdetermined system (more unknowns than equations). One possibility would be to use NMinimize[]
on the sum of squares of differences (actually, NArgMin[]
suffices, but you'll see why I didn't use it).
Most of the methods available to NMinimize[]
take a "RandomSeed"
option, which can be tweaked to produce different results if the objective function has multiple minima. Let's try this on the OP's system, using differential evolution as the optimization method:
Table[NMinimize[{SquaredEuclideanDistance[cxyz[s1, e1, s2, e2], {2, 2, 2}],
385 <= {s1, e1, s2, e2} <= 745}, {s1, e1, s2, e2},
Method -> {"DifferentialEvolution", "RandomSeed" -> k,
"ScalingFactor" -> 0.9}],
{k, 5}]
{{1.53211*10^-12, {s1 -> 479.195, e1 -> 743.045, s2 -> 635.343, e2 -> 503.826}},
{2.2567*10^-10, {s1 -> 385.967, e1 -> 572.506, s2 -> 562.054, e2 -> 422.602}},
{2.18925*10^-10, {s1 -> 386.46, e1 -> 422.611, s2 -> 562.054, e2 -> 572.507}},
{2.24271*10^-10, {s1 -> 562.053, e1 -> 422.587, s2 -> 385.185, e2 -> 572.506}},
{6.67845*10^-11, {s1 -> 563.374, e1 -> 448.807, s2 -> 443.187, e2 -> 573.769}}}
Note that five rather different minima were obtained, and all resulting in a relatively tiny value of the objective function. Which of these is the one you want/need is now entirely your decision. Using a different "RandomSeed"
setting or even a different optimization method will in all likelihood give results different from what you see here.
Comments
Post a Comment