2013-07-01 26 views
6

Tôi có dữ liệu mà tôi nên suy với một chức năng mà phải có các loại sau:Đa thức phù hợp matlab với một số khó khăn về các hệ số

f(x) = ax4 + bx2 + c

với a > 0b ≤ 0. Thật không may, polyfit của MATLAB không cho phép bất kỳ ràng buộc nào đối với các hệ số của đa thức. Có ai biết nếu có một chức năng MATLAB để làm điều này? Nếu không, làm thế nào tôi có thể thực hiện nó?

Cảm ơn bạn rất nhiều trước,

Elisabetta

+0

tại sao 'a> 0' và không phải' a> = 0'? giả sử kết quả tối ưu hóa của bạn với 'a = 0', sau đó đặt nó thành' a = \ epsilon' sẽ thay đổi rất ít ... – Shai

+0

Có, bạn nói đúng, tôi đã nói a> 0 chỉ vì dữ liệu của tôi không bao giờ "hoạt động" như một hàm có đóng là 0, nhưng tôi không nhất thiết phải đặt nó là một ràng buộc – bettaberg

+0

@bettaberg: Tôi vẫn còn lo lắng khi biết những ràng buộc đó đến từ đâu ...? Bạn đang cố gắng mô hình hóa gì và tại sao các ràng buộc trên các tham số? –

Trả lời

11

Bạn có thể thử sử dụng fminsearch, fminunc xác định hàm mục tiêu của bạn bằng tay.

Ngoài ra, bạn có thể xác định vấn đề của bạn hơi khác nhau:

f(x) = a2x4 - b2x2 + c

Bây giờ, mới ab có thể được tối ưu hóa cho mà không hạn chế, đồng thời đảm bảo rằng trận chung kết ab bạn đang tìm kiếm là dương (resp âm).

+4

+1 cho đề xuất chuyển đổi, tốt –

7

Nếu không có trở ngại, vấn đề có thể được viết và giải quyết như một hệ thống tuyến tính đơn giản:

% Your design matrix ([4 2 0] are the powers of the polynomial) 
A = bsxfun(@power, your_X_data(:), [4 2 0]); 

% Best estimate for the coefficients, [a b c], found by 
% solving A*[a b c]' = y in a least-squares sense 
abc = A\your_Y_data(:) 

Những hạn chế của khóa học sẽ tự động được hài lòng iff rằng hạn chế mô hình thực sự là nền tảng dữ liệu của bạn. Ví dụ,

% some example factors 
a = +23.9; 
b = -15.75; 
c = 4; 

% Your model 
f = @(x, F) F(1)*x.^4 + F(2)*x.^2 + F(3); 

% generate some noisy XY data 
x = -1:0.01:1; 
y = f(x, [a b c]) + randn(size(x)); 

% Best unconstrained estimate a, b and c from the data 
A = bsxfun(@power, x(:), [4 2 0]); 
abc = A\y(:); 

% Plot results 
plot(x,y, 'b'), hold on 
plot(x, f(x, abc), 'r') 
xlabel('x (nodes)'), ylabel('y (data)') 

enter image description here

Tuy nhiên, nếu bạn áp đặt những hạn chế trên dữ liệu đó là không được mô tả một cách chính xác bởi rằng mô hình hạn chế, mọi thứ có thể đi sai:

% Note: same data, but flipped signs 
a = -23.9; 
b = +15.75; 
c = 4; 

f = @(x, F) F(1)*x.^4 + F(2)*x.^2 + F(3); 

% generate some noisy XY data 
x = -1:0.01:1; 
y = f(x, [a b c]) + randn(size(x)); 

% Estimate a, b and c from the data, Forcing a>0 and b<0 
abc = fmincon(@(Y) sum((f(x,Y)-y).^2), [0 0 0], [-1 0 0; 0 +1 0; 0 0 0], zeros(3,1)); 

% Plot results 
plot(x,y, 'b'), hold on 
plot(x, f(x, abc), 'r') 
xlabel('x (nodes)'), ylabel('y (data)') 

enter image description here

(giải pháp này có a == 0, chỉ dẫn của một i ncorrect model choice).

Nếu sự bình đẳng chính xác của a == 0 là một vấn đề: tất nhiên là không có sự khác biệt nếu bạn đặt a == eps(0). Về mặt số lượng, điều này sẽ không đáng chú ý đối với dữ liệu trong thế giới thực, nhưng dù sao nó cũng không phải là nonzero.

Dù sao, tôi nghi ngờ rằng mô hình của bạn không được chọn tốt và các ràng buộc là "khắc phục" để mọi thứ hoạt động hoặc dữ liệu của bạn thực sự không bị phân biệt/rescaled trước khi cố gắng làm cho phù hợp hoặc các điều kiện tiên quyết tương tự được áp dụng (tôi thường thấy mọi người làm điều này, vì vậy vâng, tôi hơi thiên vị về khía cạnh này :).

Vậy ... những lý do thực sự đằng sau những hạn chế đó là gì?

+0

đó là một chút ngây thơ để nói "kể từ khi chúng tôi giả định mô hình này, các ràng buộc nên được tự động hài lòng bởi các dữ liệu" ... – Shai

+0

@Shai: nơi chính xác tôi đã nói rằng? Có một *** khá rõ ràng NẾU *** ở đó ... –

+0

Tôi có lẽ nên lặp lại nhận xét của tôi một cách khác nhau, nhưng vấn đề là: nếu bạn có những ràng buộc về các tham số của bạn, bạn nên sử dụng chúng và không hy vọng rằng chúng sẽ là một phép lạ hài lòng ... – Shai

3

Nếu bạn có hộp công cụ phù hợp với đường cong thì fit không cho phép đặt ràng buộc bằng cách sử dụng tùy chọn 'phía trên' và 'thấp hơn'. Bạn sẽ muốn một cái gì đó như thế.

M=fit(x, f, 'poly4', 'upper', [-inf, 0, -inf, 0, -inf], 'lower', [0, 0, 0, 0, -inf]); 

Lưu ý sử dụng -inf để đặt hệ số cụ thể không bị giới hạn.

Điều này sẽ cung cấp cho đối tượng cfit với các hệ số có liên quan. Bạn có thể truy cập chúng bằng cách sử dụng ví dụ M.p1 cho cụm từ x^4. Ngoài ra, bạn có thể đánh giá hàm tại bất kỳ điểm nào bạn muốn sử dụng feval.

Tôi nghĩ bạn có thể làm một điều tương tự bằng cách sử dụng lsqcurvefit trong hộp công cụ tối ưu hóa.

+0

Đây là cách nhanh nhất và đơn giản nhất để làm điều đó – Kvothe

Các vấn đề liên quan