摘要
Made by myself with MATLAB
许可协议
Public domainPublic domainfalsefalse
|
|
我,本作品著作权人,释出本作品至公有领域。这适用于全世界。 在一些国家这可能不合法;如果是这样的话,那么: 我无条件地授予任何人以任何目的使用本作品的权利,除非这些条件是法律规定所必需的。
|
Source code
function main()
% prepare the scrreen and define some parameters
clf; hold on; axis equal; axis off;
fontsize=25; thick_line=3; thin_line=2; black=[0, 0, 0]; red=[1, 0, 0];
arrowsize=0.1; arrow_type=1; arrow_angle=30; % (angle in degrees)
L=1.15;
X=(-L):0.01:(L);
f=inline('2*(X.^4-X.^2+1)-1.3');
Y=f(X);
plot(X, Y, 'linewidth', thick_line)
arrow([X(1) 0], [X(length(X)), 0], thin_line, arrowsize, arrow_angle, arrow_type, black)
arrow([0 min(Y)-0.4], [0 max(Y)+0.2], thin_line, arrowsize, arrow_angle, arrow_type, black)
a=0.5; Z=X*0+a;
plot(X, Z, 'linewidth', thin_line, 'linestyle', '--', 'color', 'r');
x0=-10;
for i=2:(length(X)-1)
x=X(i); xp=X(i-1);
if x < 0 & f(x) < a & f(xp) >= a
x0=x;
elseif x < 0 & f(x) >= a & f(xp) < a
x1=x;
elseif x > 0 & f(x) <= a & f(xp) > a
x2=x;
elseif x > 0 & f(x) >= a & f(xp) < a
x3=x;
end
end
plot([x0, x1], [0, 0], 'linewidth', 2*thick_line, 'color', 'r');
plot([x2, x3], [0, 0], 'linewidth', 2*thick_line, 'color', 'r');
saveas(gcf, 'Nonquasiconvex_function.eps', 'psc2') % export to eps
function arrow(start, stop, thickness, arrow_size, sharpness, arrow_type, color)
% Function arguments:
% start, stop: start and end coordinates of arrow, vectors of size 2
% thickness: thickness of arrow stick
% arrow_size: the size of the two sides of the angle in this picture ->
% sharpness: angle between the arrow stick and arrow side, in degrees
% arrow_type: 1 for filled arrow, otherwise the arrow will be just two segments
% color: arrow color, a vector of length three with values in [0, 1]
% convert to complex numbers
i=sqrt(-1);
start=start(1)+i*start(2); stop=stop(1)+i*stop(2);
rotate_angle=exp(i*pi*sharpness/180);
% points making up the arrow tip (besides the "stop" point)
point1 = stop - (arrow_size*rotate_angle)*(stop-start)/abs(stop-start);
point2 = stop - (arrow_size/rotate_angle)*(stop-start)/abs(stop-start);
if arrow_type==1 % filled arrow
% plot the stick, but not till the end, looks bad
t=0.5*arrow_size*cos(pi*sharpness/180)/abs(stop-start); stop1=t*start+(1-t)*stop;
plot(real([start, stop1]), imag([start, stop1]), 'LineWidth', thickness, 'Color', color);
% fill the arrow
H=fill(real([stop, point1, point2]), imag([stop, point1, point2]), color);
set(H, 'EdgeColor', 'none')
else % two-segment arrow
plot(real([start, stop]), imag([start, stop]), 'LineWidth', thickness, 'Color', color);
plot(real([stop, point1]), imag([stop, point1]), 'LineWidth', thickness, 'Color', color);
plot(real([stop, point2]), imag([stop, point2]), 'LineWidth', thickness, 'Color', color);
end
|
|