2014-01-27 11 views
0

我已經嘗試過matlab的曲線擬合,它的效果很好,但是在表面擬合的情況下matlab不考慮第二個自變量。下面是一個複製問題的例子。matlab曲面擬合不按期望工作

function curve_fitting_test() 
x1 = (1:100)'; 
x2 = (1:100)'; 
y = 10.*x1 + 20.*x2 + 30; 
ft = fittype(@(a,b,c,x1,x2)a.*x1 + b.*x2 + c, 'independent', {'x1', 'x2'}); 
cf = fit([x1 x2], y, ft, 'start', [25 25 25], 'Lower', [0 0 0], 'Upper', [50 50 50]) 

這是模型,MATLAB是產生:

General model: 
cf(x1,x2) = a.*x1+b.*x2+c 
Coefficients (with 95% confidence bounds): 
a =   15 (15, 15) 
b =   15 (15, 15) 
c =   30 (30, 30) 
+0

noob問題!對不起,我問:D – Haider

回答

2

的問題是您的輸入:

x1 = (1:100)'; 
x2 = (1:100)'; 
y = 10.*x1 + 20.*x2 + 30; 

y僅計算了的情況下x1 = x2這裏,不是所有的組合。因此,只要a + b = 30可以接受y = 30.*x1 + 30y = 30.*x2 + 30之間的任何內容。您可以通過與配合繪製自己的原始數據(黑點)看到這一點 - MATLAB找到合身是它已被賦予了數據完全可以接受的:

fit surface vs original data

的解決辦法是改變你的數據輸入。例如,只是通過改變x1x2隨機整數1到100之間,與所有其他代碼相同的:

x1 = randi(100,100,1); 
x2 = randi(100,100,1); 

配件後給我:

General model: 
    cf(x1,x2) = a.*x1+b.*x2+c 
    Coefficients (with 95% confidence bounds): 
     a =   10 (10, 10) 
     b =   20 (20, 20) 
     c =   30 (30, 30)