The following is an edit of this post, for which a working solution was provided by John McGee. I have a different function and am not sure how to adapt the solution for it:

I want to construct a function that accepts multiple arguments, but where the number of arguments can change according to the length of a list that I insert as the set of arguments. For example, I have a table which has as elements the following lists:

{{1,2,3,4},{1,2,3,4,5,6},{1,2,3,4,5,6,7,8}, ...}

Note that the first list within the table has a length of 4, with progressive lists having an extra length of 2 compared to its previous. I have created the following function which works for the first list in the table:

f[{a,b,c,d}]:= (y[2] - c)*(y[2] - d)*Exp[2y[1](a - b) + (a^2 - b^2)+ 2y[2](c - d) + (c^2 - d^2)]

Similarly the function for the second list in the table should be:

f[{a,b,c,d,e,f}]:= (y[3] - e)*(y[3] - f)*Exp[2y[1](a - b) + (a^2 - b^2)+ 2y[2](c - d) +
                      (c^2 - d^2) + 2y[3](e - f) + (e^2 - f^2)]

There is a pattern which obeys the following:

  1. The coefficient in front of the exponential is always (y[n]- (element 1 of nth pair))*(y[n]- (element 2 of nth pair)) - where n is the number of the nth pair of elements in the list - i.e. for 3 pairs n would be 3 etc.
  2. In the exponent, the argument of y is the number of the pair being considered and the terms within the parenthesis is similarly the first element of each pair minus the second element of each pair.

I want to create a table that has as elements the result of the function. So the first element of such a table will be the evaluation to the above. The second element of the table should be the evaluation of the function also written explicitly above and so on.

How can I create the general function that accepts a varying number of arguments? I will need to loop over this function to assess it for the different lists in the table above.

Thanks for your help.


1 Answer 1

eF[z_: y] := Module[{j = 1, p = Partition[#, 2]},
 First[Times @@ (z[Length@p] - p[[-1]]) Exp[Total[(Subtract[##] 2 z[j++] + {#-#2}^2) & @@@ p]]]] &


ClearAll[a, b, c, d, e, f]
eF[][{a, b, c, d}]
(* E^((a-b)^2+(c-d)^2+2 (a-b) y[1]+2 (c-d) y[2]) (-c+y[2]) (-d+y[2]) *)
eF[][{a, b, c, d, e, f}]
(* E^((a-b)^2+(c-d)^2+(e-f)^2+2 (a-b) y[1]+2 (c-d) y[2]+2 (e-f) y[3]) (-e+y[3]) (-f+y[3]) *)
  • $\begingroup$ Does exactly what I wanted and is completely general for everyone to use! Thanks kguler! $\endgroup$
    – Jas
    Commented Feb 23, 2015 at 14:29
  • $\begingroup$ @Jas, my pleasure; glad i could help. $\endgroup$
    – kglr
    Commented Feb 23, 2015 at 14:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.