2012-08-23 76 views
1

我想創建一個函數,給定兩個時間段的數據,找到Bass擴散模型的參數p和q。Matlab:如何求解帶附加參數的非線性方程組?

模型(方程)如下:

n(T) = p*m + (q-p)*n(T-1) + q/m*n(T-1)^2 

其中

n(T) = number of addoptions occuring in period T 
n(T-1) = number of cumulative adoptions that occured before T 
p = coefficient of innovation 
q = coefficient of imitation 
m = number of eventual adopters 

例如如果m = 3.000.000 和用於下面的年中的數據如下:

2000: n(T) = 820, n(T-1) = 0 
2005: n(T) = 25000, n(T-1) = 18000 

然後下面的方程系統必須解決(爲了確定p和q)的值:

p*m + (q-p)*0 + q/3.000.000 * 0^2 == 820 
p*m + (q-p)*18000 + q/3.000.000 * 18000^2 == 25000 

通過以下Matlab documentation我試圖創建一個功能低音:

function F = Bass(m, p, q, cummulativeAdoptersBefore) 

F = [p*m + (q-p)*cummulativeAdoptersBefore(1) + q/m*cummulativeAdoptersBefore(1).^2; 
    p*m + (q-p)*cummulativeAdoptersBefore(2) + q/m*cummulativeAdoptersBefore(2).^2]; 


end 

應在fsolve使用(@巴斯,X0,期權),但在這種情況下, m,p,q,cummulativeAdoptersBefore(1)和cummulativeAdoptersBefore(2)應該在x0中給出,並且所有變量將被視爲未知,而不僅僅是後兩者。

有誰知道如何解決如上面的方程組?

謝謝!

+1

所以......你真的只有1個方程,並且'n(T)'和'n(T-1)'有幾個'T'的數據。糾正我,如果我錯了,但聽起來很像你不去做這個權利。你確定'lsqcurvefit'不適合你的問題嗎? 'fsolve'用於*不同*方程的系統... –

+0

@RodyOldenhuis:你說得對。我會檢查lsqcurvefit。謝謝! –

回答

0

fsolve()尋求儘量減少您提供的參數作爲參數。因此,你必須改變你的等式,

p*m + (q-p)*0  + q/3.000.000 * 0^2  - 820 == 0 
p*m + (q-p)*18000 + q/3.000.000 * 18000^2 - 25000 == 0 

,並在Matlab語法

function F = Bass(m, p, q, cumulativeAdoptersBefore, cumulativeAdoptersAfter) 

    F = [p*m + (q-p)*cumulativeAdoptersBefore(1) ... 
      + q/m *cumulativeAdoptersBefore(1).^2 
      - cumulativeAdoptersAfter(1); 
     p*m + (q-p)*cumulativeAdoptersBefore(2) ... 
      + q/m *cumulativeAdoptersBefore(2).^2 
      - cumulativeAdoptersAfter(2)]; 
end 

注:有一個錯字在你的Bass功能(乘法而不是總和)。

現在你有一個函數,它需要的參數比沒有人知道的要多。 一種選擇是創建一個匿名函數,它只將未知數作爲參數並通過閉包修復其他參數。 爲了適應unkowns pq,你可以使用類似

cumulativeAdoptersBefore = [0, 1800]; 
cumulativeAdoptersAfter = [820, 25000]; 
m = 3e6; 
x = [0, 0]; %# Probably, this is no good starting guess. 
xopt = fsolve(@(x) Bass(m, x(1), x(2), cumulativeAdoptersBefore, cumulativeAdoptersAfter), x0); 

所以fsolve()看到一個函數只取一個參數(有兩個元素的向量),它也返回一個矢量值。

+0

感謝您的錯字! –