画空间曲线,出现很多噪点把曲线掩盖;以及X轴如何显示指数刻度
mathematica吧
全部回复
仅看楼主
level 2
熙__曦 楼主
想画两个空间曲面的交线(两个三元高次隐函数),选择隐藏曲面,结果却出现曲面上有很多噪点,反而把曲线掩盖了,用过版本10和版本12都有噪点,请问该怎么解决?以及X轴如何显示指数刻度,用ScalingFunctions -> {"Log", None, None}没效果。求帮忙,谢谢!
指令代码如下:
r = -\[Alpha]^-1 + 0.5 \[Alpha]^-3 + 3.87 \[Alpha]^-6 +
4.95 ((1 - p Piecewise[{{Z, Z <= 1}, {1, Z >= 1}}])/\[Alpha]^3 -
0.000054 Z);
r1 = p/(1 - p)^50 -
50*(0.0852 Z/\[Alpha]^3)^49 Exp[50 (-Log[0.00062] - 1)];
a1 = ContourPlot3D[{r == 0, r1 == 0}, {Z, 0.01, 10}, {p, 0,
1}, {\[Alpha], 1.2, 2.5},
MeshFunctions -> {Function[{Z, p, \[Alpha]}, r - r1]},
MeshStyle -> {{Thick, Black}}, Mesh -> {{0}},
ContourStyle -> {None}, PlotStyle -> None, BoundaryStyle -> None,
ScalingFunctions -> {"Log", None, None},
AxesLabel -> {Z, p, \[Alpha]}];
A = Show[a1]
2019年08月29日 01点08分 1
吧务
level 15
r1数值太极端了,目测够呛。(过于极端的数值导致Plot系函数效果不佳的例子还是有一些的。)ScalingFunctions也是一个比较年轻的选项,不是第一次被人发现行为不对劲了,具体可在Stackexchange搜索。通过适当的变形使r1取值不那么极端可能是一个值得尝试的方向。
2019年09月07日 09点09分 2
……想办法搞出来了,不过大概还有很大改进空间。参3楼。
2019年09月07日 09点09分
吧务
level 15
……嗬,居然画出来了。
实测发现Stackexchange的帖子《Plotting implicitly-defined space curves》介绍的方法可以避免数值误差造成的“噪点”,不过较为费时。以下代码耗时1600秒:
a1 = ContourPlot3D[{r, r1}, {Z, 0.01, 10}, {p, 0, 1}, {\[Alpha], 1.2, 2.5},
Contours -> {0}, ContourStyle -> Opacity[0], Mesh -> None,
BoundaryStyle -> {1 -> None, 2 -> None, {1, 2} -> {{Green, Tube[.03]}}},
Boxed -> False] // AbsoluteTiming
2019年09月07日 09点09分 3
谢谢大佬!!!我都快忘记这个帖子了。非常感谢!
2019年09月23日 06点09分
我是个新手,可能犯了很多基础错误,正在摸索学习。真的非常感谢解答!
2019年09月23日 06点09分
吧务
level 12
rfun[Z_, p_, \[Alpha]_] := -\[Alpha]^-1 + 0.5 \[Alpha]^-3 +
3.87 \[Alpha]^-6 +
4.95 ((1 - p Piecewise[{{Z, Z <= 1}, {1, Z >= 1}}])/\[Alpha]^3 -
0.000054 Z);
r1fun[Z_, p_, \[Alpha]_] :=
p/(1 - p)^50 -
50*(0.0852 Z/\[Alpha]^3)^49 Exp[50 (-Log[0.00062] - 1)];
r1funLog[Z_, p_, \[Alpha]_] :=
Log[p] - Log[1 - p]*50 - (Log[50] + Log[(0.0852 Z/\[Alpha]^3)]*49 +
50 (-Log[0.00062] - 1));
a1 = ContourPlot3D[
rfun[Exp[logZ], p, \[Alpha]] == 0, {logZ, Log[0.01], Log[10]}, {p,
0, 1}, {\[Alpha], 1.2, 2.5},
MeshFunctions -> {Function[{logZ, p, \[Alpha]},
r1funLog[Exp[logZ], p, \[Alpha]]]},
MeshStyle -> {{Thick, Black}}, Mesh -> {{0}},
ContourStyle -> {None}, BoundaryStyle -> None,
AxesLabel -> {Z, p, \[Alpha]},
Ticks -> {Charting`ScaledTicks[{Log, Exp}], Automatic, Automatic}]
首先只想要交线的话没必要把两个曲面都画出来,画其中一个,把另一个作为MeshFunction能让计算量小很多
然后因为p在0到1之间,所以可以对r1==0移项后等式两边取Log,这样避免出现太极端的数值,对画图有好处
最后指数坐标轴直接用Charting`ScaledTicks,对应的自变量也处理一下就可以了
速度还可以的,在我这不到10s就画出来了
2019年09月08日 01点09分 4
谢谢大佬!!!非常感谢!
2019年09月23日 06点09分
运行出来了,运算非常快。感谢!!!
2019年09月23日 06点09分
1