我正在使用Matlab的fsolve
求解一组非线性联立方程,以找到未知参数x1
和x2
。联立方程有两个独立的参数a
和b
,如root2d
函数所定义:
function F = root2d(x,a,b)
F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(a+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - b;
end
我使用以下代码来求解联立方程,并使用pcolor
将结果绘制为二维图。
alist = linspace(0.6,1.2,10);
blist = linspace(0.4,0.8,5);
% results
x1list = zeros(length(blist),length(alist));
x2list = zeros(length(blist),length(alist));
% solver options
options = optimoptions('fsolve','Display','None');
for ii = 1:length(blist)
b = blist(ii);
for jj = 1:length(alist)
a = alist(jj);
x0 = [0 0]; % init guess
[xopt,yopt,exitflag] = fsolve(@(x0)root2d(x0,a,b),x0,options);
% optimised values
x1list(ii,jj) = xopt(1);
x2list(ii,jj) = xopt(2);
success(ii,jj) = exitflag; % did solver succeed?
end
end
% plotting
figure
s = pcolor(alist(success>0),blist(success>0),x1list(success>0));
xlabel('a')
ylabel('b')
title('my data x_1')
figure
s = pcolor(alist(success>0),blist(success>0),x2list(success>0));
xlabel('a')
ylabel('b')
title('my data x_2')
然而,我只想绘制x1
和x2
,其中解算器已成功收敛到解。这是success
矩阵元素(或exitflag
(具有大于0的值的地方。通常,当使用plot
函数时,您只需编写x1list(success>0)
,Matlab省略了(success<=0)
的任何解决方案,但pcolor
没有该功能。
有办法绕过这个吗?例如,将所有(success<=0)
解决方案显示为黑色区域。
是的!
最简单的方法是使它们成为NaN
,这样它们就不会被绘制。
只做
x1list(~success)=NaN;
pcolor(alist,blist,x1list)