gnuplot中的karplus方程

时间:2011-06-08 19:33:11

标签: gnuplot equation


我想要绘制karplus等式

f(t)=a*cos(t+o)**2 + b*cos(t+o) + c 

使用gnuplot获取a,b,c,o值的不同值。特别是参数a,b,c,o具有表格形式(在文件data.dat中):

a b c o
1 2 3 60
4 5 6 180
-3 -5 -9 -120

和t的范围是

-180 to 180

表示data.dat文件中的每一行。

你能帮帮我吗?谢谢大家。

卢西奥

3 个答案:

答案 0 :(得分:3)

AFAIK由于绘图命令可以 采用函数绘制数据文件:

plot {<ranges>}
     {<iteration>}
     {<function> | {"<datafile>" {datafile-modifiers}}}
     {axes <axes>} {<title-spec>} {with <style>}
     {, {definitions{,}} <function> ...}

因此,您必须创建一个数据文件,其中列出了您的t和功能值,以便绘制gnuplot。另一种解决方法,如果您只有有限数量的karplus函数来绘制可能会有用:

set angles degrees
set xrange [-180:180]

f(x, a, b, c, o) = a*cos(x+o)**2 + b*cos(x+o) + c
title(n) = sprintf("f_%d", n)

plot a = 1 b = 2 c = 3 o = 60 f(x, a, b, c, o) t title(1), \
     a = 4 b = 5 c = 6 o = 180 f(x, a, b, c, o) t title(2), \
     a = -3 b = -5 c = -9 o = -120 f(x, a, b, c, o) t title(3)

现在直接指定参数并相应地绘制函​​数。

或者你可以实现这样的迭代:

plot for [a = 1:10:2] b = 2 c = 3 o = 60 f(x, a, b, c, o) t title(a)

不幸的是,在gnuplot中嵌套迭代是不可能的,所以你必须应对只有一个参数变化。

答案 1 :(得分:1)

如果您的第一列是“t”(而“a”是您的第二列等),您可以这样做:

plot "data.dat" u 1:($2*cos($1+$5)+$3*cos($1+$5)+$4)

请注意结肠后面的parens。

答案 2 :(得分:1)

据我所知,不可能。我在这种情况下做的是编写一个小脚本来生成我需要的绘图命令。例如,使用awk

#! /usr/bin/env awk -f 

BEGIN {
    printf("plot ")
}

NR > 1 {
    printf(" ,\\\n     ")
}

{ 
    printf("(%s) * cos(t+(%s))**2 + (%s) * cos(t+(%s)) + (%s)", $1, $4, $2, $4, $3)  
}

END {
    printf("\n")
}

将其另存为文件karplus并使其可执行。然后./karplus < data.dat创建您需要的绘图命令。根据您的需要,可能会有一个小的makefile。