我想要绘制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文件中的每一行。
你能帮帮我吗?谢谢大家。卢西奥
答案 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。