您可以使用fsolve 将您的问题以数字形式转换为case 1 of this mathworks post。
% definition & plotting of the implicit function
f1 = @(x,y,z) x.^2 - y.^3 + z.^2 - 4;
H1 = fimplicit3(f1);
grid on; hold on;
f2 = @(x,y,z) x.^4 + y.^3 - 0.005.*z.^2 + 0.3.*cos(x) + exp(y) + 2.3.*exp(z);
H2 = fimplicit3(f2);
% solve both function for a desired meshgrid
[x, z] = meshgrid(linspace(-2, 2, 20), linspace(-2, 2, 20));
y1 = fsolve(@(y) f1(x, y, z), -2*ones(size(x)));
y2 = fsolve(@(y) f2(x, y, z), zeros(size(x)));
% apply case 1 of the mathworks post
ydiff = y1 - y2;
C = contours(x, z, ydiff, [0 0]);
xL = C(1, 2:end);
zL = C(2, 2:end);
yL = interp2(x, z, y1, xL, zL);
line(xL, yL, zL, 'Color', 'r', 'LineWidth', 3);
补充说明
我创建了一个 x-z 网格,而不是 x-y 网格,因为 f1 不是 x-y 平面中的函数,即一个 (x, y) 点对应于多个 z 值,事实并非如此对于 (x, z) 点。
请注意,改为实现案例 2 可能会有好处,因为这样您只需将 fsolve 应用于其中一个隐式函数。
我转换了f1 以允许矢量化评估,即使用.^ 而不是^。
y1 = fsolve(@(y) f1(x, y, z), -2*ones(size(x)));:对 (x, z) 的每个给定组合求解函数 f1 == 0 到 y,每个 (x, z) 点的初始猜测值相同,均为 -2。
初始猜测的选择:查看绘制的图表,估计一个好的起始值。如果fsolve 没有找到解决方案,请尝试更好/其他的起始值。 f1 由于该点处的平坦区域而从零开始卡住。
网格平面的选择:搜索解唯一的平面,因为fsolve 只会返回一个值。
老问题(f1略有不同)
对于您的具体问题,最好的方法是将您的问题转换为case 1 of this mathworks post。第一个函数可以明确表示:z = x.^2 - y
一般来说,可以使用如下数值求解器评估特定网格 (x, y) 的每个隐式函数:
% definition & plotting of the implicit function
f1 = @(x,y,z) x.^2 - y + z;
H1 = fimplicit3(f1);
grid on; hold on;
f2 = @(x,y,z) x.^4 + y.^3 - 0.005.*z.^2 + 0.3.*cos(x) + exp(y) + 2.3.*exp(z);
H2 = fimplicit3(f2);
% solve both function for a desired meshgrid
[x, y] = meshgrid(linspace(-4, 4, 40), linspace(-5, 0, 40));
z1 = fsolve(@(z) f1(x, y, z), zeros(size(x)));
z2 = fsolve(@(z) f2(x, y, z), zeros(size(x)));
% apply case 1 of the mathworks post
zdiff = z1 - z2;
C = contours(x, y, zdiff, [0 0]);
xL = C(1, 2:end);
yL = C(2, 2:end);
zL = interp2(x, y, z1, xL, yL);
is = zL > H2.ZRange(1);
line(xL(is), yL(is), zL(is), 'Color', 'r', 'LineWidth', 3);