我在数学作品上也问过它,但仍然没有任何回复,所以周围的人会帮助我。
我有三个变量的两个隐含函数。我在Matlab中使用fimplicit3绘制了两个曲面(它出现在R2016b matlab中)。然后我想要将它们相交并可视化结果。我该怎么做?有人可以帮忙吗?
例如
f = @(x,y,z) x.^2 - y^3 + z^2 - 4;
fimplicit3(f);
grid on; hold on;
f = @(x,y,z) x.^4 + y.^3 - 0.005.*z.^2 + 0.3.*cos(x) + exp(y) + 2.3.*exp(z);
fimplicit3(f);
答案 0 :(得分:1)
可以使用case 1 of this mathworks post将您的问题以数字方式转换为fsolve。
% 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);
额外说明
我创建了一个xz网格,而不是xy网格,因为f1不是xy平面中的函数,即(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
从零开始卡住。
选择meshgrid平面:搜索解决方案唯一的平面,因为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);