厳密解ではありませんが、以下のスクリプトで最小距離に近い値は計算できました。
計算の流れですが、まずn次関数をとして、十分に細かい離散的なxに対するyを計算します。次に、任意の点と先ほど求めたそれぞれとのユークリッド距離を関数で計算します。最後に、ユークリッド距離の最小値を関数で求めます。
clf
x = (-2 : 0.001 : 2)'; % 十分に細かい x のベクトルを定義
y = x.^3 -2 * x; % n次関数を定義
point = [1, 1]; % 任意の点(a, b)を定義
func = [x, y]; % n次関数のxとyの行列
distances = pdist2(func, point); % n次関数の各点と任意の点とのユークリッド距離を計算
min_distance = min(distances); % 最小値を計算
% 以下は可視化処理のため直接関係ありません
hold on
axis equal
plot(x, y, 'b')
scatter(point(1), point(2), '.')
for k = 1:length(x)-1
g = plot([x(k), point(1)], [y(k+1), point(2)], 'g--');
t = text(point(1), point(2), num2str(distances(k)), 'FontSize',10);
drawnow limitrate
if distances(k) <= min_distance % 最小値になったらアニメーションをストップ
break
end
delete(g);
delete(t);
end
以下の画像は可視化の結果です。と点との最小距離はとなりました。