function h=implicit_fplot(f, xlims, ylims, options)
% 输入:
% f: 函数句柄 @(x,y)
% xlims: [xmin, xmax]
% ylims: [ymin, ymax]
% options: 结构体或名称-值对,可选参数
% 输出:
% h: 图形句柄
% 默认参数
defaults.N = 300;
defaults.LineWidth = 2;
defaults.LineStyle = '-'; % MATLAB默认蓝实线
defaults.Level = 0; %这个不能改,绘制f(x,y)=0的图像
defaults.Axes = gca;
defaults.Hold = false;
% 合并参数
if nargin < 4
options = struct();
elseif isstruct(options)
% options已经是结构体
else
% 将名称-值对转换为结构体
options = struct(options{:});
end
% 应用默认值
fields = fieldnames(defaults);
for i = 1:length(fields)
if ~isfield(options, fields{i})
options.(fields{i}) = defaults.(fields{i});
end
end
% 获取当前坐标轴
ax = options.Axes;
if ~options.Hold
cla(ax);
hold(ax, 'off');
end
% 创建网格
x = linspace(xlims(1), xlims(2), options.N);
y = linspace(ylims(1), ylims(2), options.N);
[X, Y] = meshgrid(x, y);
% 计算函数值
Z = f(X, Y);
contour( X, Y, Z,[options.Level, options.Level],...
options.LineStyle,...
'LineWidth', options.LineWidth)
% 设置坐标轴
xlim(ax, xlims);
ylim(ax, ylims);
axis(ax, 'equal');
grid(ax, 'on');
box(ax, 'on');
xlabel(ax, 'x');
ylabel(ax, 'y');
% 设置标题
s1=func2str(f);
s1(1:6)=[];
title(strcat(s1,'=0'));
hold(ax, 'on');
end测试
F = @(x,y) x.^2+y.^2-1
options.LineStyle='r--'
implicit_fplot(F, [-1 1], [-1 1],options)
