这里的方程有很多冗余。
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
请注意,解算器找不到闭合形式的解,因此它默认为数值优化方法。
如果您有优化工具箱,那么可以使用
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之间,尽管我还没有证明。