Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plotting the implicit function x+y - log(x) - log(y) -2 = 0 on MATLAB

Tags:

graph

plot

matlab

I wanted to plot the above function on Matlab so I used the following code

ezplot('-log(x)-log(y)+x+y-2',[-10 10 -10 10]);

However I'm just getting a blank screen. But clearly there is at least the point (1,1) that satisfies the equation. I don't think there is a problem with the plotter settings, as I'm getting graphs for functions like

ezplot('-log(y)+x+y-2',[-10 10 -10 10]); 

I don't have enough rep to embed pictures :)

like image 584
DDDAD Avatar asked Feb 06 '17 20:02

DDDAD


1 Answers

If we use solve on your function, we can see that there are two points where your function is equal to zero. These points are at (1, 1) and (0.3203 + 1.3354i, pi)

syms x y
result = solve(-log(x)-log(y)+x+y-2, x, y);

result.x
% -wrightOmega(log(1/pi) - 2 + pi*(1 - 1i))
%                                         1

result.y
%   pi
%    1

If we look closely at your function, we can see that the values are actually complex

[x,y] = meshgrid(-10:0.01:10, -10:0.01:10);
values = -log(x)-log(y)+x+y-2;

whos values
%  Name           Size                 Bytes  Class     Attributes
%  values      2001x2001            64064016  double    complex

It seems as though in older versions of MATLAB, ezplot handled complex functions by only considering the real component of the data. As such, this would yield the following plot

enter image description here

However, newer versions consider the magnitude of the data and the zeros will only occur when both the real and imaginary components are zero. Of the two points where this is true, only one of these points is real and is able to be plotted; however, the relatively coarse sampling of ezplot isn't able to display that single point.

You could use contourc to determine the location of this point

imagesc(abs(values), 'XData', [-10 10], 'YData', [-10 10]);
axis equal
hold on

cmat = contourc(abs(values), [0 0]);
xvalues = xx(1, cmat(1,2:end));
yvalues = yy(cmat(2,2:end), 1);

plot(xvalues, yvalues, 'r*')

enter image description here

like image 172
Suever Avatar answered Sep 22 '22 01:09

Suever