我在Matlab中有一个非线性方程组,我想找到它的解集。该系统如下所示。
想象一下,Matlab函数solve
可以与clear
%SOME VALUES USED BELOW
U1true=1;
U2true=-1;
U3true=-2;
U4true=1;
rhotrue=-0.5;
mutrue=[0 0];
sigmatrue=[2*(1-rhotrue) 1-rhotrue; 1-rhotrue 2*(1-rhotrue)];
%SET VARIABLES
syms U1 U2 U3 U4 rho
%SOLVE SYSTEM WITH 6 EQUATIONS
S=solve(mvncdf([ U1 -U2+U1], [0 0], [2*(1-rho) 1-rho; 1-rho 2*(1-rho)])==mvncdf([ U1true -U2true+U1true], mutrue, sigmatrue) ,...
mvncdf([ U2 U2-U1], [0 0], [2*(1-rho) 1-rho; 1-rho 2*(1-rho)])==mvncdf([ U2true U2true-U1true], mutrue, sigmatrue),...
mvncdf([-U1 -U2], [0 0], [2*(1-rho) 1-rho; 1-rho 2*(1-rho)])==mvncdf([-U1true -U2true], mutrue, sigmatrue),...
mvncdf([ U3 -U4+U3], [0 0], [2*(1-rho) 1-rho; 1-rho 2*(1-rho)])==mvncdf([ U3true -U4true+U3true], mutrue, sigmatrue) ,...
mvncdf([ U4 U4-U3], [0 0], [2*(1-rho) 1-rho; 1-rho 2*(1-rho)])==mvncdf([ U4true U4true-U3true], mutrue, sigmatrue),...
mvncdf([-U3 -U4], [0 0], [2*(1-rho) 1-rho; 1-rho 2*(1-rho)])==mvncdf([-U3true -U4true], mutrue, sigmatrue));
%DISPLAY SOLUTIONS
M=[S.U1,S.U2,S.U3,S.U4, S.rho];
一起使用。我的方程组看起来像这样
mvncdf
这种方法显然不能用于多种原因,最重要的是因为solve
不能与slicesample
一起使用,例如here所述。
作为解决我的系统的另一种方法,我考虑使用%MAIN
clear
rng default
Utrue=[1;-1;-2;1];
rhotrue=-0.5;
number = 100000;
initials=[Utrue;rhotrue]; %[U1;U2;U3;U4;rho]
rnd = slicesample(initials,number,'pdf',@dens);
%ANCILLARY FUNCTIONS TO SAVE
function density=dens(param)
T=10^(-6);
if param(end)>=1 || param(end)<=-1 %rho outside (-1,1)
density=0; %force density to be equal to zero
else
Utrue=[1;-1;-2;1];
rhotrue=-0.5;
mutrue=[0 0];
sigmatrue=[2*(1-rhotrue) 1-rhotrue; 1-rhotrue 2*(1-rhotrue)];
truth=mvncdf([ Utrue(1) -Utrue(2)+Utrue(1);...
Utrue(2) Utrue(2)-Utrue(1);...
-Utrue(1) -Utrue(2) ;...
Utrue(3) -Utrue(4)+Utrue(3);...
Utrue(4) Utrue(4)-Utrue(3);...
-Utrue(3) -Utrue(4)], mutrue, sigmatrue);
density=exp(-criterion(param,truth)/T);
end
end
function Q=criterion(param, truth)
U=param(1:end-1);
rho=param(end);
mu=[0,0];
sigma=[2*(1-rho) 1-rho; 1-rho 2*(1-rho)];
candidates=mvncdf([ U(1) -U(2)+U(1);...
U(2) U(2)-U(1);...
-U(1) -U(2) ;...
U(3) -U(4)+U(3);...
U(4) U(4)-U(3);...
-U(3) -U(4)], mu, sigma);
Q=(candidates(1)-truth(1))^2+(candidates(2)-truth(2))^2+(candidates(3)-truth(3))^2+...
(candidates(4)-truth(4))^2+(candidates(5)-truth(5))^2+(candidates(6)-truth(6))^2; %this is zero at a solution of the system
end
如下
此代码实现了我的想法。
number
问题:使用我建议的方法,当我增加变量rho
时,我得到越来越多的rho
不同值的解决方案,这符合上面评论说,对于(-1,1)
的每个值,系统只有一个且相对于U的解决方案。但是,为了涵盖rho
的整个number
间隔,在我看来,我需要将变量{{1}}设置得非常高。您是否有(i)可以帮助我改进上述代码以解决此问题的建议,或者(ii)提供我的方程组解决方案的更好方法?