Получение двумерного интерполяционного полинома в Matlab

У меня есть три вектора: один из X-местоположений, другой из Y-местоположений, а третий - f (x, y). Я хочу найти интерполяционный полином алгебраического выражения (используя Matlab), так как позже я буду использовать результат в задаче оптимизации в AMPL. Насколько мне известно, не существует функций, возвращающих интерполяционный полином.

Я пробовал https://la.mathworks.com/help/matlab/ref/griddedinterpolant.html, но эта функция дает интерполированные значения только в определенных точках.

Я также пробовал https://la.mathworks.com/help/matlab/ref/triscatteredinterp.html, как предложено в Функциональная форма 2D-интерполяции в Matlab, но вывод не является коэффициентом многочлена. Я не вижу его, кажется, он заперт внутри какой-то странной переменной.

Это небольшая программа, которую я сделал, чтобы проверить, что я делаю:

close all
clear
clc

[X,Y] = ndgrid(1:10,1:10);
V = X.^2 + 3*(Y).^2;
F = griddedInterpolant(X,Y,V,'cubic');
[Xq,Yq] = ndgrid(1:0.5:10,1:0.5:10);
Vq = F(Xq,Yq);
mesh(Xq,Yq,Vq)
figure
mesh(X, Y, V)

Мне нужен вывод, который вместо возврата значения в точках сетки возвращает все, что он использовал для вычисления указанных значений. Я знаю, что это можно сделать в математике с помощью https://reference.wolfram.com/language/ref/InterpolatingPolynomial.html, поэтому мне кажется странным, что Matlab не может.


person slow_learner    schedule 30.09.2019    source источник
comment
Не уверен, что понял. Вам нужна функция, которая возвращает коэффициенты для полинома p(X,Y) степени n, который лучше всего подходит (в смысле наименьших квадратов) для данных в Z ? Но почему вы пытаетесь подогнать свои данные, если вы уже знаете исходную функцию f(x,y)?   -  person obchardon    schedule 30.09.2019
comment
Это тест, у меня есть файл с измеренными данными, f(x, y) которых мне неизвестен. Я использую это, чтобы убедиться, что мой код работает, прежде чем работать с фактическими данными, где у меня нет возможности проверить свои результаты.   -  person slow_learner    schedule 30.09.2019
comment
Следующая страница должна помочь de.mathworks.com/help/curvefit /evaluate-a-surface-fit.html (из набора инструментов Curve Fitting)   -  person marsei    schedule 30.09.2019


Ответы (1)


Вы можете использовать fit, если у вас есть набор инструментов для подгонки кривой.

Если это не так, вы можете использовать простую регрессию, если я возьму ваш пример:

% The example data
[X,Y] = ndgrid(1:10,1:10);
V = X.^2 + 3*(Y).^2;

% The size of X
s = size(X(:),1);

% Let's suppose that you want to fit a polynome of degree 2.
% Create all the possible combination for a polynome of degree 2
%        cst     x     y     x^2       y^2       x*y
A = [ones(s,1), X(:), Y(:), X(:).^2, Y(:).^2, X(:).*Y(:)]

% Then using mldivide
p = A\V(:)

% We obtain:

p = 
    0  % cst
    0  % x
    0  % y
    1  % x^2
    3  % y^2
    0  % x*y
person obchardon    schedule 30.09.2019
comment
Большое спасибо за ваш ответ, но, пожалуйста, позвольте мне задать вопрос. Фактические данные не будут такими чистыми, есть ли способ рассчитать R ^ 2, чтобы увидеть, насколько хорошо они подходят? - person slow_learner; 30.09.2019
comment
@slow_learner R ^ 2 на самом деле ничего не значит, кроме линейной регрессии. Вы можете оценить, насколько хорошо подходит, с помощью других средств (например, вычислив остатки). - person David; 01.10.2019