Linux 的周期函数发生器

发布于 2024-11-06 13:31:55 字数 514 浏览 4 评论 0原文

在我的工作中,我需要文本流形式的数学函数样本。例如,我需要一个程序,它可以在离散时间点生成正弦函数值并将其打印到 stdout 中。然后我需要以某种形式组合这些样本,例如对移动了某个相位的两个样本求和。因此,我可以将我的问题一分为二:

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

  2. 什么程序可以操纵这些流?我了解 awk,但是当我有多个 流作为输入时,我可以使用 awk 做什么?例如,如何计算两个或三个正弦样本的和或乘积?

我使用的是 Debian Linux,并且我更喜欢 Unix 方式,即每个程序只执行简单的任务并且做得很完美,并且单独程序的结果可以由另一个程序组合。

谢谢。

In my work I need samples of mathematical functions in the form of text streams. For example, I need a program which generates values of sine function at discrete time points and prints them into stdout. Then I need to combine these samples in some form, for example sum two samples shifted by some phase. So I can split my question may by two:

  1. Is there a pretty standard way to generate samples of mathematical function, such as sine, with given parameters – frequency, phase, amplitude, time step – in the form of simple text stream with two columns: time and function value? I know that simple script in Perl/Tcl can do this work, but I'd like to know the gereric solution.

  2. What programs can manipulate these streams? I know about awk, but what can I do with awk when I have several streams as an input? For example, how can I make a sum or product of two or three sine samples?

I'm using Debian Linux and I prefer The Unix Way, when each program does only simple task and does it perfectly, and results of separate programs may be combined by another program.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

救星 2024-11-13 13:31:56

您可以使用 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

You can do simple numeric calculations with bc. See the man page. More complicated calculations can be done with octave, which is a free Matlab clone.

For example this calculates the values of an interval:

$ 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

This calculates the sin values:

$ 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

And the join command can be used to join the two files:

$ 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

But it is probably better to stay in Octave for the whole computation:

$ 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
牵你手 2024-11-13 13:31:56

有用的一般文本操作程序:

  • pastejoin (将两个文件合并在一起)
  • combine (对文件中的行执行类似集合的操作)
  • colrm(删除列)
  • 排序(常规排序)
  • sed (搜索和替换以及其他 ed 命令)
  • grep (搜索)
  • awk (一般文本操作)
  • tee(T 字路口。不过如果您需要这个,你可能正在做一些太复杂的事情,应该将其分解。)

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

General text manipulation programs that would be useful:

  • paste or join (Merging two files together)
  • combine (Preform set-like operations on lines in files)
  • colrm (Remove columns)
  • sort (General sorting)
  • sed (Search and replace, and other ed commands)
  • grep (Searching)
  • awk (General text manipulation)
  • tee (A T-junction. Though if you need this you're probably doing something too complex and should break it down.)

I see no problem with using a perl script to generate the values. Using a bc script would of course also be an option.

甜扑 2024-11-13 13:31:56

您查看过 bc 吗?

Did you have a look to bc ?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文