我正在尝试编写包含估计概率x
和y
并将其映射到调整后的概率p
和q
上的MATLAB代码。
通常,输入概率x
和y
的总和不等于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中使用了错误的函数类型。
答案 0 :(得分:1)
这里的方程式有很多冗余。
eqn6
和eqn7
分别暗示eqn3
和eqn4
。此外,eqn3
和eqn4
暗示eqn5
。我们也不需要eqn1
和eqn2
将x
和y
定义为常量,因为使用直接替换可以更有效地处理它们。我想这些冗余是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
的目标是找到导致所有零输出的输入向量。我们重新排列eqn6
,eqn7
和eqn8
以形成此功能。您可以阅读文档以获取更多信息。
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 > 1
和y > 0 & y < 1
则p
和q
均为正,但其中一个大于1(取决于n
的值),但是这与eqn8
矛盾,因此不存在解决方案。如果要使用此方法,则需要确保存在解决方案。我相信有一个充分的条件是x
和y
都在0到1之间,尽管我还没有证明。