Several people have pointed out that this is a very hard problem to get right. There is no perfect answer, and tremendous amounts of energy has been spent on finding pretty good ones.

But nobody has given you a simple to implement "OK" answer. Not great. Just something that can readily be implemented which gives an answer that you can defend as somewhat reasonable. Depending on the application, this is often enough.

Here is an outline of one.

Let's say that the last variable a function of the rest, call it f. Make f(x_1, x_2, ... , x_(n-1)) into the weighted average of the known values of f at the points that you have. A reasonable weighting is that a point is weighted with weight 1/(square of distance from that point to the spot you're estimating). Then you can do it something like this (with some error checking added, of course...):

sub make_estimator {
return sub {0} unless @_; # You might want to die?
my @points = @_;
return sub {
my $weight_total;
my $weighted_sum;
foreach my $point (@points) {
my $dist_squared = 0;
foreach my $coord (0..$#_) {
$dist_squared += ($point->[$coord] - $_[$coord])**2;
}
if (0 == $dist_squared) {
return $point->[-1];
}
else {
my $weight = 1/$dist_squared;
$weight_total += $weight;
$weighted_sum += $weight * $point->[-1];
}
}
return $weighted_sum/$weight_total;
};
}
my $estimator = make_estimator(
[3, 4],
[4, 5],
);
print $estimator->(3.5);

This works perfectly well. The resulting function is trivially smooth everywhere except at the estimating points, and I'm reasonably surepositive that it is smooth there as well. It isn't linear or particularly simple though.

Feel free to play with the weighting function.

Update: I verified it. The function is also smooth at the estimating points. Its derivative at all estimating points is 0 (ie each is a maxima, minima, or inflection point).