1

给定两个时间段的数据,我想创建一个函数来查找巴斯扩散模型的参数 p 和 q。

模型(方程)如下:

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 文档,我尝试创建一个函数 Bass:

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(@Bass,x0,options) 中使用哪个,但在这种情况下,m、p、q、cummulativeAdoptersBefore(1) 和 cummulativeAdoptersBefore(2) 应该在 x0 中给出,并且所有变量都将被视为未知,而不仅仅是后两者。

有谁知道如何求解上述方程组?

谢谢!

4

1 回答 1

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(乘法而不是总和)。

现在你有了一个函数,它接受的参数比未知数多。一种选择是创建一个匿名函数,它只将未知数作为参数,并通过闭包修复其他参数。为了适应未知数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()看到一个函数只接受一个参数(一个有两个元素的向量),它还返回一个向量值。

于 2012-08-23T16:04:12.680 回答