请教一个作图精度的问题,请大家看看应该怎样修改代码
mathematica吧
全部回复
仅看楼主
level 7
我最近写论文需要画出一个表达式很复杂的函数在区间(0,1)上的图像。我写的代码如下:
Plot[(a^((-2 + a)/(-1 + a)) (-4 + a^(1/(1 - a))) (-2 + a^(1/(1 - a)) + 4 a^(-(a/(-1 + a))) + 2 a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]) (a - a^2 + 4 a^(1/(-1 + a)) - 8 a^(a/(-1 + a)) + 4 a^((-1 + 2 a)/(-1 + a)) + a Log[a]))/((-1 + a)^2 (-3 + a^(1/(1 - a)) + 2 a^(-(a/(-1 + a))) + a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]) (-8 + a + 6 a^(1/(1 - a)) + 16 a^(-(a/(-1 + a))) + 8 a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))] + a^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))])) + (a (-4 + a^(1/(1 - a)))^2 (-2 + a^(1/(1 - a)) + 4 a^(-(a/(-1 + a))) + 2 a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]) (-3 + 2 a^(-(a/(-1 + a))) + (a^(1/(1 - a)) (2 + a) (-1 + a - Log[a]))/(-1 + a)^2 + (a^((1 - 3 a)/(-1 + a)) (4 - 11 a + 4 a^2 + 3 a^3 - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)) + 10 a^((-1 + 2 a)/(-1 + a)) - 6 a^((-2 + 3 a)/(-1 + a)) - 2 a^(1 + (2 a)/(-1 + a)) + a^(2 + (2 a)/(-1 + a)) + (-4 a - 2 a^2 + 2 a^((-1 + 2 a)/(-1 + a))) Log[a]))/((-1 + a)^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))])))/(2 (-3 + a^(1/(1 - a)) + 2 a^(-(a/(-1 + a))) + a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))])^2 (-8 + a + 6 a^(1/(1 - a)) + 16 a^(-(a/(-1 + a))) + 8 a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))] + a^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))])) - (a (-4 + a^(1/(1 - a)))^2 (-2 + 4 a^(-(a/(-1 + a))) + (a^(1/(1 - a)) (4 + a) (-1 + a - Log[a]))/(-1 + a)^2 + (2 a^((1 - 3 a)/(-1 + a)) (4 - 11 a + 4 a^2 + 3 a^3 - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)) + 10 a^((-1 + 2 a)/(-1 + a)) - 6 a^((-2 + 3 a)/(-1 + a)) - 2 a^(1 + (2 a)/(-1 + a)) + a^(2 + (2 a)/(-1 + a)) + (-4 a - 2 a^2 + 2 a^((-1 + 2 a)/(-1 + a))) Log[a]))/((-1 + a)^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))])))/(2 (-3 + a^(1/(1 - a)) + 2 a^(-(a/(-1 + a))) + a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]) (-8 + a + 6 a^(1/(1 - a)) + 16 a^(-(a/(-1 + a))) + 8 a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))] + a^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))])) + (a^2 (-4 + a^(1/(1 - a)))^2 (-2 + a^(1/(1 - a)) + 4 a^(-(a/(-1 + a))) + 2 a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]) (1 - 8/a + 2 a^((1 - 2 a)/(-1 + a)) (8 + 3 a) + 8 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))] + (a^((1 - 3 a)/(-1 + a)) (4 - 11 a + 4 a^2 + 3 a^3 - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)) + 10 a^((-1 + 2 a)/(-1 + a)) - 6 a^((-2 + 3 a)/(-1 + a)) - 2 a^(1 + (2 a)/(-1 + a)) + a^(2 + (2 a)/(-1 + a)) + (-4 a - 2 a^2 + 2 a^((-1 + 2 a)/(-1 + a))) Log[a]))/((-1 + a)^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]) + 1/a (-8 + 16 a^(-(a/(-1 + a))) + (2 a^(1/(1 - a)) (8 + 3 a) (-1 + a - Log[a]))/(-1 + a)^2 + (8 a^((1 - 3 a)/(-1 + a)) (4 - 11 a + 4 a^2 + 3 a^3 - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)) + 10 a^((-1 + 2 a)/(-1 + a)) - 6 a^((-2 + 3 a)/(-1 + a)) - 2 a^(1 + (2 a)/(-1 + a)) + a^(2 + (2 a)/(-1 + a)) + (-4 a - 2 a^2 + 2 a^((-1 + 2 a)/(-1 + a))) Log[a]))/((-1 + a)^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]))))/(2 (-3 + a^(1/(1 - a)) + 2 a^(-(a/(-1 + a))) + a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]) (-8 + a + 6 a^(1/(1 - a)) + 16 a^(-(a/(-1 + a))) + 8 a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))] + a^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))])^2), {a, 0, 1}, AxesOrigin -> {0, 0}, WorkingPrecision -> 1000]。
运行结果如下图所示:
我把精度调到了 “WorkingPrecision -> 1000”,但是做出的函数图像在 a=0 处仍然是不准确的。
这个函数在 a=0 和 a=1 这两点无定义,但是这两点的极限值存在。用mma很容易求出当 a -> 0+ 时,这个函数的极限等于0。所以这个函数在区间(0,1)上的图像应该经过原点,但是图中的函数图像纵截距却是正数,图像没有经过原点。
请问该如何修改代码,才能做出准确的函数图像呢(即图像通过原点)?
2022年03月26日 21点03分 1
level 7
我想了一个办法:用分段函数,直接规定这个函数在 a=0 处的函数值为 0。然后再做出这个分段函数的图像。但是非常奇怪,mma在作图时并没有按照分段函数来画,在0点处的纵截距仍然是正数。我写的代码如下:
pf := Piecewise[{{(a^((-2 + a)/(-1 + a)) (-4 + a^(1/(1 - a))) (-2 + a^(1/(1 - a)) + 4 a^(-(a/(-1 + a))) + 2 a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]) (a - a^2 + 4 a^(1/(-1 + a)) - 8 a^(a/(-1 + a)) + 4 a^((-1 + 2 a)/(-1 + a)) + a Log[a]))/((-1 + a)^2 (-3 + a^(1/(1 - a)) + 2 a^(-(a/(-1 + a))) + a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]) (-8 + a + 6 a^(1/(1 - a)) + 16 a^(-(a/(-1 + a))) + 8 a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))] + a^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))])) + (a (-4 + a^(1/(1 - a)))^2 (-2 + a^(1/(1 - a)) + 4 a^(-(a/(-1 + a))) + 2 a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]) (-3 + 2 a^(-(a/(-1 + a))) + (a^(1/(1 - a)) (2 + a) (-1 + a - Log[a]))/(-1 + a)^2 + (a^((1 - 3 a)/(-1 + a)) (4 - 11 a + 4 a^2 + 3 a^3 - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)) + 10 a^((-1 + 2 a)/(-1 + a)) - 6 a^((-2 + 3 a)/(-1 + a)) - 2 a^(1 + (2 a)/(-1 + a)) + a^(2 + (2 a)/(-1 + a)) + (-4 a - 2 a^2 + 2 a^((-1 + 2 a)/(-1 + a))) Log[a]))/((-1 + a)^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))])))/(2 (-3 + a^(1/(1 - a)) + 2 a^(-(a/(-1 + a))) + a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))])^2 (-8 + a + 6 a^(1/(1 - a)) + 16 a^(-(a/(-1 + a))) + 8 a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))] + a^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))])) - (a (-4 + a^(1/(1 - a)))^2 (-2 + 4 a^(-(a/(-1 + a))) + (a^(1/(1 - a)) (4 + a) (-1 + a - Log[a]))/(-1 + a)^2 + (2 a^((1 - 3 a)/(-1 + a)) (4 - 11 a + 4 a^2 + 3 a^3 - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)) + 10 a^((-1 + 2 a)/(-1 + a)) - 6 a^((-2 + 3 a)/(-1 + a)) - 2 a^(1 + (2 a)/(-1 + a)) + a^(2 + (2 a)/(-1 + a)) + (-4 a - 2 a^2 + 2 a^((-1 + 2 a)/(-1 + a))) Log[a]))/((-1 + a)^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))])))/(2 (-3 + a^(1/(1 - a)) + 2 a^(-(a/(-1 + a))) + a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]) (-8 + a + 6 a^(1/(1 - a)) + 16 a^(-(a/(-1 + a))) + 8 a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))] + a^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))])) + (a^2 (-4 + a^(1/(1 - a)))^2 (-2 + a^(1/(1 - a)) + 4 a^(-(a/(-1 + a))) + 2 a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]) (1 - 8/a + 2 a^((1 - 2 a)/(-1 + a)) (8 + 3 a) + 8 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))] + (a^((1 - 3 a)/(-1 + a)) (4 - 11 a + 4 a^2 + 3 a^3 - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)) + 10 a^((-1 + 2 a)/(-1 + a)) - 6 a^((-2 + 3 a)/(-1 + a)) - 2 a^(1 + (2 a)/(-1 + a)) + a^(2 + (2 a)/(-1 + a)) + (-4 a - 2 a^2 + 2 a^((-1 + 2 a)/(-1 + a))) Log[a]))/((-1 + a)^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]) + 1/a (-8 + 16 a^(-(a/(-1 + a))) + (2 a^(1/(1 - a)) (8 + 3 a) (-1 + a - Log[a]))/(-1 + a)^2 + (8 a^((1 - 3 a)/(-1 + a)) (4 - 11 a + 4 a^2 + 3 a^3 - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)) + 10 a^((-1 + 2 a)/(-1 + a)) - 6 a^((-2 + 3 a)/(-1 + a)) - 2 a^(1 + (2 a)/(-1 + a)) + a^(2 + (2 a)/(-1 + a)) + (-4 a - 2 a^2 + 2 a^((-1 + 2 a)/(-1 + a))) Log[a]))/((-1 + a)^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]))))/(2 (-3 + a^(1/(1 - a)) + 2 a^(-(a/(-1 + a))) + a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))]) (-8 + a + 6 a^(1/(1 - a)) + 16 a^(-(a/(-1 + a))) + 8 a Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))] + a^2 Sqrt[a^(-2 - (2 a)/(-1 + a)) (4 + 2 a - 4 a^(a/(-1 + a)) + a^((2 a)/(-1 + a)))])^2), 0 < a <= 1}, {0, a == 0}}];
Plot[pf, {a, 0, 1}, AxesOrigin -> {0, 0}, WorkingPrecision -> 1000]
请高手看看问题出在哪儿?为何做出来的分段函数的图像仍然不经过原点呢?
2022年03月28日 05点03分 2
吧务
level 13
Plot 虽然带0去算过,但没有使用0去做图,而是使用稍大点的数,估计是为了避开常见特殊值采样。
用 ListLinePlot 比较容易控制,或者用稍大于0的数分段
2022年03月28日 13点03分 3
似乎不是在回避特殊值采样。稍微试了下,貌似不管端点值是啥,Plot取样的时候总会避开那么一点点。
2022年04月01日 16点04分
@xzcyr 我说的不准确。本意就是避开一点点,就能大概率避开特殊值
2022年04月02日 12点04分
吧务
level 12
楼上+1,这个问题用ListLinePlot好一些
然后你这个巨长又不包含特殊函数的a的表达式可以编译一下,计算会快不少
(*fun[a_]:=(a的表达式,太长就不贴了);*)
cf = Inactivate@Compile[{{a, _Real}},
If[0 < a < 1, fun[a],
If[a <= 0,
Limit[fun[x], x -> 0, Direction -> "FromAbove"],
Limit[fun[x], x -> 1, Direction -> "FromBelow"]
]], RuntimeAttributes -> {Listable}] // Activate[#, fun] & //
Activate[#, Limit] & // Activate;
aList = Range[0, 1, 1/5000];
ListLinePlot[{aList, cf[aList]}\[Transpose], AxesOrigin -> {0, 0}]
2022年09月03日 12点09分 4
1