答案1
更新
发布的desired picture
原始代码是不是适用,因为所需图片中的横轴可能是对数刻度。另外,随着图片更新,OP 原来放入1/x
第一个坐标和x
第二个坐标的逻辑也有意义了。
修改后的代码图的横轴采用对数刻度。它还使用不等采样间隔(以三部分/循环绘制)来减少内存大小(我的程序在大循环中崩溃)。
我已经使用
METAPOST a user’s manual, John D. Hobby et.al version: 1.999
和MetaPost: A Reference Manual, Peter Grogono, 22 June 2014
来查找函数名称和循环语法。
beginfig(0)
outputformat := "png";
% graphs like this are best plotted with unequal sample distances to reduce
%memory usage and ensure fidelity.
for i=10 step 0.2 until 100:
draw (mlog(1/i), 50*sind(i*180/2))..
(mlog(1/(i+0.2)),50*sind((i+0.2)*180/2));
endfor;
for i=1 step 0.1 until 10:
draw (mlog(1/i), 50*sind(i*180/2))..
(mlog(1/(i+0.1)),50*sind((i+0.1)*180/2));
endfor;
for i=0.1 step 0.1 until 1:
draw (mlog(1/i), 50*sind(i*180/2))..
(mlog(1/(i+0.1)),50*sind((i+0.1)*180/2));
endfor;
endfig;
end
原始答案
免责声明:我不知道 metapost。但是,当您绘制 sin(1/x) 时,不是暗示水平轴是 吗x
?但是您的示例代码1/i
在水平轴的坐标中。我将其更改为i
。类似地,我将 sin 的参数更改为与 成比例,1/i
而不是i
。还sind
以度为单位进行参数。因此可能不需要多余的180
。我添加了一些随机常数以使图形看起来不错;即没有混叠。这是您期望的图片的样子吗?由于1/x
在接近零时增加非常快,因此很难获得比这里显示的更多的周期,除非您以对数轴或其他方式绘制。
beginfig(0)
for i=20 upto 400:
draw (i, 50*sind(1000000/i))..
((i+1),50*sind(1000000/(i+1)));
endfor;
endfig;
end