Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB:求解一系列方程以系统地调整概率估计_Matlab - Fatal编程技术网

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) ==

我正在尝试编写一个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) == 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返回空结构时,没有警告意味着没有解决方案,如果有警告,解算器没有找到解决方案,但解决方案存在。你收到警告了吗?