2013-08-31 41 views
12

Tôi có lưới thường xuyên rời rạc của a,b điểm và giá trị c tương ứng của chúng và tôi nội suy thêm để có được đường cong trơn tru. Bây giờ từ dữ liệu nội suy, tôi tiếp tục muốn tạo một phương trình đa thức để lắp đường cong. Làm thế nào để phù hợp với cốt truyện 3D trong đa thức?3D curvefitting

Tôi cố gắng thực hiện việc này trong MATLAB. Tôi đã sử dụng hộp công cụ Surface fitting trong MATLAB (r2010a) để phù hợp với đường cong dữ liệu 3 chiều. Nhưng, làm thế nào để tìm một công thức phù hợp với một bộ dữ liệu với lợi thế tốt nhất trong MATLAB/MAPLE hoặc bất kỳ phần mềm nào khác. Lời khuyên nào? Ngoài ra hữu ích nhất sẽ là một số ví dụ mã thực để xem xét, các tệp PDF, trên web, v.v.

Đây chỉ là một phần nhỏ dữ liệu của tôi.

a = [ 0.001 .. 0.011]; 

b = [1, .. 10]; 

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

Xin cảm ơn trước.

Trả lời

15

Để vừa với đường cong lên một tập hợp các điểm, chúng tôi có thể sử dụng hồi quy ordinary least-squares. Có một solution page bởi MathWorks mô tả quy trình.

Như một ví dụ, chúng ta hãy bắt đầu với một số dữ liệu ngẫu nhiên:

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

Như @BasSwinckels cho thấy, bằng cách xây dựng những mong muốn design matrix, bạn có thể sử dụng mldivide hay pinv-solve the overdetermined system thể hiện dưới dạng 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)); 

Tiếp theo, chúng tôi hình dung kết quả:

% 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


Như đã đề cập, chúng ta có thể có được bậc cao phù hợp đa thức bằng cách thêm về hơn với ma trận biến độc lập (các A trong Ax=b).

Giả sử chúng tôi muốn phù hợp với mô hình bậc hai với các thuật ngữ không đổi, tuyến tính, tương tác và bình phương (1, x, y, xy, x^2, y^2). Chúng ta có thể làm điều này bằng tay:

% 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)); 

Ngoài ra còn có một hàm helper x2fx trong kê Toolbox giúp trong việc xây dựng ma trận thiết kế cho một vài đơn đặt hàng mô hình:

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

Cuối cùng có một tuyệt vời chức năng polyfitn trên Trao đổi tệp của John D'Errico cho phép bạn chỉ định tất cả các loại đơn đặt hàng đa thức và các điều khoản có liên quan:

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

2nd_order_polynomial

+0

Làm thế nào tôi có thể thực hiện cùng một loại hoạt động trong python ..!? Trợ giúp bit sẽ được đánh giá cao ... @Amro – diffracteD

+2

@diffracteD: Tôi đã dịch mã sang Python: https://gist.github.com/amroamroamro/1db8d69b4b65e8bc66a6 – Amro

+0

Cảm ơn sự giúp đỡ của bạn ... tôi chắc chắn sẽ thử nó .. ! – diffracteD

3

Có thể có một số chức năng tốt hơn trên các tập tin trao đổi, nhưng có một cách để làm điều đó bằng tay là thế này:

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 

Tương tự như vậy, bạn có thể làm một sự phù hợp theo thứ tự thứ hai:

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

dường như có vấn đề về số cho tập dữ liệu hạn chế mà bạn đã cung cấp. Nhập help mldivide để biết thêm chi tiết.

Để thực hiện nội suy qua một số lưới điện thường xuyên, bạn có thể làm như vậy:

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') 

Một thứ 3 theo đơn đặt hàng phù hợp có thể được thực hiện bằng cách sử dụng công thức do TryHard dưới đây, nhưng các công thức một cách nhanh chóng trở nên tẻ nhạt khi thứ tự tăng lên. Tốt hơn hãy viết một hàm có thể xây dựng M cho x, yorder nếu bạn phải làm điều đó nhiều lần.

+1

+1 - thứ tự thứ ba phù hợp với 'M = [đơn vị (kích thước (x)), x, y, x.^2, x. * Y, y.^2, x.^3, x^2. * y, x. * Y.^2, y.^3] 'làm một công việc khá tốt ... –

+0

Xin lỗi vì đã trả lời muộn! Cảm ơn bạn đã trả lời Bas Swinckels và cố gắng hết sức. Giải pháp tốt. Nhưng, liệu có phương pháp nào để tìm ra công thức/phương trình phù hợp nhất thông qua mã hay bằng cách sử dụng bất kỳ công cụ nào trong MATLAB? Làm cách nào để tìm một công thức phù hợp nhất với bộ dữ liệu đã cho? – Syeda

+0

Tôi cũng nhận được cảnh báo này. Cảnh báo: Xếp hạng thiếu, rank = 5, tol = 9,9961e-013. Bạn có thể vui lòng giúp tôi hiểu ý nghĩa của điều này không? Cảm ơn bạn. – Syeda

2

Điều này nghe có vẻ giống một câu hỏi triết học hơn là triển khai cụ thể, cụ thể là bit - "làm cách nào để tìm một công thức phù hợp với tập hợp dữ liệu với lợi thế tốt nhất?" Theo kinh nghiệm của tôi, đó là lựa chọn bạn phải tùy thuộc vào những gì bạn đang cố gắng đạt được.

Điều gì xác định "tốt nhất" cho bạn? Đối với một vấn đề dữ liệu phù hợp, bạn có thể tiếp tục bổ sung thêm nhiều hệ số đa thức và tạo ra giá trị R^2 tốt hơn ... nhưng cuối cùng sẽ "vượt quá" dữ liệu. Một nhược điểm của đa thức bậc cao là hành vi bên ngoài giới hạn của dữ liệu mẫu mà bạn đã sử dụng để phù hợp với bề mặt phản hồi của bạn - nó có thể nhanh chóng đi theo một hướng hoang dã mà có thể không phù hợp với bất cứ điều gì bạn đang cố gắng mô hình hóa .

Bạn có hiểu biết sâu sắc về hành vi thể chất của hệ thống/dữ liệu bạn đang phù hợp không? Điều đó có thể được sử dụng làm cơ sở cho những gì thiết lập các phương trình để sử dụng để tạo ra một mô hình toán học. Đề xuất của tôi sẽ là sử dụng mô hình kinh tế (đơn giản) nhất mà bạn có thể nhận được.