3D-кривая

У меня есть дискретная регулярная сетка из точек a,b и их соответствующих значений c, и я интерполирую ее дальше, чтобы получить гладкую кривую. Теперь из данных интерполяции я также хочу создать полиномиальное уравнение для подгонки кривой. Как разместить 3D-график в полиноме?

Я пытаюсь сделать это в MATLAB. Я использовал панель инструментов для поверхностного монтажа в MATLAB (r2010a) для трехмерных данных. Но как найти формулу, которая наилучшим образом соответствует набору данных в MATLAB/MAPLE или любом другом программном обеспечении. Любой совет? Также наиболее полезными будут некоторые реальные примеры кода для просмотра файлов PDF, в Интернете и т.д.

Это всего лишь небольшая часть моих данных.

a = [ 0.001 .. 0.011];

b = [1, .. 10];

c = [ -.304860225, .. .379710865]; 

Спасибо заранее.

Ответ 1

Чтобы соответствовать кривой на множестве точек, мы можем использовать регрессию обычных наименьших квадратов. В MathWorks описывается процесс страница решения.

В качестве примера можно начать с некоторых случайных данных:

% some 3d points
data = mvnrnd([0 0 0], [1 -0.5 0.8; -0.5 1.1 0; 0.8 0 1], 50);

Как @BasSwinckels, построив желаемую конструктивную матрицу , вы может использовать mldivide или pinv в решить переопределенную систему, выраженную как Ax=b:

% best-fit plane
C = [data(:,1) data(:,2) ones(size(data,1),1)] \ data(:,3);    % coefficients

% evaluate it on a regular grid covering the domain of the data
[xx,yy] = meshgrid(-3:.5:3, -3:.5:3);
zz = C(1)*xx + C(2)*yy + C(3);

% or expressed using matrix/vector product
%zz = reshape([xx(:) yy(:) ones(numel(xx),1)] * C, size(xx));

Затем мы визуализируем результат:

% plot points and surface
figure('Renderer','opengl')
line(data(:,1), data(:,2), data(:,3), 'LineStyle','none', ...
    'Marker','.', 'MarkerSize',25, 'Color','r')
surface(xx, yy, zz, ...
    'FaceColor','interp', 'EdgeColor','b', 'FaceAlpha',0.2)
grid on; axis tight equal;
view(9,9);
xlabel x; ylabel y; zlabel z;
colormap(cool(64))

1st_order_polynomial


Как уже упоминалось, мы можем получить полиномиальное соответствие более высокого порядка, добавив больше членов к матрице независимых переменных (A в Ax=b).

Скажем, мы хотим поместить квадратичную модель с постоянными, линейными, взаимодействующими и квадратичными членами (1, x, y, xy, x ^ 2, y ^ 2). Мы можем сделать это вручную:

% best-fit quadratic curve
C = [ones(50,1) data(:,1:2) prod(data(:,1:2),2) data(:,1:2).^2] \ data(:,3);
zz = [ones(numel(xx),1) xx(:) yy(:) xx(:).*yy(:) xx(:).^2 yy(:).^2] * C;
zz = reshape(zz, size(xx));

В панели инструментов статистики есть вспомогательная функция x2fx, которая помогает в построении матрицы дизайна для нескольких заказов модели:

C = x2fx(data(:,1:2), 'quadratic') \ data(:,3);
zz = x2fx([xx(:) yy(:)], 'quadratic') * C;
zz = reshape(zz, size(xx));

Наконец, есть отличная функция polyfitn в File Exchange от Джона Д'Эрико, которая позволяет вам указывать все виды полиномов приказы и термины:

model = polyfitn(data(:,1:2), data(:,3), 2);
zz = polyvaln(model, [xx(:) yy(:)]);
zz = reshape(zz, size(xx));

2nd_order_polynomial

Ответ 2

В обмене файлами могут быть некоторые функции, но один из способов сделать это вручную:

x = a(:); %make column vectors
y = b(:);
z = c(:);

%first order fit
M = [ones(size(x)), x, y];
k1 = M\z; 
%least square solution of z = M * k1, so z = k1(1) + k1(2) * x + k1(3) * y

Аналогично, вы можете выполнить второй порядок:

%second order fit
M = [ones(size(x)), x, y, x.^2, x.*y, y.^2];
k2 = M\z;

который, как представляется, имеет числовые проблемы для ограниченного набора данных, который вы дали. Введите help mldivide для более подробной информации.

Чтобы сделать интерполяцию над некоторой регулярной сеткой, вы можете сделать так:

ngrid = 20;
[A,B] = meshgrid(linspace(min(a), max(a), ngrid), ...
                 linspace(min(b), max(b), ngrid));
M = [ones(numel(A),1), A(:), B(:), A(:).^2, A(:).*B(:), B(:).^2];
C2_fit = reshape(M * k2, size(A)); % = k2(1) + k2(2)*A + k2(3)*B + k2(4)*A.^2 + ...

%plot to compare fit with original data
surfl(A,B,C2_fit);shading flat;colormap gray
hold on
plot3(a,b,c, '.r')

Подгонка 3-го порядка может быть выполнена с использованием формулы, приведенной в работе TryHard ниже, но формулы быстро становятся утомительными, когда порядок увеличивается. Лучше написать функцию, которая может построить M, заданную x, y и order, если вам нужно сделать это более одного раза.

Ответ 3

Это звучит скорее как философский вопрос, чем конкретная реализация, в частности, бит - "как найти формулу, которая лучше всего подходит для набора данных?" По моему опыту, это выбор, который вы должны сделать в зависимости от того, чего вы пытаетесь достичь.

Что определяет "лучший" для вас? Для проблемы подгонки данных вы можете продолжать добавлять все больше полиномиальных коэффициентов и улучшать значение R ^ 2... но в конечном итоге "переместиться" с данными. Недостатком многочленов высокого порядка является поведение вне границ выборочных данных, которые вы использовали, чтобы соответствовать вашей поверхности ответа - он может быстро уйти в каком-то диком направлении, что может оказаться неприемлемым для того, что вы пытаетесь моделировать.

Есть ли у вас представление о физическом поведении системы/данных, которые вы соответствуете? Это можно использовать в качестве основы для того, какой набор уравнений использовать для создания математической модели. Моя рекомендация будет заключаться в использовании самой экономичной (простой) модели, с которой вы можете избавиться.