MATLAB:解决一系列方程以系统地调整概率估计

时间:2018-08-21 04:56:23

标签: matlab

我正在尝试编写包含估计概率xy并将其映射到调整后的概率pq上的MATLAB代码。

通常,输入概率xy的总和不等于1,因此代码的重点是调整概率,以使它们的总和等于1。

下面是一个x + y = 1.03

的示例
syms n p q x y
eqn1 = x == 0.7813;
eqn2 = y == 0.2487;
eqn3 = p^n == x;
eqn4 = q^n == y;
eqn5 = log(x)./log(p) == log(y)./log(q);
eqn6 = x^(1/n) == p;
eqn7 = y^(1/n) == q;
eqn8 = p + q == 1;

sol = solve([eqn1, eqn2, eqn3, eqn4, eqn5, eqn6, eqn7, eqn8], [n p q x y])

n同时应用于x和y,它故意具有“压低”低概率估计而不是高概率估计的效果。

我知道,在上面的示例中,答案应该为n≈0.946139, p≈0.7704, q≈0.2297,但无法编写任何可产生此类输出的代码。

上面的代码生成一个空结构。我也尝试过vpasolve,但是也没有用。我不确定我的解决方案是否失败,因为我没有正确指定问题,或者因为我在MATLAB中使用了错误的函数类型。

1 个答案:

答案 0 :(得分:1)

这里的方程式有很多冗余。

eqn6eqn7分别暗示eqn3eqn4。此外,eqn3eqn4暗示eqn5。我们也不需要eqn1eqn2xy定义为常量,因为使用直接替换可以更有效地处理它们。我想这些冗余是MATLAB变得混乱的原因,但我不确定。

此外,由于可能没有封闭式解决方案,因此使用符号工具箱可能会有些矫kill过正,但是如果必须的话,这是一个解决方案。

x = 0.7813;
y = 0.2487;
syms n p q
eqn6 = x^(1/n) == p;
eqn7 = y^(1/n) == q;
eqn8 = p + q == 1;
sol = solve([eqn6, eqn7, eqn8], [p q n]);

p = sol.p
q = sol.q
n = sol.n

结果

Warning: Cannot solve symbolically. Returning a numeric approximation instead. 
> In solve (line 304)
  In q51941792_2 (line 7) 
p = 0.77034051295869623476715256144042
q = 0.22965948704130376523284743855958     
n = 0.94585921162748018347665683036153

请注意,求解器无法找到封闭形式的解决方案,因此默认为数值优化方法。


如果您拥有优化工具箱,则可以改用fsolve,它更合适(且速度更快)。要使用fsolve,您需要定义一个函数,该函数采用一个输入向量并返回一个输出向量。 fsolve的目标是找到导致所有零输出的输入向量。我们重新排列eqn6eqn7eqn8以形成此功能。您可以阅读文档以获取更多信息。

x = 0.7813;
y = 0.2487;

% define optimization function assumes ary = [p, q, n]
f = @(ary) [x^(1/ary(3)) - ary(1); ...   % eqn6
            y^(1/ary(3)) - ary(2); ...   % eqn7
            ary(1) + ary(2) - 1];        % eqn8

% initial estimate
p0 = x;
q0 = y;
n0 = 1;

% solve
fsolve_opts = optimoptions('fsolve', 'OptimalityTolerance', 0, 'FunctionTolerance', 1e-12);
sol = fsolve(f, [p0; q0; n0], fsolve_opts);

p = sol(1)
q = sol(2)
n = sol(3)

结果

p = 0.770340512958696
q = 0.229659487041304
n = 0.945859211627480

解决方案的存在

在某些情况下,没有解决方案。例如,如果x > 1y > 0 & y < 1pq均为正,但其中一个大于1(取决于n的值),但是这与eqn8矛盾,因此不存在解决方案。如果要使用此方法,则需要确保存在解决方案。我相信有一个充分的条件是xy都在0到1之间,尽管我还没有证明。