模块 gsl 的近似值或 Asymptote 自己的计算是最好的?

模块 gsl 的近似值或 Asymptote 自己的计算是最好的?

例子:

import graph;
import gsl;
size(12cm,false);
defaultpen(linewidth(.7bp));
real f(real x){return x^2;}
real g(real x){return 2^x;}

draw(graph(f,-1.5,5),red);
draw(graph(g,-1.5,5),blue);

draw(Label("$x$",EndPoint,align=S),(-2,0)--(5,0),Arrow(TeXHead));
draw(Label("$y$",EndPoint,align=W),(0,-3)--(0,g(5)),Arrow(TeXHead));

real margin=.1;
for (int i: new int[]{2,4}){
draw(Label("$"+(string) i+"$",Relative(0)),(i,0)-(0,margin)--(i,0)+(0,margin));
draw(Label("$"+(string) g(i)+"$",Relative(0)),(0,g(i))-(margin,0)--(0,g(i))+(margin,0));
draw((i,0)--(i,g(i))--(0,g(i)),linetype(new real[]{5,5}));
}

pair z[]=intersectionpoints(graph(f,-1.5,5),graph(g,-1.5,5));
arrow(Label(format("$z[0].x=%.50f$",z[0].x)),z[0],dir=dir(-90));
real Lam=-2*Wm1(log(2)/2)/log(2);
arrow(Label(format("$Lambert W=%.50f$",Lam)),z[0],dir=dir(90),.5cm);
dot(z);
label("$0$",0,dir(-135));

在此处输入图片描述

支持:

https://www.wolframalpha.com/input/?i=x%5E2%3D2%5Ex https://stackoverflow.com/questions/8345581/c-printf-a-float-value

问题:

  1. 为什么 Asymptote 会得到两个不同的结果以及最佳近似值是什么?

  2. 虽然%.50f但我的输出只有42逗号后的十进制数字!!你有确切的输出吗?

答案1

我相信gsl这里的结果。通过交叉表示函数图形的两条路径,可以获得渐近线结果。然而,这些路径只是大约函数的图形;希望它们能够精确到人类的视觉,但不能精确到 50 位。如果你想让路径相交结果更准确,你可以尝试类似

pair z[]=intersectionpoints(graph(f,-1.5,5, n=200, Hermite),graph(g,-1.5,5, n=200, Hermite));

并不断增加n以获得更准确的结果(代价是显著增加计算时间)。但该intersectionpoints函数最多使用“机器精度”;假设这意味着 64 位浮点数,您永远不会通过 Asymptote 方法在十进制表示中获得超过 16 位的有效数字。

关于第二个问题:该real类型在底层是 64 位浮点数,这意味着在您的十进制打印输出中,前 16 位数字之后的所有内容都是完全无用的数据。我不确定为什么您会得到 40 位数字;我猜这是“真实”结果的二进制浮点数的精确表示,但这不可能是真的,因为如果是这样的话,最后一位数字将是 5,而不是 4。

相关内容