matlab解隐函数相交线
关于隐函数相交线问题我们数模队友问下了, 话说他每天弄他们校创飞机的事情搞笑的= =.进入正题, 关于两函数相交线, 我们只需要找到同时满足两函数方程的xyz即可
matlab中对于3d绘图有isosurface还有alphashape, boundary, trisurf, convhull, surf等, 每个函数各自实现的方法和效果都不太一样, 这里用isosurface进行一个说明, 其传入参数需要为一个3维数组, 绘制的结果为其中为0的值, 也就是满足函数关系等于0的值, 这里举个例子说明
对与球体$$x^{2}+y^{2}+z^{2}=1$$与隐函数$$x \times (y-1)+y \times sin(x+3 \times z)+z \times x^{2} = 0$$
既我们需要如下的一个图形相交线,下面的图用isosurface进行绘制.
代码如下
[x,y,z] = meshgrid(-2:.01:2);
f1 = x.^2+y.^2+z.^2-1;
f2 = x.*(y-1)+y.*sin(x+3*z)+z.*x.^2;
isosurface(x,y,z,f1,0.03)
isosurface(x,y,z,f2,0.03)
而我们需要去掉外部的图形进行观察, 同样可以用isosurface进行绘制, 这里对patch进行了一个处理使得结果可视度高一点.
相交线绘制代码如下
[x,y,z] = meshgrid(-1:.01:1);
f1 = x.^2+y.^2+z.^2-1;
f2 = x.*(y-1)+y.*sin(x+3*z)+z.*x.^2;
isosurface(x,y,z,abs(f1)+abs(f2),0.03)
axis image,view(34,29)
fv1 = reducepatch(isosurface(x,y,z,f1,0),0.005);
fv2 = reducepatch(isosurface(x,y,z,f2,0),0.005);
set(patch(fv1),'facecolor','none','edgealpha',0.2)
set(patch(fv2),'facecolor','none','edgealpha',0.2)
结果如下
可以看到相交线为一封闭曲线
话说之前一直觉得用matlab很low, 代码太底层, 现在发现确实实现一些想法的简单protype实现用matlab确实比mathematica在某些方面要简单一些, 主要原因我想还是因为mathematica的函数封装太高层了, 内部实现的细节没有暴露出来, 导致想要进行一些想法测试的时候由于没有实用的原型函数使得原型构造上比较困难.
比如我这几次用来数值求解结果时候的差分等运算, 用mathematica在函数与循环构造上虽然可以进行, 但是得画较大的功夫在构造函数这一块, 这就有点得不偿失了, 毕竟我还是需要快点把结果跑出来对结果进行验证, 没有太多的功夫进行一些思维上的转换, 用mathematica上的函数思想进行编写, 确实比较麻烦.