【问题标题】:Periodic function generator for LinuxLinux 的周期函数发生器
【发布时间】:2011-05-12 22:54:00
【问题描述】:

在我的工作中,我需要文本流形式的数学函数样本。例如,我需要一个在离散时间点生成正弦函数值并将它们打印到stdout 的程序。然后我需要以某种形式组合这些样本,例如将两个样本相加。所以我可以将我的问题分成两部分:

  1. 是否有一种非常标准的方法来生成数学函数的样本,例如正弦,具有给定的参数 - 频率、相位、幅度、时间步长 - 以简单文本流的形式有两列:时间和函数值?我知道 Perl/Tcl 中的简单脚本可以完成这项工作,但我想知道通用解决方案。

  2. 哪些程序可以操纵这些流?我知道awk,但是当我有几个 流作为输入时,我可以用awk 做什么?例如,如何对两个或三个正弦样本求和或乘积?

我正在使用 Debian Linux,我更喜欢 Unix 方式,每个程序只完成简单的任务并且完美地完成,并且单独程序的结果可能被另一个程序组合。

谢谢。

【问题讨论】:

    标签: linux generator sample


    【解决方案1】:

    您可以使用bc 进行简单的数值计算。请参阅手册页。更复杂的计算可以使用octave 完成,这是一个免费的 Matlab 克隆。

    例如计算一个区间的值:

    $ octave -q --eval 'printf ("%f\n", [0:0.1:pi/2])'|nl|tee x.txt
     1  0.000000
     2  0.100000
     3  0.200000
     4  0.300000
     5  0.400000
     6  0.500000
     7  0.600000
     8  0.700000
     9  0.800000
    10  0.900000
    11  1.000000
    12  1.100000
    13  1.200000
    14  1.300000
    15  1.400000
    16  1.500000
    

    这会计算 sin 值:

    $ octave -q --eval 'printf ("%f\n", sin([0:0.1:pi/2]))'|nl|tee y.txt
     1  0.000000
     2  0.099833
     3  0.198669
     4  0.295520
     5  0.389418
     6  0.479426
     7  0.564642
     8  0.644218
     9  0.717356
    10  0.783327
    11  0.841471
    12  0.891207
    13  0.932039
    14  0.963558
    15  0.985450
    16  0.997495
    

    join命令可以用来连接两个文件:

    $ join -1 1 -2 1 -o 1.2 2.2 x.txt y.txt 
    0.000000 0.000000
    0.100000 0.099833
    0.200000 0.198669
    0.300000 0.295520
    0.400000 0.389418
    0.500000 0.479426
    0.600000 0.564642
    0.700000 0.644218
    0.800000 0.717356
    0.900000 0.783327
    1.000000 0.841471
    1.100000 0.891207
    1.200000 0.932039
    1.300000 0.963558
    1.400000 0.985450
    1.500000 0.997495
    

    但在整个计算过程中最好留在 Octave 中:

    $ octave -q --eval 'for x = .1:0.1:pi/2 ; printf ("%f %f\n", x, sin(x)); end'
    0.100000 0.099833
    0.200000 0.198669
    0.300000 0.295520
    0.400000 0.389418
    0.500000 0.479426
    0.600000 0.564642
    0.700000 0.644218
    0.800000 0.717356
    0.900000 0.783327
    1.000000 0.841471
    1.100000 0.891207
    1.200000 0.932039
    1.300000 0.963558
    1.400000 0.985450
    1.500000 0.997495
    

    【讨论】:

    • 我想到了八度。我必须以 PDF 格式绘制图表,为此我使用 gnuplot。 Octave 绘图功能是否足够丰富?
    【解决方案2】:

    有用的一般文本处理程序:

    • pastejoin(合并两个文件)
    • combine(对文件中的行进行类似集合的操作)
    • colrm(删除列)
    • sort(一般排序)
    • sed(搜索和替换,以及其他 ed 命令)
    • grep(搜索中)
    • awk(一般文本操作)
    • tee(T 形路口。虽然如果你需要这个,你可能做的事情太复杂了,应该把它分解。)

    我认为使用 perl 脚本生成值没有问题。使用bc 脚本当然也是一种选择。

    【讨论】:

      【解决方案3】:

      你看过bc吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-25
        • 2015-12-08
        • 2020-11-12
        • 1970-01-01
        • 2023-04-10
        • 2014-09-10
        相关资源
        最近更新 更多