MATLAB:求解一系列方程以系统地调整概率估计
我正在尝试编写一个MATLAB代码,它将估计的概率MATLAB:求解一系列方程以系统地调整概率估计,matlab,Matlab,我正在尝试编写一个MATLAB代码,它将估计的概率x和y映射到一组调整后的概率p和q 通常输入概率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) ==
x
和y
映射到一组调整后的概率p
和q
通常输入概率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中使用了错误的函数类型。这里的方程中有很多冗余
eqn6
和eqn7
分别表示eqn3
和eqn4
。此外,eqn3
和eqn4
意味着eqn5
。我们也不需要eqn1
和eqn2
,它们将x
和y
定义为常量,因为使用直接替换可以更有效地处理这些常量。我想这些冗余是MATLAB变得混乱的原因,但我不太确定
另外,使用符号工具箱可能有点过分,因为可能没有封闭形式的解决方案,但如果必须的话,这里有一个解决方案
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
p = 0.770340512958696
q = 0.229659487041304
n = 0.945859211627480
请注意,解算器无法找到闭合形式的解,因此它默认为数值优化方法
如果您有优化工具箱,那么您可以使用更合适(更快)的工具箱。要使用
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)
结果:
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
p = 0.770340512958696
q = 0.229659487041304
n = 0.945859211627480
解的存在性
有些情况下不存在解决方案。例如,如果
x>1
和y>0&y<1
则p
和q
均为正,但其中一个大于1(取决于n
的值),但这与eqn8
相矛盾,因此不存在解决方案。如果你想使用这种方法,你需要有一个解决方案存在的保证。我相信一个充分条件是x
和y
都在0和1之间,尽管我还没有证明它。当solve返回空结构时,没有警告意味着没有解决方案,如果有警告,解算器没有找到解决方案,但解决方案存在。你收到警告了吗?